@kotlin_lang

Страница 875 из 982
Andrey
18.09.2018
12:51:18
в котлине нет new
но он ведь в java, то что нет new не означает что он без него обходится внутри

Алексей
18.09.2018
12:52:42
но он ведь в java, то что нет new не означает что он без него обходится внутри
Вобще, насколько я помню, создание объекта через ObjectClass(…) - самое что ни на есть new, нет?

Alexey
18.09.2018
12:52:48
Откуда у вас такая интерпритация термина DI вообще?

Google
Alexey
18.09.2018
12:53:18
Вы контейнеры называете DI

Andrey
18.09.2018
12:53:52
вот это строчка Server(kodein, applications).start() превращается в byte code IR (new Server((Kodein)kodein, applications, 0, 4, (DefaultConstructorMarker)null)).start(); ну типа джавовский код

Руслан
18.09.2018
12:54:27
Вы контейнеры называете DI
Так DI это когда зависимости внедряются извне, это не передача параметров(зависимостей) в конструктор, а имеено внендрение фреймворком

Руслан
18.09.2018
12:55:24
Так DI это когда зависимости внедряются извне, это не передача параметров(зависимостей) в конструктор, а имеено внендрение фреймворком
Википедия согласна. Если почитать https://en.wikipedia.org/wiki/Dependency_injection и https://en.wikipedia.org/wiki/Inversion_of_control

Alexey
18.09.2018
12:55:27
первая часть правда

вторая нет

Руслан
18.09.2018
12:55:44
Ну у меня авторитетный источник

Alexey
18.09.2018
12:55:44
вторая уже про IoC

Руслан
18.09.2018
12:56:07
Написано что Dependency Injection это подвид IoC

А вот Dependency Inversion Principle это когда ты ручками через конструктор или сеттер или прямо в поле, не важно. главное чтобы интерфейс https://en.wikipedia.org/wiki/Dependency_inversion_principle

Google
Руслан
18.09.2018
12:58:03
Это DIP

Alexey
18.09.2018
12:58:26
Из вашей же ссылки > dependency injection is a technique whereby one object (or static method) supplies the dependencies of another object.

main предоставил объекту A инстансы объектов B и C?

Руслан
18.09.2018
13:00:41
Из вашей же ссылки > dependency injection is a technique whereby one object (or static method) supplies the dependencies of another object.
Все верно, читаем дальше объяснение и видим: > Dependency injection is one form of the broader technique of inversion of control. As with other forms of inversion of control, dependency injection supports the dependency inversion principle. И дальше > The client delegates the responsibility of providing its dependencies to external code (the injector).

Ivan
18.09.2018
13:02:30
Егор Бугаенко публиковал статью о DI без контейнера, и тот код, который он называет The right way без слез читать невозможно - жуткая вермишель с несколькими уровнями вложенности. https://www.yegor256.com/2014/10/03/di-containers-are-evil.html Гоферам наверное нравится явно писать такие портянки руками, но глядя на код, хочется иметь возможность описать это конфигурацией.

Руслан
18.09.2018
13:04:25
Нигде нет слова, что это должен делать контейнер
Вроде достаточно очевидно про container (injector) написано: > The client delegates the responsibility of providing its dependencies to external code (the injector). > The injector introduces the services into the client. Often, it also constructs the client. An injector may connect together a very complex object graph by treating an object like a client and later as a service for another client. The injector may actually be many objects working together but may not be the client. The injector may be referred to by other names such as: assembler, provider, container, factory, builder, spring, construction code, or main.

Руслан
18.09.2018
13:06:27
Где тут сказано что это ДОЛЖЕН быть контейнер
Смотри, в статье говорится что DI это вид IoC, так?

Руслан
18.09.2018
13:07:07
Дык эцсамое, вышеприведенная main тоже по сути injector.
main это клиентский код, идея injector'а что это что-то внешнее что тебе провайдит зависимости

