Описание тега dependency-inversion

По вопросам о принципе инверсии зависимостей в объектно-ориентированном программировании один из принципов SOLID был предложен Робертом К. Мартином. В нем говорится, что модули должны "зависеть от абстракций, а не от конкреций".

Роберт Мартин освещал принцип открытости-закрытости и принципа подстановки лисков в статьях, опубликованных в начале 1996 года. В его следующей статье обсуждались последствия применения этих принципов к объектно-ориентированным программам.

Структура, которая является результатом неукоснительного использования [OCP и LSP], может быть обобщена в принцип сама по себе. Я называю это "Принцип инверсии зависимостей" (DIP).

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

Что делает конструкцию жесткой, хрупкой и неподвижной? Это взаимозависимость модулей в рамках этого проекта.

DIP пытается уменьшить эту взаимозависимость двумя способами. Здесь утверждается.

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

Мартин достигает этих целей, беря традиционные процедурные зависимости, выполняющиеся от модуля высокого уровня к модулю низкого уровня, и заменяя их абстракциями (например, интерфейсами), которые существуют независимо от модулей низкого уровня, которые их реализуют.

Результатом введения абстракций, которые живут вне низкоуровневых модулей, является обращение (то есть инверсия) к предыдущему направлению зависимости. Вместо того, чтобы зависимость от высокого уровня вниз до модулей низкого уровня, модули низкого уровня имеют зависимость, указывая на их абстракции.

Позже Мартин включил DIP в качестве пятого из своих твердых принципов.

См. Статью DIP в разделе Принципы OOD.