Разница между «инверсией управления», «инверсией зависимости» и «развязкой» - PullRequest
59 голосов
/ 12 октября 2010

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

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

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

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

Ответы [ 4 ]

64 голосов
/ 12 октября 2010

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

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

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

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

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

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

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

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

46 голосов
/ 12 октября 2010

Внедрение зависимостей достигает Отключение с использованием Инверсия управления .

16 голосов
/ 25 августа 2016

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

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

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

0 голосов
/ 13 апреля 2019

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

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

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

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/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...