Ответ 1
Хороший вопрос - слово inversion
несколько удивительно (так как после применения DIP, модуль зависимостей нижнего уровня, очевидно, t теперь depend
на модуле вызывающего абонента более высокого уровня: либо вызывающий, либо зависимый теперь более слабо связаны через дополнительную абстракцию).
Ссылаясь на Robert C Martin исходный источник
Можно спросить, почему я использую слово "инверсия". Честно говоря, это связано с тем, что более традиционные методы разработки программного обеспечения, такие как структурированный анализ и дизайн, имеют тенденцию создавать программные структуры, в которых модули высокого уровня зависят от модулей низкого уровня и в которых абстракции зависят от деталей. На самом деле одной из целей этих методов является определение иерархии подпрограмм, которая описывает, как модули высокого уровня выполняют вызовы модулям низкого уровня.... Таким образом, структура зависимостей хорошо спроектированной объектно-ориентированной программы "инвертируется" относительно структуры зависимостей, которая обычно является результатом традиционных процедурных методов.
Один момент, который следует отметить при чтении бумаги дяди Боба на DIP, - это то, что С++ не (и в момент написания, но не имеет) имеют интерфейсы, поэтому достижение этой абстракции в С++ обычно реализуется посредством абстрактного/чистого виртуального базового класса, тогда как в Java или С# абстракция для ослабления связи обычно заключается в развязывании путем абстрагирования интерфейса от зависимости и связывания модуля более высокого уровня (s ) к интерфейсу.
Edit Просто уточнить:
"В некотором месте я также вижу, что он называется инверсией зависимостей"
Обратите внимание, что Dependency Injection (DI) является ОДНОЙ из возможных реализаций для достижения принципа инверсии зависимостей (DIP) - "D" в принципах дизайна SOLID, поэтому DI
и DIP
не являются полностью взаимозаменяемыми.
Другие реализации DIP включают шаблон локатора службы (который в настоящее время часто рассматривается как анти-шаблон); и Плагин.