Les plaintes concernant IoC sont faciles à comprendre : IoC transforme quelque chose de simple en quelque chose de compliqué. Disons que vous voulez faire quelque chose à chaque élément d'une liste (en pseudocode) :
for each i in list:
do_something(i)
L'IoC, essentiellement, consiste à transférer la responsabilité de l'itération de la boucle à quelqu'un d'autre. Ainsi, nous nous retrouvons avec quelque chose comme ça :
ioc = new IocContainer()
ioc.register_callback(do_something)
ioc.go()
Remarquez que même dans cette forme simple, le code est plus long que l'original... et c'est sans compter l'implémentation de IocContainer.
Ensuite, dans sa forme la plus sophistiquée, l'IocContainer peut être initialisé statiquement ou par une fonction Main() statique ou quelque part d'autre caché, et les fonctions register_callback() sont appelées automatiquement en fonction d'un autre code qui itère à travers un fichier XML qui liste toutes vos fonctions do_something() et (parfois) même le contenu des listes à itérer.
Hourra, le fichier XML a rendu votre logiciel plus configurable ! C'est vrai ? Vous pouvez changer ce qui est fait dans votre liste en modifiant un simple fichier texte !
Sauf que, ironiquement, votre code source est maintenant plus longtemps et plus difficile à comprendre, il dépend de toutes sortes de nouvelles bibliothèques, éventuellement boguées (y compris IocContainer et un analyseur XML), et vous l'avez rendu plus difficile à maintenir : Le code XML est plus difficile à comprendre et à modifier que la boucle originale en code source simple (quel que soit le langage dans lequel la boucle est écrite). Vous avez également moins de contrôle sur la manière exacte dont vous voulez effectuer l'itération (triée ou non triée ? en profondeur ou en largeur ?) puisque IocContainer vous enlève cette responsabilité.
Pour des choses comme les plugins, il peut être judicieux d'utiliser IoC, car il est logique pour que l'application principale ait le contrôle du processus d'exécution, et qu'elle puisse simplement demander de l'aide au plugin ici et là. Cela s'appelle "fournir des crochets" et existe depuis bien plus longtemps que la terminologie IoC.
Pour des choses comme les tests unitaires (c'est là que je le vois le plus souvent utilisé), IoC s'avère généralement inutile, parce que vos tests doivent être capables de simuler une grande variété de situations bizarres, et IoC s'y oppose constamment.
L'hypothèse fondamentale de l'IoC est que le chargement de données et le bouclage sont en quelque sorte difficiles et doivent être supprimés ; cette hypothèse n'est tout simplement pas vraie, parce que cela n'a jamais été plus de quelques lignes de toute façon (ou vous pourriez le déplacer vers une fonction distincte), et même si elle a économisé du code, elle réduit votre flexibilité.