@kotlin_lang

Страница 876 из 982
Bogdan
18.09.2018
13:56:28
Google
Sergey
18.09.2018
13:56:57
даже на больших проектах типа k8s

Andrew
18.09.2018
13:57:47
на го до сих пор так делают
На го много чего делают через ж^W^W по-своему.

Руслан
18.09.2018
13:58:44
DI container и руками организованный DI?
Окей, т.е. Koin, Kodein, Spring, Guice, Dagger - DI Container Создавать классы ручками через конструкторы или сеттеры - DI. Неудобно писать DI Container. Может просто DIC?

Alexey
18.09.2018
13:59:08
дааа дик

Руслан
18.09.2018
13:59:18
Sergey
18.09.2018
13:59:26
Guice, Spring и тд это всего лишь DSL для контейнера, на выходе один хрен одинаковая штука выйдет что руками, что со спрингами

Andrey
18.09.2018
14:00:00
Ну а вообще "пробежался по анноташкам и построил граф" — это конкретный DI фреймворк, помогающий организовать DI, собранный руками граф — просто руками организованный DI.
Вот начиная с "пробежался по анноташкам" и возникают проблемы, так как анноташки размазаны по кодовой базе и не проверяются во время компиляции. То есть до запуска приложения граф зависимостей вообще не проверяется, а если в DI фреймворке есть ленивая инициализация зависимостей, то части графа могут и на запуске не провериться. В результате всё собралось, запустилось, вроде работает. Только вот на какой-то хитрой комбинации действий падает на зависимостях.

Sergey
18.09.2018
14:00:05
а со стороны кода уж тем более пофиг кто ему зависимости пропихивать будет

Andrey
18.09.2018
14:02:12
А хуже всего, если не падает, а как-то, из существующего говна и палок оно зависимости смогло собрать, но не те, которые ожидет программист.

Google
Руслан
18.09.2018
14:02:16
А что, споткнуться об ленивую инициализацию в Manual DI невозможно?)
Кстати именно поэтому в Guice есть Development и Production Stage. А в Spring все eager

Andrey
18.09.2018
14:04:18
А что, споткнуться об ленивую инициализацию в Manual DI невозможно?)
Можно, но без пробега по анноташкам (если весь граф кодом описан), проще этот клубок распутать, если что.

Руслан
18.09.2018
14:05:45
Можно, но без пробега по анноташкам (если весь граф кодом описан), проще этот клубок распутать, если что.
Если говорить про практику, то в Guice действительно тяжело. А вот в Spring отличный репортинг. Сразу понятно что где произошло. Ничем не отличается от ручного в этом плане

Alexey
18.09.2018
14:06:38
Ну вот добавилась зависимость в класс, и в случае ручного сбора у тебя упадёт на компиляции, в случае спринга когда то на рантайме

Sergey
18.09.2018
14:06:56
но в основном на любом запуске оно упадет в рантайме, на фрейме

если там нет lazy зависимостей

которые внезапно в проде упадут)

Alexey
18.09.2018
14:07:31
На запуске. И что?)
Может тогда на php писать? Нахер сигнатуры, нахер типы

Quantum Harmonizer
18.09.2018
14:07:49
Sergey
18.09.2018
14:07:51
Может тогда на php писать? Нахер сигнатуры, нахер типы
а вот не надо. на пхп контейнер ты компилируешь отдельно от запуска приложухи

Igor
18.09.2018
14:08:08
так с любым IoC фреймом
Ну на ведре, используют код-ген (dagger2/toothpick) и в основном падает при компиляции. Хотя имхо, лучше просто тестами покрыть.

Andrey
18.09.2018
14:08:12
На запуске. И что?)
Нету никаких гарантий, что упадёт именно на запуске.

Sergey
18.09.2018
14:08:16
какой контейнер
с зависимостями

Alexey
18.09.2018
14:08:19
У вас везде контейнеры

?

Andrey
18.09.2018
14:09:20
Ну на ведре, используют код-ген (dagger2/toothpick) и в основном падает при компиляции. Хотя имхо, лучше просто тестами покрыть.
Тесты дополняют статическую проверку времени компиляции, но не заменяют её. Чем больше можно проверить компилятором, тем лучше.

