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

Алексей
18.09.2018
12:52:42

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

Руслан
18.09.2018
12:53:00

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 это когда зависимости внедряются извне, это не передача параметров(зависимостей) в конструктор, а имеено внендрение фреймворком

jied
18.09.2018
12:54:56

Alexey
18.09.2018
12:55:12

Руслан
18.09.2018
12:55:24

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

Alexey
18.09.2018
12:57:46

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

Igor
18.09.2018
13:01:35

Alexey
18.09.2018
13:01:56
Нигде нет слова, что это должен делать контейнер

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:03:17

Alexey
18.09.2018
13:04:06


Руслан
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.

Alexey
18.09.2018
13:05:43

Andrew
18.09.2018
13:05:57

Руслан
18.09.2018
13:06:27

Alexey
18.09.2018
13:06:30

Руслан
18.09.2018
13:07:07

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

Mikhail
18.09.2018
13:08:30

Andrew
18.09.2018
13:08:52

Google

Alexey
18.09.2018
13:09:14
Вот так мы провели рабочий вторник в устаканивании терменологии

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

Руслан
18.09.2018
13:11:58

Igor
18.09.2018
13:13:33

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.

Andrey
18.09.2018
13:14:41

Quantum Harmonizer
18.09.2018
13:15:25

Руслан
18.09.2018
13:15:44

Andrew
18.09.2018
13:15:45

Sergey
18.09.2018
13:17:30

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 у вас не получится.


dimiii
18.09.2018
13:26:27
Смотрите, во-первых я не хочу всем доказать что это так, @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, ...)
...
то нет.
Вот этот
```
om: ObjectMapper
```
вполне может быть "крадёт" параметры у методов класса B.


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 объектов

Руслан
18.09.2018
13:28:52
Касательно "сам в функции создал экземпляры классов" — это, ясное дело, не 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 — это клиентский код, которому фиолетово, где какие реализации зависимостей есть, и в этом всём нету никакого контейнера.
Это не injector, ты сам создаешь инстансы. Ты не можешь взять этот injector и переопределить там класс который реализует B
Только путем измения кода, а в IoC ты будешь не изменять, а расширять

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

Alexey
18.09.2018
13:44:06


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 вообще абстрактнее этого всего.

Руслан
18.09.2018
13:45:25

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
то есть с неизменяемыми объектами он всё ещё не работает?

Kirill
18.09.2018
13:46:53

Руслан
18.09.2018
13:47:06

Google

Руслан
18.09.2018
13:47:18

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

Руслан
18.09.2018
13:48:10

Andrey
18.09.2018
13:48:16

Bogdan
18.09.2018
13:48:20

Andrew
18.09.2018
13:49:33

Bogdan
18.09.2018
13:49:36

Andrew
18.09.2018
13:50:43

Руслан
18.09.2018
13:51:02

Andrew
18.09.2018
13:52:10
В чём разница принципиальная?
В том, что это делается не руками? Ну я об этом и говорю, DI с применением фреймворка и DI руками.
DI оно от этого быть не перестаёт-то

Руслан
18.09.2018
13:53:12

Andrew
18.09.2018
13:53:42

Руслан
18.09.2018
13:54:48

Mikhail
18.09.2018
13:54:51

Andrew
18.09.2018
13:55:25

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

Bogdan
18.09.2018
13:55:47
Священная война началась.
Может уже хватит ?