@kotlin_lang

Страница 970 из 982
Vladimir
23.10.2018
12:18:43
Объявляю структуру в специальном объекте, который описывает поля джейсона.
Это удобно? Я так понял, любая операция с объектом выглядит примерно как json.get(fieldDescriptor)?

Alexandr
23.10.2018
12:20:11
Я так на Java делал. Устал писать этот однообразный бойлерплейт.
ObjectMapper то чем не угодил? никакого бойлерплейта....

Google
Andrey
23.10.2018
12:21:00
да ладно? даже если код генерится?
Даже если код генерится. Генерящийся код всё равно строго специфицирован и так же проходит проверку времени компиляции.

Vladimir
23.10.2018
12:21:26
ObjectMapper то чем не угодил? никакого бойлерплейта....
Аннотации же. Я сейчас им обычно и пользуюсь.

Quantum Harmonizer
23.10.2018
12:21:27
Это удобно? Я так понял, любая операция с объектом выглядит примерно как json.get(fieldDescriptor)?
Нет, не так. Объявляется структура: object User { val Name = "name" let string val Surname = "surname" let string } создаётся объект, который вычитывает поля через обобщённый интерфейс: val user = StructSnapshot(User, JsonDataSource(JsonReader(json))) доступ: val name = user[User.Name]

Alexandr
23.10.2018
12:21:38
jibx в руки фанатам такого подхода

Andrey
23.10.2018
12:22:15
Если уж совсем честно разобраться, любой компилятор генерирует из кода на одном языке код на другом.

Alexandr
23.10.2018
12:23:06
жалко помер https://github.com/jibx/jibx

Kirill
23.10.2018
12:24:09
Quantum Harmonizer
23.10.2018
12:24:22
еще чуть чуть докрутить и будут линзы
где про них внятно почитать?

Google
Andrey
23.10.2018
12:25:15
jibx в руки фанатам такого подхода
Вы так говорите jibx, будто в этом есть что-то плохое. Поясните, чем оно вам так не угодило? Какую боль от использования ощутили? Почему зареклись использовать до такой степени, что аж фанатам в руки предлагаете?

Alexey
23.10.2018
12:28:15
У нас тайпклассы

Как раз в scala уже давно разделили dto и описания для сериализации/десириализации

Quantum Harmonizer
23.10.2018
12:30:17
Вообще, работать с JsonObject'ами — метод, по отстойности перегоняющий рефлексию.

Kirill
23.10.2018
12:31:15
где про них внятно почитать?
Ну вот нагуглилось вроде https://medium.com/@dtipson/functional-lenses-d1aba9e52254

Vladimir
23.10.2018
12:32:05
Quantum Harmonizer
23.10.2018
12:32:41
В малых масштабах вполне норм, как по мне
Какие плюсы в сравнении хоть с чем-нибудь?

Alexey
23.10.2018
12:32:58
Можно примеры?
Ну мы пишем условно вот так: case class Foo(bar: Int, baz: String) object Foo { implicit val fooReader: JsonReader[Foo] = jsonReader[Foo] // тут макросы, но можно и руками implicit val fooReader: JsonWriter[Foo] = jsonWriter[Foo] } либо эквивалентную запись @derive(jsonReader, jsonWriter) case class Foo(bar: Int, baz: String)

Alexey
23.10.2018
12:33:26
А потом в коде что то вроде someJsonString.jsonAs[Foo]

Egor
23.10.2018
12:33:26
*прилетел*

https://arrow-kt.io/docs/optics/lens/

*улетел*

Alexey
23.10.2018
12:33:41
а, ясно, compile-time reflection :)
Ну говорю же можно и руками)

Quantum Harmonizer
23.10.2018
12:33:51
Alexey
23.10.2018
12:34:16
Главное что это уже давно разделено, котлеты отдельны мухи отдельно - типы отдельны описания отдельно

Quantum Harmonizer
23.10.2018
12:34:49
риальне у меня линзы получились, забавно

Andrey
23.10.2018
12:35:07
а, ясно, compile-time reflection :)
compile time reflection - оксюморон. In computer science, reflection is the ability of a computer program to examine, introspect, and modify its own structure and behavior at runtime. https://en.wikipedia.org/wiki/Reflection_(computer_programming)

Google
Andrey
23.10.2018
12:36:38
Alexey
23.10.2018
12:36:55
В скалке

Vladimir
23.10.2018
12:36:57
Какие плюсы в сравнении хоть с чем-нибудь?
Не готов спорить на эту тему, лично мне так бывает удобнее. Например, состряпать JSON в тестах.

Quantum Harmonizer
23.10.2018
12:38:24
Не готов спорить на эту тему, лично мне так бывает удобнее. Например, состряпать JSON в тестах.
Дак я и не предлагаю спорить. Я вижу минусы: уродливый API и феерическое потребление памяти. Вот и интересуюсь плюсами. Про тесты аргумент принял — согласен. это может быть удобнее, чем объявлять отдельные классы.

Andrey
23.10.2018
12:39:08
В скалке
Ну вообще compile time reflection - это code instrumentation. Работа с AST средствами языка на этапе компиляции (макросы всякие и иже с ним)

Roman
23.10.2018
12:39:17
Вообще, работать с JsonObject'ами — метод, по отстойности перегоняющий рефлексию.
А есть какие-либо решения, чтобы не работать с JsonObject, если прилетает жсон определенной структуры, но имя объектов динамическое?

Andrey
23.10.2018
12:40:33
о них и речь
Ну reflection - это другое. Это работа с мета информацией о типах в рантайме