dimiii
18.09.2018
13:08:01
Все же использование контейнеров и автоматизированной DI приводит к занятным деформациям. Я видел @Autowired конструкторы с полдюжиной параметров, там где можно было бы использовать паттерн делегат или функции высшего порядка. Но разрабы предпочитали фигачить бездушные сервисы - формально код работал, выполнял нужные функции, но от него пахло казармой.

Mikhail
18.09.2018
13:08:30
main это клиентский код, идея injector'а что это что-то внешнее что тебе провайдит зависимости
окей, если я эти три строчки вынесу из main в класс AFactory, это будет DIP, DI или IoC?

Andrew
18.09.2018
13:08:52
main это клиентский код, идея injector'а что это что-то внешнее что тебе провайдит зависимости
Я таки думаю, что речь идёт об инъекторе и клиенте этого инъектора. В таком разрезе функция, которая собирает граф, будет инъектором, а непосредственно объекты этого графа — клиентская часть.

Google
Andrew
18.09.2018
13:11:01
Строго говоря, main вообще обычно мало полезной нагрузки в софте имеет, вся интересная с точки зрения бизнеса часть оттуда вынесена. Сама точка входа логически обычно относится к фреймворку, а написан он тобой или кем-то другим — дело третье.

Руслан
18.09.2018
13:11:58
окей, если я эти три строчки вынесу из main в класс AFactory, это будет DIP, DI или IoC?
DIP будет все где ты разделяешь создание и использование зависимости. DI(IoC) это все где ты не сам передаешь зависимости, а отдаешь это на откуп фреймворку, который уже собирает твой граф для тебя. Поэтому если ты вынес в код куда-то, а потом собрал граф ручками это конечно DIP, но не DI.

Andrew
18.09.2018
13:13:43
При использовании ктора того же мэин обычно собирает и запускает сервер и дожидается его возврата. В ведре мэина вообще нету, там всё делает зигота и в конце концов просто пинаются определённые программистом делегаты. В JavaFX мэин есть, но его единственная задача — передать управление фреймворку. Да в любой системе с ивент лупом так будет. IoC — это подход, который реализовать может кто угодно, в том числе единственный на проекте программист, который вообще внешние библиотеки не подключает. Управление от этого выворачиваться не перестаёт :)

Руслан
18.09.2018
13:14:38
Можно вернуться в статью про IoC в которой написано что IoC это фреймворк в который ты подключаешься, а чуть ниже что Dependency Injection это подвид IoC; In software engineering, inversion of control (IoC) is a design principle in which custom-written portions of a computer program receive the flow of control from a generic framework. Dependency injection is a specific type of IoC.

Quantum Harmonizer
18.09.2018
13:15:25
Sergey
18.09.2018
13:17:30
Это Service Locator
это зависит от того как юзатть)

Andrew
18.09.2018
13:17:53
это зависит от того как юзатть)
А как можно юзать кодеин не как сервис локатор? Хочу пример.

Sergey
18.09.2018
13:18:11
Andrew
18.09.2018
13:18:40
Я почему-то всегда был уверен, что кодеин — это просто Map на стероидах и основной принцип работы — с одной стороны всё в него свалить, с другой — вычитать по нужде.

Sergey
18.09.2018
13:19:14
никто не заставляет его юзать как сервис локатор. он умеет собирать до кучи весь граф. а твое дело взятть только вершины графа и пользоваться им

Руслан
18.09.2018
13:23:05
Дык если фреймворк — это одна функция и она написана тем же, кто и остальной код написал, IoC перестаёт быть IoC?
Смотрите, во-первых я не хочу всем доказать что это так, @Enleur показал мне например сейчас что я вчера был неправ про IoC и DI, там где я говорил IoC я думал про DIP. И в жизни я тоже не говорю DIP, IoC. DI и DI, все понятно. Теперь к вопросу о функции. Как я вижу от того что ты перенес код из main в фунцию у тебя принципиально ничего не поменялось. Тут дело в том кто создает instance класса. Если ты функции передал что у тебя есть класс A и B: class A(b: B) class B(c: C, om: ObjectMapper) И она создала инстансы A, B, C, ObjectMapper - то это конечно IoC, а если ты сам в этой функции сделал val c = C() val b = B(c, ...) ... то нет.

