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