
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

Mikhail
12.10.2018
16:06:25

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

Alexey
12.10.2018
16:08:20

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а?

Mikhail
12.10.2018
16:09:40

Alexey
12.10.2018
16:09:56

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

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

Google

Mikhail
12.10.2018
16:11:06

Alexander
12.10.2018
16:11:18

Quantum Harmonizer
12.10.2018
16:11:23
Иначе вопос был бы уже решён)

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

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

Quantum Harmonizer
12.10.2018
16:12:34

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

Alexander
12.10.2018
16:12:40

Quantum Harmonizer
12.10.2018
16:12:45

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

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

Alexey
12.10.2018
16:14:55

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

Mikhail
12.10.2018
16:19:40

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

Mikhail
12.10.2018
16:21:29

Alexey
12.10.2018
16:21:31

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

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

Nameless
12.10.2018
16:54:50

Quantum Harmonizer
12.10.2018
16:55:31

Nameless
12.10.2018
16:56:11
это я так мимо проходил

Quantum Harmonizer
12.10.2018
16:56:39

Nameless
12.10.2018
16:56:48
гуд

Alexander
12.10.2018
16:56:54

Quantum Harmonizer
12.10.2018
16:57:17

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

Quantum Harmonizer
12.10.2018
16:58:28

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
Т.е. Это прям первая версия?

Quantum Harmonizer
12.10.2018
17:03:31

Admin
ERROR: S client not available

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

Konstantine
12.10.2018
17:03:50

Vladislav
12.10.2018
17:04:23

Alexander
12.10.2018
17:04:42

Bogdan
12.10.2018
18:30:21

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

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

Bogdan
12.10.2018
18:38:08

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

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, если есть нужда интеропиться с джавой).


Mikhail
12.10.2018
19:28:02

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

Kirill
13.10.2018
02:53:06

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

Alexandr
13.10.2018
04:04:23

Mikhail
13.10.2018
07:10:42
С кодогенерацией все можно

Bogdan
13.10.2018
07:29:37

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

Mi
13.10.2018
07:32:03

Алексей
13.10.2018
07:32:15

Bogdan
13.10.2018
07:32:30

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