Кстати сделать модули в рантайме без какого-то вида IoC у вас не получится.

Kirill
18.09.2018
13:27:42
Привет, есть проект со спрингом, котлином и гибернейтом. Энтити - котлиновские дата классы с иммутабельными свойствами(val). Слышал, что хорошая практика изменять объекты через copy, могут ли быть какие-то проблемы в этом случае пр. работе с гиьернейтом?

Google
Andrew
18.09.2018
13:27:54
Смотрите, во-первых я не хочу всем доказать что это так, @Enleur показал мне например сейчас что я вчера был неправ про IoC и DI, там где я говорил IoC я думал про DIP. И в жизни я тоже не говорю DIP, IoC. DI и DI, все понятно. Теперь к вопросу о функции. Как я вижу от того что ты перенес код из main в фунцию у тебя принципиально ничего не поменялось. Тут дело в том кто создает instance класса. Если ты функции передал что у тебя есть класс A и B: class A(b: B) class B(c: C, om: ObjectMapper) И она создала инстансы A, B, C, ObjectMapper - то это конечно IoC, а если ты сам в этой функции сделал val c = C() val b = B(c, ...) ... то нет.
Касательно "сам в функции создал экземпляры классов" — это, ясное дело, не DI, не IoC, не DIP, потому что функция знает о конкретных реализациях того, что она использует. Я всего лишь о таком: class A(b: B) { fun doUsefulStuff() { ... } } interface B class BImpl(c: C): B class C fun main() { val c = C() val b = BImpl(c) val a = A(b) a.doUsefulStuff() } Вот в этом примере main — это injector, внешний по отношению к бизнес-логике фреймворк; вышеперечисленные классы и метод doUsefulStuff — это клиентский код, которому фиолетово, где какие реализации зависимостей есть, и в этом всём нету никакого контейнера.

Kirill
18.09.2018
13:28:20
например получил данные из бд, через copy изменил и сохранил через save

напрягает, что гибернейт использует proxy объектов

Andrew
18.09.2018
13:29:32
Перечитываю статью по DI и не вижу ничего такого.

Руслан
18.09.2018
13:43:28
Перечитываю статью по DI и не вижу ничего такого.
Согласен, там не сказано жестко что injector это фреймворк: The injector may be referred to by other names such as: assembler, provider, container, factory, builder, spring, construction code, or main. На подводить под одну черту main где я ручками собрал граф, и фреймворк который сам собрал тебе граф странно.

Andrey
18.09.2018
13:44:02
Итак, насчёт IoC: IoC - принцип, при котором часть программы (объект или статический метод) получает куски control flow извне. Это не обязательно DI. Пример IoC не являющегося DI - экстеншн метод map для Iterable в Kotlin.

Admin
ERROR: S client not available

Andrew
18.09.2018
13:45:06
Согласен, там не сказано жестко что injector это фреймворк: The injector may be referred to by other names such as: assembler, provider, container, factory, builder, spring, construction code, or main. На подводить под одну черту main где я ручками собрал граф, и фреймворк который сам собрал тебе граф странно.
А я не вижу проблем. Для самой сути DI не особо важно, КАК собирается граф, важно, что всем клиентам извне поставляются их зависимости. Ну и как верно выше заметили, IoC вообще абстрактнее этого всего.

Quantum Harmonizer
18.09.2018
13:45:52
а no-arg-конструктор больше не нужен?

Andrew
18.09.2018
13:46:25
Всякие коллбеки, которые передаются фреймворкам — это тоже IoC, и опять же если написать собственноручно реализацию forEach, она будет основана на IoC.

Руслан
18.09.2018
13:46:27
Quantum Harmonizer
18.09.2018
13:46:46
то есть с неизменяемыми объектами он всё ещё не работает?

