@kotlin_lang

Страница 945 из 982
Mikhail
12.10.2018
16:05:52
Это же на схему

Alexander
12.10.2018
16:05:56
тогда придётся выделять промежуточные объекты...
Зачем? Это один раз делается. Создается один дескриптор на тип

Quantum Harmonizer
12.10.2018
16:06:01
Это же на схему
и на возврат результата

Mikhail
12.10.2018
16:06:08
А не на каждый объект

Google
Alexander
12.10.2018
16:07:14
Но можно в принципе и без этого обойтись. В любом слуае на каждый тип объекта должен быть генератор. Этот генератор и есть схема.

Я просто что-то подобное сделал. Меня правда производительность не волнует, поэтому замарочки совсем другие.

Quantum Harmonizer
12.10.2018
16:08:50
Вот на одной стороне есть { name: String, age: int }, на другой — {"name": "Vasya", "age": 100500}. Как передать схему — понятно. Как назад передать результат?

Alexander
12.10.2018
16:09:15
Опять вам тайп классов не хватает ?
Не нужны тут тайп классы никакие.

Алексей
12.10.2018
16:09:20
Я написал такую функцию с корутиной override suspend fun retrieveListOfParentRubrics() = GlobalScope.async(Dispatchers.IO) { var list = dao.selectAllParentRubrics() if (list != null) { list = apiService.retriveRubrics().await().body()!!.response dao.insertAllRubrics(list) } list } В этой корутине я хочу получить Deferred<List<Rubric>> (var list). Сначала я делаю запрос из бд и если ничего не приходит из, до я делаю запрос в сеть и кэширую в рубрики в базу данных. В нижней строчке я написал list, чтобы он вернулся обернутым в deferred? скажите это list вернутся и как в котлине определяется что возвращать из asyncа?

Alexander
12.10.2018
16:10:01
А если есть генерация, то по схеме создается класс генератор. Управление не со стороны jsona делается.

Quantum Harmonizer
12.10.2018
16:10:39
Куда передать?
в одну сторону нужно передать схему, в другую — распарсенные по ней данные

Google
Mikhail
12.10.2018
16:11:06
Quantum Harmonizer
12.10.2018
16:11:23
Ну так данные же тоже должны быть в каком-то виде?
Вот. При этом не допускается выделять временные объекты.

Иначе вопос был бы уже решён)

Mikhail
12.10.2018
16:11:37
У тебя получается схема и несколько конвертеров: в Json, в бд во внутреннее представление

Т.е. рекурсивная структура и много катаморфизмов

Alexander
12.10.2018
16:12:13
Я не понимаю, в чем проблема. Есть класс генератор, который умеет считываеть из структуры поля по имени и распихивать их по полочкам в объекте. Он создается один раз.

Mikhail
12.10.2018
16:12:35
Вот в этой бы задачке отоично зашел паттерн матчинг

Alexander
12.10.2018
16:12:40
У тебя получается схема и несколько конвертеров: в Json, в бд во внутреннее представление
Не хочет он внутреннего представления, у него душа от него болит.

dimiii
12.10.2018
16:13:10
Свободу Монаде!

Alexander
12.10.2018
16:13:27
...но только сам объект знает, как в себя совать данные.
Вот это и есть слоабое место. Не может объект сам знать как себя генерировать, если только он не является какиим-то супер специальным

Всегда есть какая-то явная или неявная фабрика. Все попытки сделать самогенерирующиеся объекты сползают в рефлексию

Alexey
12.10.2018
16:14:55
Вот это и есть слоабое место. Не может объект сам знать как себя генерировать, если только он не является какиим-то супер специальным
Я так и не понял почему не сделать третью сущность которая знает как распихать данные из A в B ?

Mikhail
12.10.2018
16:15:08
Без промежуточных объектов в качестве медиатора будет комбинаторный взрыв

Поэтому нужно промежуточное представление, чтобы на каждый формат было 2 конвертера (в и из) а не 2n, где n - колво форматов

Quantum Harmonizer
12.10.2018
16:16:44
ой всё, я уже придумал, как сделать нормально :)

Alexander
12.10.2018
16:17:00
Или сделать промежуточное представление виртуальным, когда это просто обертка над исходной стукрутрой.

dimiii
12.10.2018
16:17:02
И записал на полях?

Google
Quantum Harmonizer
12.10.2018
16:17:36
И записал на полях?
и приду выё... хвастаться на выходных

Quantum Harmonizer
12.10.2018
16:20:48
Кались давай
Парсер раскладывает значения в массив, а DTO присваивает его себе, т. к. внутри себя там всё равно массив.

Quantum Harmonizer
12.10.2018
16:21:43
единственная проблема — если парсер оставит массив себе и будет мутировать его по беспределу, но это упоротый случай

Звучит как промежуточный объект
нет, подому что мои DTO внутри себя — массив

А что делать с тем что порядок полей в json не гарантирован?
мы передаём парсеру схему, а он отвечает за то, чтобы сохранить порядок, в ней указанный

Alexander
12.10.2018
16:44:27
На гаризонте показались стройные ряды граблей.

Quantum Harmonizer
12.10.2018
16:55:31
порядок полей в джсоне? нуну)
Распарсил значение — положил в ячейку массива, соответствующую полю. Какие проблемы, когда схема известна?

