Чем инверсия управления (Inversion of Control, IoC) отличается от инверсии зависимостей (Dependency Inversion Principle, DIP)?

115
09 сентября 2019, 10:40

В литературе встречаются два разных понятия Инверсия управления и Принцип инверсии зависимостей, которые сформулированы одинакаво:

  • Модули верхних уровней не должны зависеть от модулей нижних уровней. Оба типа модулей должны зависеть от абстракций.

  • Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.

В чем состоит разница?

Answer 1

Inversion of Control -- это общий термин, который характеризует архитектуру ПО. Применяется обычно к фреймворкам -- инверсия управления является одной из характеристик.

Фреймворки предоставляют точки подключения, в которых вы можете писать свой код. Но при этом общим выполнением программы по-прежнему управляет фреймворк, время от времени вызывая ваш код. Инверсия заключается в том, что в отличии от традиционного подхода не вы вызываете библиотечный код, а библиотечный код вызывает вас. Примерами могут являться ASP.NET и WPF с их событиями.

При этом принцип инверсии управления может использоваться и в более мелком масштабе. Например, есть слой логики (BLL) и доступа к данным (DAL). Общеизвестно, что DAL не может обращаться к BLL. Но иногда возникает потребность на уровне DAL выполнить некий код, который должен принадлежать к BLL. В таком случае в DAL заводится некоторый интерфейс, этот интерфейс реализуется на уровне BLL, и экземпляр конкретной реализации передается из BLL в DAL. Такой пример, в частности, согласуется с DIP.

Dependency Inversion Principle дает рекомендации о том, какими должны быть зависимости. Это как раз то, что вы процитировали:

  • Модули верхних уровней не должны зависеть от модулей нижних уровней. Оба типа модулей должны зависеть от абстракций.
  • Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.

Вы также могли слышать о Dependency Injection. Внедрение зависимостей является связующим звеном между IoC и DIP. Это один из способов реализации инверсии управления.

Лучше почитайте английскую Вики про IoC и DIP, там намного лучше все объяснено. Думаю, даже с помощью Гугл транслейта это будет полезнее, чем статьи на русской Вики.

В качестве русскоязычного источника могу порекомендовать статью DI vs. DIP vs. IoC от Сергея Теплякова. Возможно он даже зайдет в этот вопрос и объяснит все как следует :).

READ ALSO
Данные из одного списка в другой

Данные из одного списка в другой

У меня есть список Arraylist list(с данными) и

149
В чем разница “&&” между “&” и “||” между “|” java?

В чем разница “&&” между “&” и “||” между “|” java?

Читал книгу философия явадошёл к пункту: какя разница между одинарним и двойним использованием сивволов

125
Динамическая, редактируемая таблица в JavaFX

Динамическая, редактируемая таблица в JavaFX

У меня есть форма с таблицей, в каждой строке есть чекбоксПри переходе в следующую форму в нее передаются записи из таблицы с выбранным чекбоксом

131
Вакансия для Java junior или стажировка [закрыт]

Вакансия для Java junior или стажировка [закрыт]

Вопрос может немного не для этого сообщества, но все же

139