Инверсия управления - это очень общая концепция, имеющая различные значения в зависимости от типа «контроля», о котором вы говорите. Зависимость инъекций является специфической формой.
Инверсия управления и итерации
В этом случае «управление» означает «управление потоком».
Я думаю, что ваш первый пример, включающий итерацию, на самом деле не является инверсией управления, потому что этот код явно выполняет управление потоком. Инверсия управления отделяет действие, которое нужно выполнить, от управления потоком. Это может выглядеть так (простите за мой java / C #):
SumVisitor sumVisitor = new SumVisitor();
collection.AcceptVisitor(sumVisitor);
int sum = sumVisitor.GetSum();
Объект посетителя что-то делает для каждого элемента коллекции, который он посещает, например, обновить поле счетчика суммы. Но у него нет контроля над тем, как или когда он вызывается коллекцией, следовательно, инверсия управления . Вы также можете реализовать MedianVisitor
, MeanVisitor
, MaximumVisitor
и так далее. Каждый из них реализует общий интерфейс IVisitor
с методом Visit(Element)
.
Для коллекции верно обратное: он не знает, что делает посетитель, и просто заботится об управлении потоком, вызывая visitor.Visit(element)
для каждого элемента в коллекции. Различные реализации посетителей выглядят одинаково для коллекции.
Инверсия управления и построение графов объектов
В этом случае «контроль» означает «контроль над тем, как компоненты создаются и соединяются вместе».
В любом нетривиальном приложении код разбивается на компоненты, которые должны взаимодействовать. Чтобы сохранить компоненты для повторного использования, они не могут напрямую создавать друг друга, так как это навсегда склеит их вместе. Вместо этого отдельные компоненты отказываются от управления над конструкцией и подключением компонентов.
Внедрение зависимостей - это один из способов достижения этого путем получения ссылок на объекты соавтора в конструкторе. Затем вам понадобится отдельный фрагмент кода запуска, где все компоненты создаются и соединяются вместе, или инфраструктура внедрения зависимостей, которая позаботится об этом за вас. Ваш класс Dice действительно является примером внедрения зависимости.
Еще один способ отказаться от управления построением графов объектов - это шаблон Service Locator , хотя он имеет свои недостатки .