Nameless
12.10.2018
16:56:11
Распарсил значение — положил в ячейку массива, соответствующую полю. Какие проблемы, когда схема известна?
главное что бы не было такого что джсон пришел с полями в неправльном порядке и парсер помер

это я так мимо проходил

Nameless
12.10.2018
16:56:48
гуд

Quantum Harmonizer
12.10.2018
16:57:17
А почему не карта?
Потому что схема заранее известна.

Alexander
12.10.2018
16:57:55
И? Карта гарантирует, что не будет нарушений и поломок

Google
Alexander
12.10.2018
16:58:50
Разница только в том, что в массиве ключи целые, а в карте строки

Quantum Harmonizer
12.10.2018
16:59:20
Разница только в том, что в массиве ключи целые, а в карте строки
да, а ещё потребление памяти и скорость доступа

Alexander
12.10.2018
17:00:45
Ну если это совсем performance botleneck, то я готов согласиться. Правда парсинг строк в JSON все равно будет сильно дороже

Ivan
12.10.2018
17:03:04
https://github.com/JetBrains/kotlin-native/releases/tag/v1.0 внезапно
Чёёёёё?!!!! И прям уже можно пользоваться?

Т.е. Это прям первая версия?

Quantum Harmonizer
12.10.2018
17:03:31
Ну если это совсем performance botleneck, то я готов согласиться. Правда парсинг строк в JSON все равно будет сильно дороже
Правило Android-разработки #54: всё равно будет тормозить. Нет, просто в моей ситуации нет никакого смысла лишний раз обмениваться ключами.

Admin
ERROR: S client not available

Ivan
12.10.2018
17:03:44
Апи зафиксировали и т.п.?

Alexander
12.10.2018
17:04:42
Правило Android-разработки #54: всё равно будет тормозить. Нет, просто в моей ситуации нет никакого смысла лишний раз обмениваться ключами.
На самом деле это ровно то самое промежуточное представление, о котором говорили, просто ключи вынесены в схему.

Alexandr
12.10.2018
18:33:10
Многое пропустил, jsonschema чем не угодила?

Alexander
12.10.2018
18:37:46
Ему надо напрямую из JSON штампавать дата объекты с экономией на байтах и запятых

Bogdan
12.10.2018
18:38:08
Многое пропустил, jsonschema чем не угодила?
я так понял нужен не JSON, а +- похожие на него

Alexander
12.10.2018
18:38:55
Любая древесная фиговина

Alexandr
12.10.2018
18:39:27
Кстати по ходу обсуждений частенько закладывается мысль что речь о jibx) особенно если речь о xml)

Кто не в курсе, он генерит не только pojo по схеме, но и генерит в классе метод разбора xml на текущий класс

Производительность огонь, без рефлексии, но вроде заброшен был. Наш соотечественник писал

Quantum Harmonizer
12.10.2018
19:11:35
Многое пропустил, jsonschema чем не угодила?
Дак это же способ валидировать джейсон? Мне не это нужно.

Google
Andrew
12.10.2018
19:27:14
Я написал такую функцию с корутиной override suspend fun retrieveListOfParentRubrics() = GlobalScope.async(Dispatchers.IO) { var list = dao.selectAllParentRubrics() if (list != null) { list = apiService.retriveRubrics().await().body()!!.response dao.insertAllRubrics(list) } list } В этой корутине я хочу получить Deferred<List<Rubric>> (var list). Сначала я делаю запрос из бд и если ничего не приходит из, до я делаю запрос в сеть и кэширую в рубрики в базу данных. В нижней строчке я написал list, чтобы он вернулся обернутым в deferred? скажите это list вернутся и как в котлине определяется что возвращать из asyncа?
Всё правильно, последнее выражение в лямбде, переданной async, "выпадет" в .await(). Единственное — если у вас всё тело функции завёрнуто в async { ... } и возвращает Deferred<...>, то нет смысла саму функцию делать suspend. suspend-функции сами обещают вернуть конечный результат не сразу, вы фактически тут получаете "обещание обещания". Либо suspend fun retrieve(): RetType = withContext(...) { ... } (возможно, это чуть иначе делается с оглядкой на structured concurrency), либо fun retrieve(): Deferred<RetType> = async { ... }. Но если есть возможность поставить suspend, то первый вариант каноничнее (исключение — методы, торчащие как внешнее API, если есть нужда интеропиться с джавой).

Алексей
13.10.2018
02:03:10
Обнаружил, что в non-inline функциях можно в предложенных вариантах увидеть InlineOnly функции Пример: fun main(args: Array<String>) { sin(3.14) }

я просто не знаю, куда это репортить

К слову, IDEA не ругается на это дело и ошибка только при компиляции появляется

Алексей
13.10.2018
02:53:18
ок

Alexandr
13.10.2018
04:04:23
Дак это же способ валидировать джейсон? Мне не это нужно.
Не только, по нему еще можно генерить DTO например

Mikhail
13.10.2018
07:10:42
Не только, по нему еще можно генерить DTO например
Человек хочет без кодогенерации

С кодогенерацией все можно

Алексей
13.10.2018
07:30:40
странный пример, ничео не понял по нему
sin - это inline fun, помеченная аннотацией @InlineOnly

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

Алексей
13.10.2018
07:32:15
Bogdan
13.10.2018
07:32:30
Mi
13.10.2018
07:32:50
И? Так половина функций в стдлибе помечена

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