
Руслан
18.09.2018
14:43:23

Quantum Harmonizer
18.09.2018
14:43:34

Руслан
18.09.2018
14:43:39
Что в общем-то не DI

Google

Mikhail
18.09.2018
14:44:04

Руслан
18.09.2018
14:44:19

Mikhail
18.09.2018
14:44:31

Руслан
18.09.2018
14:44:32
А у нас же тръ фп, компайл там.

Mikhail
18.09.2018
14:44:52
у тебя есть context и в нем есть все что может понадобится любому плагину, нет?

Quantum Harmonizer
18.09.2018
14:45:01

Руслан
18.09.2018
14:45:02
какие еще ошибки?
ну выше вы с Andrey объясняли самый широкий спектр ошибок к оторым приводит container di

Mikhail
18.09.2018
14:45:59
Окей, а каков твой подход? Ведь ты же тоже предлагаешь ServiceLocator
просто формат немного другой, разве нет?

Руслан
18.09.2018
14:47:31
Я говорю что есть куча задач где не будет в вашем DI никакой compile-time safety. И как пример привожу вот эту задачу.
И вот тут spring намного лучше бы отработал
т.к. он проинициализировал зависимости не только у Plugin, но и у всех зависимостей Plugin внутренних.

Quantum Harmonizer
18.09.2018
14:48:48

Google

Руслан
18.09.2018
14:49:40

Andrey
18.09.2018
14:49:56
Да, такой вот не очень хороший подход, но plugin может хотеть любую часть core
Мягко говоря, не очень. Это нарушение изоляции core в чистом виде.
То есть, на этом моменте вы говорите, что интерфейс, предоставляемый плагинам будет динамически расширяться и изменяться при изменениях в core.
Это какбе нарушение DIP, где каждый компонент декларирует интерфейс, как с ним работать.
А у вас core такого интерфейса не декларирует.

Руслан
18.09.2018
14:50:33

Quantum Harmonizer
18.09.2018
14:50:49

Andrey
18.09.2018
14:51:00

Quantum Harmonizer
18.09.2018
14:51:50

Руслан
18.09.2018
14:51:52

Mikhail
18.09.2018
14:52:13

Andrey
18.09.2018
14:52:19
То есть разделение на core и plugin у вас не работает де факто. Фактически, у вас монолит.

Mikhail
18.09.2018
14:52:38
передавать локатор и передавать граф - разные вещи

Andrey
18.09.2018
14:53:23

Mikhail
18.09.2018
14:53:28

Andrey
18.09.2018
14:54:19

Руслан
18.09.2018
14:54:35

Quantum Harmonizer
18.09.2018
14:55:24
что отвалится в следующей версии — никто не знает

Руслан
18.09.2018
14:56:14
...и без совместимости
Core очень стабилен просто, старое не выкидывается, а надолго деприкейтится. Опять же это аут оф скоуп

Andrey
18.09.2018
14:56:33

Quantum Harmonizer
18.09.2018
14:56:46

Google

Mikhail
18.09.2018
14:57:45

Andrey
18.09.2018
14:58:06

Руслан
18.09.2018
15:00:14
В общем резюмируя, вы предлагаете все что я нежно ручками в core main насоздавал, запихнуть в мапу, или в мапу обернутую в интерфейс и передать в метод Plugin.setContext(deps)?

Andrey
18.09.2018
15:01:37

Mikhail
18.09.2018
15:01:39
почему контекст ассоциируется с мапой?

Руслан
18.09.2018
15:02:04

Quantum Harmonizer
18.09.2018
15:02:06

Руслан
18.09.2018
15:02:19

Quantum Harmonizer
18.09.2018
15:02:22

Andrey
18.09.2018
15:02:38

Руслан
18.09.2018
15:03:22
Ну условно. В такой жирный класс, в которым X полей просто для того чтобы использовать его дальше как service locator

Mikhail
18.09.2018
15:03:38

Andrey
18.09.2018
15:04:22

Quantum Harmonizer
18.09.2018
15:05:26
Map из Class<T> в T ?

Руслан
18.09.2018
15:05:48
Что значит условно мап?
В такой жирный класс, в которым X полей просто для того чтобы использовать его дальше как service locator

