Жалобы на IoC легко понять: IoC превращает что-то простое в нечто сложное. Допустим, вы хотели сделать что-то для каждого элемента списка (в псевдокоде):
for each i in list:
do_something(i)
IoC, по сути, перекладывает ответственность за итерацию цикла на кого-то другого. Таким образом, мы получаем нечто более похожее на это:
ioc = new IocContainer()
ioc.register_callback(do_something)
ioc.go()
Обратите внимание, что даже в этой простой форме код длиннее исходного ... и это не считая реализации IocContainer.
Затем, в своей самой причудливой форме, IocContainer может быть инициализирован статически или статической функцией Main () или где-то еще скрытым, а функции register_callback () вызываются автоматически на основе некоторого другого кода, который перебирает XML-файл. который перечисляет все ваши функции do_something () и (иногда) даже содержимое списков, чтобы перебрать их.
Да, XML-файл сделал вашу программу более настраиваемой! Правильно? Вы можете изменить то, что сделано с вашим списком, просто изменив простой текстовый файл!
За исключением того, что по иронии судьбы ваш исходный код теперь длиннее и его сложнее понять, он зависит от всех видов новых, возможно, с ошибками, библиотек (включая IocContainer и анализатор XML), и вы на самом деле его было сложнее поддерживать: XML-код труднее понимать и редактировать, чем исходный простой цикл исходного кода (независимо от того, на каком языке написан цикл). У вас также меньше контроля над тем, как именно вы хотите выполнять итерации (отсортированные или несортированные? Сначала по глубине или по ширине?), Поскольку IocContainer снимает с вас эту ответственность.
Для таких вещей, как плагины, может иметь смысл использовать IoC, поскольку логично , чтобы основное приложение контролировало процесс выполнения, и просто попросило плагин о помощи здесь и там. Это называется «предоставлением хуков» и существует намного дольше, чем терминология IoC.
Для таких вещей, как модульные тесты (вот где я обычно видел, как это происходит), IoC обычно оказывается бесполезным, потому что ваши тесты должны иметь возможность имитировать широкий спектр нечетных ситуаций, а IoC просто постоянно мешает этому.
Фундаментальное допущение IoC заключается в том, что загрузка данных и циклическая обработка данных как-то затруднительны и должны быть исключены; это предположение просто неверно, потому что в любом случае оно никогда не превышало пары строк (или вы могли бы переместить его в отдельную функцию), и даже если оно сохраняло код, это снижает вашу гибкость.