Sergey
18.09.2018
14:09:43
ну вообще, если у вас некое подобие микросервисной архитектуры, от фрейм для IoC вам вряд ли нужен будет и достаточно ручками все описывать

Google
Sergey
18.09.2018
14:10:10
а сотню зависимостей можно и ручками описать один раз как @eld0727 и предлагал мне когда-то

Руслан
18.09.2018
14:11:27
Нету никаких гарантий, что упадёт именно на запуске.
Если только что-то не lazy, а если lazy, то тебе и в ручном сборе не мешает упасть. Да что там далеко ходить. Вот вы сделали модуль, который подключаете в runtime, а за зависимостями из вашего Manual DI нужно ходить через ServiceLoader (ну или предложите compile-time safe true fp way). Вот и все, все на рантайме, может упасть, как жить)

Andrey
18.09.2018
14:11:35
Ладно, всем удачи в этом чатике. Работа стоит.

Alexey
18.09.2018
14:11:36
Они не появляются все разом

Igor
18.09.2018
14:11:51
Тесты дополняют статическую проверку времени компиляции, но не заменяют её. Чем больше можно проверить компилятором, тем лучше.
Блин, у меня и так компиляция по 1.5 минуты и переключение бранчей по 30 сек. Лучше уж на кложе писать и тестами интеграционными покрывать.

Sergey
18.09.2018
14:12:15
я думаю можно 1000 описать без проблем
да в целом, а если нельзя разнести их на отдельные модули то тут уже проблема с coupling

Sergey
18.09.2018
14:12:58
в общем я честно пытался koin/kodein заюзать, но как-то расстроился сильно

Sergey
18.09.2018
14:13:38
кровью интерпрайза пахнет

Руслан
18.09.2018
14:15:35
кровью интерпрайза пахнет
У тебя есть скомпиленный jar, который строит тебе из набора adoc файлов сайтик. И ты хочешь к нему подключить плагин, который когда видит [youtube=fsdfsd] вставляет на этом месте iframe. У тебя есть два пути - заставить всех пользователей ставить jdk и запускать idea, править код чтобы подключить плагин, или загружать зависимости на рантайме. Какой выберешь? И вот сейчас всем хейтерам DI Container предлагаю написать компайл-тайм сейф код для этой задачи)

Sergey
18.09.2018
14:16:47
я не хейтер)) я сторонник YAGNI/KISS

Руслан
18.09.2018
14:17:05
я не хейтер)) я сторонник YAGNI/KISS
Ну ты не хейтер, ты и не пиши)

Sergey
18.09.2018
14:17:11
?

Руслан
18.09.2018
14:18:39
Задача в том, чтобы скачивать и подключать jar только при необходимости?
Задача в том чтобы реализовать плагинную систему на Manual DI, но так чтобы под ваши высокие стандарты чистоты и компайл-тайм сейфити подходило.

Quantum Harmonizer
18.09.2018
14:19:27
Задача в том чтобы реализовать плагинную систему на Manual DI, но так чтобы под ваши высокие стандарты чистоты и компайл-тайм сейфити подходило.
Нужно что-то около-SPI-ное, когда класс забирается по имени, но реализует определённый интерфейс, поэтому дальше всё снова безопасно.

Более того, можно подключить как compileOnly и даже написать new, просто оградить этот кусочек кода, чтобы не вызвать его, когда класса нет.

Руслан
18.09.2018
14:20:17
Нужно что-то около-SPI-ное, когда класс забирается по имени, но реализует определённый интерфейс, поэтому дальше всё снова безопасно.
Ну естесвенно. Так и DI Container. Он построил тебе контекст, можно выдохнуть - дальше все безопасно)

Google
Quantum Harmonizer
18.09.2018
14:21:13
Ну естесвенно. Так и DI Container. Он построил тебе контекст, можно выдохнуть - дальше все безопасно)
Разница в масштабах. «загружу один класс по имени» или «пусть 1000 объектов там сами как-нибудь»

Руслан
18.09.2018
14:22:50
Разница в масштабах. «загружу один класс по имени» или «пусть 1000 объектов там сами как-нибудь»
Так я сделаю задачу более реалистичной: У тебя класс подтянутый по SPI имеет конструктор и хочет от тебя зависимости. Ну в простейшем случае ObjectMapper. Но ты понимаешь - это интерфейс, ты не знаешь какие у тебя будут плагины, но плагины хотят любие классы которые у тебя в core.

