@scala_ru

Страница 318 из 1499
Daniel
15.12.2016
11:59:36
недавно обнаружил, что extensible records из шейплеза удобно использовать для DTOх

?Ivan
15.12.2016
11:59:41
Grigory
15.12.2016
11:59:59
пишется все; иначе эклипс убьет :D)

Google
Daniel
15.12.2016
12:00:26
https://github.com/danslapman/shapeless-play-json

Denis
15.12.2016
12:00:29
Grigory
15.12.2016
12:01:02
Denis
15.12.2016
12:01:33
тесты нужны там где не могут типы

Aleksei
15.12.2016
12:01:39
У нас много легаси скалаз и позиция сто "работает - не трожь" =) поэтому без тестов просто страшно

?Ivan
15.12.2016
12:01:51
тесты нужны для бизнес логики
а можно какой-нить пример. Я просто из среды, где тесты вообще ни пишутся ? Иногда себя заставляю их писать, но зачастую надо хуяк-хуяк и в продакшн.

Denis
15.12.2016
12:02:22
ну надо тестить инварианты агрегатов например

Denis
15.12.2016
12:02:43
что такая то команда при наличии таких то событий в истории имеет такой то исход

https://github.com/danslapman/shapeless-play-json
А чем это проще/удобнее кейс классов ?

расширяемостью полей?

возможность динамического response entity?

Daniel
15.12.2016
12:06:48
@notxcain опишу свой кейс: есть доменные объекты в базе и есть разные версии API, в которых набор полей НЕМНОГО отличается от версии к версии. Раньше приходилось делать MyAwesomeObjectV100500Dto, а теперь просто делаю record из доменного объекта, дописываю нужные поля и вуаля

Google
Denis
15.12.2016
12:07:53
а ну то есть типа domainObject.toRecord ++ customFields

Daniel
15.12.2016
12:08:02
да

Viacheslav
15.12.2016
12:08:22
чота так себе профит

килограмм абстракции за мелкую фичу

Daniel
15.12.2016
12:08:53
да не особо то и килограмм

Denis
15.12.2016
12:09:15
ну есть второй вариант, объявлять DTO100500 плюс кастомные конвертеры через Generic

Daniel
15.12.2016
12:09:44
основная боль была в немеряном количестве DTO классов

Denis
15.12.2016
12:10:05
ну ты ведь все равно делаешь type Dtp100500 = ?

или нет?

Daniel
15.12.2016
12:10:16
нет, не делаю

Viacheslav
15.12.2016
12:10:33
а как у тебя итоговое дто то получается?

Dmitry
15.12.2016
12:10:51
ну как я понимаю тупо хардкод на месте

Viacheslav
15.12.2016
12:10:57
всё равно результат - это 10500 дто? или как?

Vladimir
15.12.2016
12:11:02
нет, не делаю
а поля добавляются только опциональные при этом или любые?

Daniel
15.12.2016
12:12:00
тип итогового dto получается ad-hoc Hlist с чем-то там и его сжирает мой сериализатор

Viacheslav
15.12.2016
12:12:14
Daniel
15.12.2016
12:12:22
у меня вообще нигде теперь типы dto явно не объявленыъ

хардкод на месте, да

Viacheslav
15.12.2016
12:12:50
у меня вообще нигде теперь типы dto явно не объявленыъ
сами дто ведь написаны где-то? или они по волшебству или кодогенерацией делаются?

Google
Denis
15.12.2016
12:13:06
описаны типами

Viacheslav
15.12.2016
12:13:22
описаны типами
пример можно?

С чего ты взял?
ну я наивный московский парень

Denis
15.12.2016
12:13:35
выше была ссылка на ГХ

когда вмерджавт в 2.12 синглтон тайпс будет праздник для этого

Daniel
15.12.2016
12:14:16
типы нужно явно описывать только для десериализации

для сериализации явный тип не нужен, его компилятор выведен и ок

код получается такой: val gen = LabelledGeneric[DomainObject] val entity = db.getEntity(...) val entiryRecord = gen.to(entity) val dto = entityRecord + ('awesomeProperty ->> 42) Json.toJson(dto)

Mikhail
15.12.2016
12:16:44
какая часть спеки скалы позволяет написать подобное перечисление? type Book = Record.'author -> String, 'title -> String, 'id -> Int, 'price -> Double.T

Daniel
15.12.2016
12:17:12
это из shapeless

Denis
15.12.2016
12:17:17
но блин иметь такое в роутере это не круто

Daniel
15.12.2016
12:18:18
это можно в сервисе делать, а не в самом роутере

Denis
15.12.2016
12:18:34
а если делать в сервисе то return type какой?

прям весь F[Record.'author -> String, 'title -> String, 'id -> Int, 'price -> Double.T] ?

Daniel
15.12.2016
12:19:24
вроде того

явно в таком случае типы указывать - себе дороже, сигнатура километровая получится

Viacheslav
15.12.2016
12:20:32
Нооорм)

Daniel
15.12.2016
12:20:39
только вот это Record.'author -> String, 'title -> String, 'id -> Int, 'price -> Double.T - это макро-синтаксис, в реале тип выглядит страшнее

Google
Daniel
15.12.2016
12:21:23
и самое приятное - это сериализуется примерно в 2 раза быстрее, чем кейс-класс с помощью Json.format