Руслан
18.09.2018
13:47:06
Google
Руслан
18.09.2018
13:47:18
Kirill
18.09.2018
13:47:46
у меня проблемы начались, толко после появления entity с составным ключом

инетересно почему

Andrey
18.09.2018
13:48:16
Всякие коллбеки, которые передаются фреймворкам — это тоже IoC, и опять же если написать собственноручно реализацию forEach, она будет основана на IoC.
Имемнно так. Идея IoC в том, чтобы не дёргать из объекта нужные тебе данные и производить действия снаружи, а передать объекту, какие действия нужны с данными, а он сам разберётся, как и когда их лучше сделать

Bogdan
18.09.2018
13:48:20
но он ведь в java, то что нет new не означает что он без него обходится внутри
Бери глубже, внутри транзисторы открываются и заерываются

Andrew
18.09.2018
13:49:33
Хорошо, как тогда нам разделить говнокод в main и код когда spring пробежался по анноташкам и построил граф.
А чойта руками собранный граф внезапно говнокодом стал? Я некогда на крестах проект писал, тоже вовсю старался делать DI, но при учёте небольшого количества сущностей собирал граф руками (с ифдефчиками для дебага и релиза).

Bogdan
18.09.2018
13:49:36
но он ведь в java, то что нет new не означает что он без него обходится внутри
Нев это выделения памяти и вызов первого метода, называет еще инит методом, по простому конструктор

Andrew
18.09.2018
13:50:43
Хорошо, как тогда нам разделить говнокод в main и код когда spring пробежался по анноташкам и построил граф.
Ну а вообще "пробежался по анноташкам и построил граф" — это конкретный DI фреймворк, помогающий организовать DI, собранный руками граф — просто руками организованный DI.

Руслан
18.09.2018
13:51:02
А чойта руками собранный граф внезапно говнокодом стал? Я некогда на крестах проект писал, тоже вовсю старался делать DI, но при учёте небольшого количества сущностей собирал граф руками (с ифдефчиками для дебага и релиза).
Ну как, Если у меня 100 объектов, то это минумум 100 строк нежно раставленных в правильном порядке созданий объектов, объявление для них имем и прокидывание ниже по списку. Или одна строчка в которой будет написано просканируй вот эти классы и запусти код в определенном.

Andrew
18.09.2018
13:52:10
В чём разница принципиальная?

В том, что это делается не руками? Ну я об этом и говорю, DI с применением фреймворка и DI руками.

DI оно от этого быть не перестаёт-то

Руслан
18.09.2018
13:53:12
И те же 100 строк будут сгенерены компилятором (и размазаны на 150 классов в случае даггера) / заменены на 100 рефлексивных операций.
Ну фишка в том что я декларативно описываю что хочу получить и получаю. А не императивно строю ручками граф. И в первом случае декларативно хорошо скейлится, а второе - постоянная поддержка.

Руслан
18.09.2018
13:54:48
Дык это разница в деталях реализации одного и того же подхода.
Да. Так есть ли у нас терминология чтобы назвать один и второй подход и больше не путаться в ~спорах~ обсуждении?

Mikhail
18.09.2018
13:54:51
И те же 100 строк будут сгенерены компилятором (и размазаны на 150 классов в случае даггера) / заменены на 100 рефлексивных операций.
вот плюсодин, раньше я думал что даггер убирает бойлерплейт, но на самом деле он его создает

Andrew
18.09.2018
13:55:25
вот плюсодин, раньше я думал что даггер убирает бойлерплейт, но на самом деле он его создает
Он его прячет в сгенерированные классы, но для своей работы требует другой бойлерплейт, только и всего.

Mikhail
18.09.2018
13:55:36
и для того чтобы хоть чуть чуть сделать видимость того что бойлерплейта стало меньше он генерирует еще кучу бойлерплейта сам

Bogdan
18.09.2018
13:55:47
Священная война началась.

Может уже хватит ?

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