Igor
18.09.2018
14:23:59
А что такое ObjectMapper?

Руслан
18.09.2018
14:24:10
А что такое ObjectMapper?
Да любой класс который в core

Igor
18.09.2018
14:25:07
Чет сложно (я под андроид пишу). ObjectMapper это типа класс, который мапит одни VO в др VO (value-object)?

Руслан
18.09.2018
14:25:25
Я даже подскажу тебе первый шаг. У тебя есть вот таких два класса: interface Plugin interface PluginProvider { fun get(): KClass<out Plugin> } и ты наверное в плагине сделаешь как-то так: cat resources/META-INF/services/PluginProvider my.pacakge.CoolPlugin

Чет сложно (я под андроид пишу). ObjectMapper это типа класс, который мапит одни VO в др VO (value-object)?
Да не важно, у тебя есть плагин который ты незнаешь в компайл тайме, и он хочет от тебя зависимостей

И при этом он сам зависимость, для тебя

Стандартная задача

Admin
ERROR: S client not available

Igor
18.09.2018
14:26:50
Да не важно, у тебя есть плагин который ты незнаешь в компайл тайме, и он хочет от тебя зависимостей
А ну лан. У меня были мысли, конкретно про маперы, что их нужно заменять static-методами.

Руслан
18.09.2018
14:27:33
dependency rejection
не понял

Quantum Harmonizer
18.09.2018
14:28:05
Превратить объект в пачку функций. Без зависимостей. Передавать ObjectMapper в каждый метод, в котором он может понадобиться.

Александр
18.09.2018
14:28:37
Котлин коммунити потихоньку превращется в ДИ ИоК чат)

Mikhail
18.09.2018
14:29:42
самое забавное, что раньше когда я участвовал в DI срачах - они были про ServiceLocator vs DependencyInjectionContainer

Quantum Harmonizer
18.09.2018
14:29:59
Т.е. плагин будет напряму дергать (static?!) функции
Не-не. В интерфейсе, который реализует плагин, методы должны принимать этот ObjectMapper.

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

Google
Руслан
18.09.2018
14:30:33
Quantum Harmonizer
18.09.2018
14:31:12
т.е. интерфейс плагина должен знать про все плагины?
Интерфейс плагина должен описывать функции без partial application, т. е. без собственных зависимостей.

Потому что непонятно, откуда зависимостям браться.

Руслан
18.09.2018
14:32:57
Интерфейс плагина должен описывать функции без partial application, т. е. без собственных зависимостей.
У разных плагинов разные зависимости, как ты в Core Plugin интерфейсе опишешь все возможные зависимости?

Руслан
18.09.2018
14:33:48
Так я тебе и спрашиваю, как без этого мерзкого рефлекшена решить вот такую задачку

Рефлекшеном - изи, взял провайдер, получил KClass, вызвал конструктор в который из DI контейнера напихал зависимостей

Руслан
18.09.2018
14:35:40
Это я тебе говорю как в реальном мире решить задачу

Quantum Harmonizer
18.09.2018
14:36:12
> из DI контейнера
ну вот не знаю я ничего про ObjectMapper, у меня нет Jackson или он настроен не так, как нужно плагину

Руслан
18.09.2018
14:36:16
И тут рефлекшен, DI контейнер, все по худшим стандартам

Quantum Harmonizer
18.09.2018
14:37:18
Руками собрал граф и всё
не совсем, читай выше)

Руслан
18.09.2018
14:37:47
Руками собрал граф и всё
А как граф передать в динамический модуль? Это ж что ж, servise loader предлагаешь делать? Нужно же сделать DI!

Sergey
18.09.2018
14:39:05
немного не в тему, но вопрос - как вы держите swagger ui, один на все проекты, или в каждом проекте свой?

Mikhail
18.09.2018
14:39:53
А как граф передать в динамический модуль? Это ж что ж, servise loader предлагаешь делать? Нужно же сделать DI!
так, еще раз можно задачку: у нас есть плагин, так? Который мы подключаем динамически, так?

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

Руслан
18.09.2018
14:41:29
Да, плагин реализует интерфейс Plugin (который мы сами написали), core модуль на рантайме загружает набор plugin модулей с реализацией интерфейса Plugin.

Andrey
18.09.2018
14:42:04

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