бенчмарк могу показать

если что, у меня там есть ещё либа для записи рекордов в reactivemongo

Mikhail
15.12.2016
12:23:17
object Record extends Dynamic { def applyDynamic(method: String)(rec: Any*): HList = macro RecordMacros.mkRecordEmptyImpl def applyDynamicNamed(method: String)(rec: Any*): HList = macro RecordMacros.mkRecordNamedImpl def selectDynamic(tpeSelector: String): Any = macro LabelledMacros.recordTypeImpl } вон оно че

теперь все ясно)

Daniel
15.12.2016
12:24:16
ага, именно

Mikhail
15.12.2016
12:33:50
для интересующихся идем сначало сюда http://www.scala-lang.org/api/2.12.0/scala/Dynamic.html понимаем что "Record.'author -> String, 'title -> String, 'id -> Int, 'price -> Double.T" преобразовывается обычным компилятором в Record.applyDynamicNamed("apply" (поскольку по дефолту), Seq('author -> String, 'title -> String )) и дальше уже работает макрос по обычным правилам без магии) а то меня вначале именно этот синтаксис смутил) Дэн, я в ведь ничего не напутал? )

Denis
15.12.2016
12:45:44
есть у кого free algebra для работы с тикетам в джире под рукой? )))

Andrey
15.12.2016
12:49:41
тоже надо))

Admin
ERROR: S client not available

Mikhail
15.12.2016
13:04:56
не, я похоже напутал. selectDynamic похоже все таки вызывается

Alexey
15.12.2016
13:07:16
Nikolay
15.12.2016
13:14:05
https://github.com/danslapman/shapeless-play-json
Да, для поддержки разных версий api - нормальный вариант

а что именно поменяется в записи когда выкатят singleton types?

Mikhail
15.12.2016
13:21:08
"author -> String, 'title -> String, 'id -> Int, 'price -> Double" - эта часть передается в макро как строка. ручками примитивно бьется по запяточке, потом на пары и дальше по сценарию. т.е. введение искусственного синтаксиса в итоге, который хоть в итоге и компилится в компайл тайм - но все же искусственная добавка.

Daniel
15.12.2016
13:21:31
тип сейчас: ::[labelled.FieldType[SingletonOps#T, String], ::[labelled.FieldType[SingletonOps#T, String], ::[labelled.FieldType[SingletonOps#T, Int], ::[labelled.FieldType[SingletonOps#T, Double], HNil]]]] после того, как смержат: "author" ->> String :: "title" ->> String :: "id" ->> Int :: "price" ->> Double :: HNil

Mikhail
15.12.2016
13:21:53
таким макаром можно и json добавить в скалу в компайл тайм

Nikolay
15.12.2016
13:22:45
таким макаром можно и json добавить в скалу в компайл тайм
ну json то редко бывает статическое значение

Mikhail
15.12.2016
13:23:27
ну я скорее другое имел ввиду. просто иногда не хватает инициализации обьекта как в яваскрипте)

но конечно автокомплит идет лесом при таких свистоплясках, в том числе и в "author -> String, 'title -> String, 'id -> Int, 'price -> Double" и узнаешь только при компиляции, а это уже вполне серьезный камень в огород удобства

Google
Mikhail
15.12.2016
13:24:32
лично для меня)

Daniel
15.12.2016
13:25:19
автокомплит - да, но в моём случае это не принципиально, потому что эти объекты нужны только чтобы в json из запихать

хотя в новом проекте пробую и в базе их хранить, пока норм

идея, конечно, охреневает с таких дел

Mikhail
15.12.2016
13:26:35
ну я просто в слух набросал чуть подробнее как это работает для тех кому интересно, но лень или не умеют)

в идее наверное нет никакого способа дебаг включить для макро? а то трейсить по старинке конечно не фонтан чтобы некоторые ответы получить(

Denis
15.12.2016
13:48:11
я дебажу макросы принтлнами

ну и macro expansion

советую перкулючить канал обновления на nightly

вполне сносно

Mikhail
15.12.2016
13:50:58
а макро expansion откуда поставить?

Denis
15.12.2016
13:55:51
а мы про новые макросы говорим или старые:

?

Mikhail
15.12.2016
13:56:49
не знаю, я их только время от времени трогаю - сейчас вот эти с рекордом просто ковырял. какую ссылку для найтли билдс репо указать? а то что-то первая не заработала которую нашел

Denis
15.12.2016
13:57:36
те что в shapeless это старые макросы, для них нету expansions AFAIK

Mikhail
15.12.2016
13:58:17
ну вот( ну для новых тогда включу, все равно ковыряться буду)

Alex
15.12.2016
13:58:35
а вот скажите чо, 2.12 уже вроде как полтора месяца вышла

она нормич? :)

Mikhail
15.12.2016
13:59:01
я еще на 2.12.0-М5 пользовал - мне нормально было

Alex
15.12.2016
13:59:16
вроде ж были там какие то регрессии со временем компиляции и прочее

Mikhail
15.12.2016
13:59:32
а вот под 2.12.0 буквально на днях только многие либы удосужились сборки запаблишить)

Alex
15.12.2016
13:59:35
ну и экосистема непонятно насколько подтянулась

Страница 318 из 1499