Pull to refresh

Comments 19

Цитата про «5-центовую концепцию» задела за живое — не могу с ней согласиться. У этой идеи есть свои корни и непростой путь реализации.

Подмена реализаций для тестов и продакшена действительно упрощается. Но если копнуть глубже, мы упираемся в те же три столпа ООП — инкапсуляцию, наследование и полиморфизм. Проще говоря, мы просто переносим часть «магии» и повторяющегося кода внутрь IoC-контейнера.

IoC — полезный, но нетривиальный концепт: он снимает с нас много рутины, но заставляет глубже понимать архитектуру. В простых проектах вполне можно обойтись ручным DI — это проще и быстрее. Но как только логика усложняется или появляются циклические зависимости, ручная обвязка превращается в ад.

Не хотелось бы, чтобы разработчики чрезмерно упрощали концепцию и приходили к неправильному пониманию.

Претензий к статье нет, но цитата Джеймса Шора зацепила :)

Спасибо за статью — было интересно прочитать.

IoC не имеет отношения к DI, держу в курсе.

Просто ради интереса, а чем являются dig и wire?

Ну быстрое гугление говорит, что это DI библиотеки для Go. При чем тут это?

В предыдущем комментарии я ошибся в терминологии: под «IoC» я имел в виду IoC-контейнер. Возможно, из-за этого мой посыл был не до конца понятен.

dig и wire - это реализации IoC-контейнеров, которые реализуют паттерн Dependency Injection.

Конечно, можно сказать, что dig и wire - просто библиотеки, и это тоже будет правдой, но важно понимать, какой паттерн стоит за ними и глубину мысли.

Спора нет, просто хотел убедиться, что мы говорим об одном и том же.

Как по мне такое должно называться DI-контейнеры (так в большинстве случаев и называют). IoC это вообще про другое, это про инверсию контроля/управления. Вот когда вы в каком-нибудь любимом веб-фреймворке добавляете хэндлеры для обработки HTTP запросов, добавляете какие-нибудь middleware и потом фреймворк это вызывает, вот это и называется IoC, т.е. поток управления инвертирован, не вы вызываете, а вас вызывают.

Подписка на события не имеет отношения к IoC/IoC-контейнерам - это просто асинхронная парадигма программирования. Она встречается как в популярных веб-фреймворках, так и на уровне ОС: без неё невозможно обеспечить интерактивность и отзывчивость системы. Кажется, вы смешиваете разные вещи.

IoC-паттерн же касается другого: наш код зависит не от конкретной реализации, а от абстракции (интерфейса), а конкретная реализация «внедряется» извне. Здесь как раз задействуется полиморфизм.

Вы вправе называть это DI-контейнером - ваше право, - но терминология паттернов нужна для сжатой и однозначной передачи мысли собеседнику и общего понятийного аппарата.

Непонимаю, какие вы тут события нашли... Вообщем можете открыть статью на англ/русской википедии про IoC, там неплохо написано про то, чем это является.

я думаю разговор исчерпал себя :)

IoC-паттерн же касается другого: наш код зависит не от конкретной реализации, а от абстракции (интерфейса)

Вы не правы. IoC может быть вообще без интерфейсов. Он про то, что не программист управляет потоком выполнения, а фреймворк.

Если уж пытаться дружить эти термины, DI это очень частный случай IoC. Поэтому DI-контейнер более точный термин.

Такая однозначная, что сколько лет она существует, столько лет ее и понимает каждый по своему

Как-то в go эти DI выглядят ущербно.

Да? Надо попробовать. Просто показалось что слишком многое надо руками делать.

я плохо представляю как можно без DI сделать гибкий фреймворк и делать на нем приложения. хотя представляю, форкаем и правим :) вообще полно разных странных людей, кто-то до сих пор утверждает что типы не нужны, ну и ради бога, пускай каждый делает как хочет и набивает свои шишки, некоторые даже испытывают удовольствие от этого

DI так то не только к ооп применяется. Внезапно, func getUser(id int, db *Db) это тоже DI. Просто не нужно писать на джаве в го так как в джаве нет способа объявить функцию без класса.

Вот тут можно посмотреть еще один интересный подход без классического контейнера, правда на питоне https://fastapi.tiangolo.com/tutorial/dependencies/#create-a-dependency-or-dependable

Обычно di подразумевает зависимость какого объекта от другого объекта, обычно рассматривается несколько видов: через конструктор, через setter, через явную инициализацию публичного поля, никогда не встречал di в функциональщине

Это всё java подход, потому что она имеет много ограничений. Если бы в джаве можно было создавать функции вне классов, было бы иначе, например, сделали бы аннотацию над функцией и так же бы инъектили

Sign up to leave a comment.

Articles