Den
23.10.2018
12:40:49
У вас тут можно мпрашивать вопросы по разработке под андроид?

Andrey
23.10.2018
12:42:17
Quantum Harmonizer
23.10.2018
12:42:52
Vladimir
23.10.2018
12:43:10
Так JSON и есть словарь (Map). Какой у него ещё API может быть?
Люди, пишущие на Java, привыкли к статически типизированным объектам и зачастую натягивают JSON на них, ибо удобнее.

Egor
23.10.2018
12:43:20
Или лист. Или стринг. Или Number.
Унифицированно - все равно Map

Quantum Harmonizer
23.10.2018
12:43:42
Унифицированно - все равно Map
Валидный JSON: "wtf". Где здесь Map?

Google
Andrey
23.10.2018
12:44:16
Или лист. Или стринг. Или Number.
Ок. data Json = List | String | Number | {"<key_name>": Json,... }

Quantum Harmonizer
23.10.2018
12:44:56
и ещё Boolean и null, но не суть

Egor
23.10.2018
12:45:21
Валидный JSON: "wtf". Где здесь Map?
Тоже верно. С другой стороны, найдите человека, который юзает джсон, чтобы гонять по одной строке

Quantum Harmonizer
23.10.2018
12:46:13
Egor
23.10.2018
12:46:39
["wtf", "foo"] - тоже валидный JSON и тоже не объект
А вот массивы - это уже частный случай мап

По-моему, есть даже парсеры, которые умеют json-массивы перекидывать в мапы вида {1:"...", 2:"..."}

Andrey
23.10.2018
12:47:36
А вот массивы - это уже частный случай мап
Ну так-то да. Массивы можно рассматривать, как Map с целыми, идущими подряд ключами

Vladimir
23.10.2018
12:47:53
в корне примитивы встречаются редко, а массивы — вполне
Массив в корне - плохая идея. Если это API, сильно ограничивает гибкость.

Quantum Harmonizer
23.10.2018
12:48:45
Массив в корне - плохая идея. Если это API, сильно ограничивает гибкость.
Заворачивать всё в объект — плохая идея. На фронтах лепят страшные костыли чтобы разворачивать.

Konstantin
23.10.2018
12:49:03
откуда инфа

Egor
23.10.2018
12:50:15
откуда инфа
от фронтов, лол Сколько проектов не видел, везде есть что-то типа data class SomethingResponse { @Json("result") val result: List<SomeObject> }

Quantum Harmonizer
23.10.2018
12:50:31
Egor
23.10.2018
12:50:45
Потому что приходит пресловутый объект { "result": [ ... ] }

Vladimir
23.10.2018
12:51:15
Не вижу ничего костыльного. Завтра там появится ещё одно поле, и обёртка уже не будет выглядеть вырожденной.

Konstantin
23.10.2018
12:51:20
да это жостка. массив в корне json = норма

завернуть респонз апишки в конверт с метаинфой = норма

Google
Konstantin
23.10.2018
12:51:46
передать метаинфу в заголовках = норма

остальное от лукавого

Vladimir
23.10.2018
12:52:27
добавляешь поле — делай новый эндпоинт
На ровном месте так усложнять совместимость? Мне не кажется это целесообразным.

Konstantin
23.10.2018
12:52:29
добавляешь поле — делай новый эндпоинт
инфа о версионировании апишки в заголовке, не благодари )

Quantum Harmonizer
23.10.2018
12:53:37
Vladimir
23.10.2018
12:54:58
Это не ровное место, а изменение return type.
Ну так чтобы его не менять, а расширять лучше и возвращать объект изначально. А в Java ещё и будет меньше заморочек с дженериками при использовании всяких мапперов, в качестве бонуса.

Vladimir
23.10.2018
12:56:17
Так и из методов возвращай тогда Object или Map<String, *>
Попахивает JS. И тогда в приложении не будет ни одного места, где нормально описан формат ответа.

Quantum Harmonizer
23.10.2018
12:56:53
Попахивает JS. И тогда в приложении не будет ни одного места, где нормально описан формат ответа.
Примерно к этому я клоню. (JSON не может не попахивать JS, но всегда можно сделать ещё хуже)

Vladimir
23.10.2018
12:56:53
добавляешь поле — делай новый эндпоинт
Вот есть у меня /api/v1/results. Как называть новый endpoint, v2? И так на каждое подобное изменение?

Quantum Harmonizer
23.10.2018
12:57:15
Konstantin
23.10.2018
12:57:24
Вот есть у меня /api/v1/results. Как называть новый endpoint, v2? И так на каждое подобное изменение?
добавление новых полей это обратно совместимая хрень. а удаление уже нет

Quantum Harmonizer
23.10.2018
12:57:35
есть вообще отличная практика запрашивать на стороне клиента список требуемых полей

Vladimir
23.10.2018
12:58:00
Примерно к этому я клоню. (JSON не может не попахивать JS, но всегда можно сделать ещё хуже)
API всегда можно описать и натянуть на DTO, тогда JS не будет пахнуть

Quantum Harmonizer
23.10.2018
12:58:19
Egor
23.10.2018
12:58:19
есть вообще отличная практика запрашивать на стороне клиента список требуемых полей
Как, в реальном мире чтоли? Да нет, не работает такая практика

Quantum Harmonizer
23.10.2018
12:58:40
Vladimir
23.10.2018
12:58:50
а ты предлагаешь натянуть на Map<String, *>
Ну вообще-то нет. Как раз таки на FooResponse

Страница 970 из 982