Подтвердить что ты не робот

Разница между "инверсией управления", "инверсией зависимостей" и "развязкой"

Я читаю теорию об инверсии зависимостей и развязке, и я не вижу разницы между ними.

Инверсия зависимостей говорит о развязывании функциональных компонентов, так что компоненты более высокого уровня не зависят от компонентов нижнего уровня.

Развязка говорит о том же и о том, как ее достичь. Но тогда у нас есть контейнеры IoC, которые еще больше портили вещи. Почему они скорее не называются контейнерами инверсии зависимостей или даже лучшими контейнерами для инъекций зависимостей, потому что они обслуживают временные соединения независимых компонентов?

Затем мы имеем Инверсия управления. Это в основном то же самое, что Инверсия зависимостей не так ли? Почему существуют три термина, описывающих одно и то же? Или я слепой?

  • В чем разница между тремя?
  • Что IoC должно делать в контейнерах IoC?
4b9b3361

Ответ 1

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

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

Инверсия управления - это принцип разработки, используемый библиотеками фреймворков, которые позволяют фреймворку восстановить некоторый контроль над приложением. I.e., инфраструктура окон может возвращаться в код приложения, когда происходят определенные события пользовательского интерфейса. Мартин Фаулер использует термин "принцип Голливуда", как в "Не звони нам", мы позвоним тебе. Развязка является важной частью инверсии управления.

Но что имеет контейнер IoC для инверсии управления? Процитировать Мартина Фаулера:

Инверсия управления является слишком общим термином, и, следовательно, люди находят его запутанным. В результате с большим обсуждением с различными защитниками IoC мы остановились на названии Dependency Injection.

(Обратите внимание, что Мартин Фаулер говорит об инъекции зависимостей, а не об инверсии зависимостей.)

Контейнер IoC помогает внедрить инъекцию зависимостей, и, возможно, лучшим термином будет контейнер для инъекций зависимости. Тем не менее, имя контейнера IoC, похоже, придерживается. Инъекция зависимостей является важным компонентом инверсии зависимостей, но использование контейнеров IoC для инъекций зависимостей может сбивать с толку, поскольку инверсия управления является более широким и более общим принципом.

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

Ответ 2

Инъекция зависимостей достигает Развязки с помощью Инверсия управления.

Ответ 3

Я нахожу следующее объяснение от DIP in the Wild статьи о martinfowler.com для понимания (здесь DI = Инъекция зависимостей, DIP = Зависимость Принцип инверсии, IoC = инверсия управления):

DI - это то, как один объект получает зависимость. Когда зависимость при условии, что система использует DI. IoC - это кто инициирует вызов. Если ваш код инициирует вызов, это не IoC, если контейнер/система/библиотека обращается к коду, который вы предоставили это, это IoC.

DIP, с другой стороны, относится к уровню абстракции в сообщения, отправленные из вашего кода, на предмет, который он вызывает. (...) DI о проводка, IoC - это направление, а DIP - это форма [объекта от которого зависит код.)

Ответ 4

Инверсия зависимостей: зависит от абстракций, а не от конкреций.

Инверсия управления: главное против абстракции и то, как главное - это клей систем.

DIP and IoC

Вот несколько хороших постов, рассказывающих об этом:

https://coderstower.com/2019/03/26/dependency-inversion-why-you-shouldnt-avoid-it/

https://coderstower.com/2019/04/02/main-and-abstraction-the-decoupled-peers/

https://coderstower.com/2019/04/09/inversion-of-control-putting-all-together/