Andrey
18.09.2018
15:07:15

Руслан
18.09.2018
15:07:51

Andrey
18.09.2018
15:09:22

Тимур
18.09.2018
15:13:56
вопрос
допустим у меня есть иммутабельные data классы, то бишь все данные в них описаны как val
я загружаю их содержимое из json
и предположим некоторые их этих классов имеют ссылки друг на друга, причем циклические
например, объект A имеет ссылку на B, а тот обратно
и получается что чтобы создать A, его надо проинициализировать ссылкой на B, который уже создан
но чтобы создать B должен быть готов A
вопрос: можно ли такое как-то загрузить и создать?

Google

Andrey
18.09.2018
15:14:09
Всё это восходит к рназнице между бестиповым лямбда исчислением и типизированным.
В бестиповом выражения короче, но гораздо меньше возможностей проверки их корректности.
В типизированном надо, о боже, писать сигнатуры типов. Зато проверка корректности хороша.
Передача мапы, как вы предлагаете, пример бестипового выражения. КМК это противоречит идеологии Kotlin, так как он позиционируется, как строго типизированный язык.

Тимур
18.09.2018
15:16:09

Andrey
18.09.2018
15:17:24

Тимур
18.09.2018
15:19:57
например, по имени файла
файл a.json
{
"friend": "\b.json"
}
файл b.json
{
"friend": "\a.json"
}
когда десериализую, поля friend должны превратиться в прямые ссылки на соответствующие объекты

Mikhail
18.09.2018
15:20:24

Тимур
18.09.2018
15:21:02

Руслан
18.09.2018
15:21:11

Mikhail
18.09.2018
15:21:39
может быть есть другой способ решить задачу? например, указывать id друга а не друга целиком

Admin
ERROR: S client not available

Тимур
18.09.2018
15:22:26
Так десериализуй friend как String
потом пользоваться неудобно, надо хранить какой-то глобальный map<String,Any>, протягивать везде на него ссылку, кастить эти Any к нужным типам

Руслан
18.09.2018
15:22:51

Andrey
18.09.2018
15:23:40

Mikhail
18.09.2018
15:24:19
а еще можно не пытаться натянуть сову на глобус

Andrey
18.09.2018
15:24:42

Тимур
18.09.2018
15:28:06
кстати необязательно в json, просто данные которые где то лежат, грузятся и потом не меняются
но со ссылками

Mikhail
18.09.2018
15:30:14
а почему бы не заменить ссылки на id (ссылки)?
ты ведь в JSON не пытаешься данные запечь в обхекты?

Google

Руслан
18.09.2018
15:30:46
Как заставить с этим работать ObjectMapper - для меня вопрос. Все эти ссылки врядли будут легко решаться на его уровне.

Тимур
18.09.2018
15:33:08
а почему бы не заменить ссылки на id (ссылки)?
потому что потом придется в рантайме резолвить эти id, которые после загрузки уже не нужны, нужны прямые ссылки
ну то есть так сделать конечно можно, но это плохое решение, лучше даже отказаться от иммутабельности и заменить val на var

Mikhail
18.09.2018
15:36:18
как бы какая разница, сслыка у тебя на уровне байткода или кода

Тимур
18.09.2018
15:39:41

Mikhail
18.09.2018
15:40:02

Тимур
18.09.2018
15:40:36

Mikhail
18.09.2018
15:41:07
если так, то передай ему функцию Id -> B

Тимур
18.09.2018
15:41:44

Mikhail
18.09.2018
15:43:17
ну тогда той штуке, которая работает с А не нужно ничего кастить, она всегда будет пользоваться Id -> B

Тимур
18.09.2018
15:46:04
вообще эта задача хорошо решается в C++
там ты взял некие данные, загрузил, прошил ссылки как надо и отдал дальше наружу константную ссылку
а тут наверное только хаками

Руслан
18.09.2018
15:51:38
Ну хз, котлиновский List так по сути работает

Тимур
18.09.2018
15:52:00
ну в принципе да

Руслан
18.09.2018
15:52:02
Сверху API Immutable, внутри muttable

Andrey
18.09.2018
15:52:44
Как-то так мы сову на глобус и натянем

Тимур
18.09.2018
15:57:58