349 votes

Quels sont les inconvénients à l’utilisation d’Injection de dépendance ?

Je suis en train d'introduire DI comme un modèle ici à l'œuvre et l'un de nos développeurs voudrais savoir: qu'est - Ce- le cas échéant - sont les inconvénients à l'utilisation de l'Injection de Dépendance modèle?

Remarque, je suis à la recherche ici un - si possible - liste exhaustive, et non pas subjective de discussion sur le sujet.


Précisions: je parle de l'Injection de Dépendance modèle (voir cet article de Martin Fowler), pas d'un cadre spécifique, que ce soit basé sur XML (comme le Printemps) ou à base de code (comme Guice), ou "roulées".


Edit: Quelques grands la poursuite de la discussion / délires / débat /r/programmation ici.

227voto

Håvard S Points 11152

Un couple de points:

  • DI augmente la complexité, généralement en augmentant le nombre de classes car les responsabilités sont séparés de plus, ce qui n'est pas toujours bénéfique
  • Votre code sera (un peu) couplé à l'injection de dépendance cadre que vous utilisez (ou plus généralement la façon dont vous décidez de mettre en œuvre la DI motif)
  • DI conteneurs ou des approches qui effectuent type de résoudre généralement subir une légère exécution de pénalité (très négligeable, mais il est là)

En général, le bénéfice de découplage rend chaque tâche plus simple à lire et à comprendre, mais augmente la complexité de l'orchestration des tâches les plus complexes.

199voto

Steve314 Points 12599

Le même problème de base, vous obtenez souvent avec la programmation orientée objet, les règles de style, et à peu près tout le reste. Il est possible - très fréquent, en effet, à trop en faire abstraction, et d'ajouter trop d'indirection, et plus généralement pour appliquer les bonnes techniques de manière excessive et dans les mauvais endroits.

Chaque modèle ou d'autres construction d'appliquer amène de la complexité. L'Abstraction et l'indirection éparpillement de l'information autour de, parfois émouvant détail sans importance, mais aussi parfois difficile de comprendre exactement ce qui se passe. Chaque règle d'appliquer apporte de la rigidité, ce qui exclut les options que peut-être la meilleure approche.

Le point est d'écrire du code qui fait le travail et est robuste, lisible et maintenable. Vous êtes un développeur de logiciel, pas une tour d'ivoire builder.

EDIT - UN couple de liens pertinents...

http://thedailywtf.com/Articles/The_Inner-Platform_Effect.aspx

http://www.joelonsoftware.com/articles/fog0000000018.html

MODIFIER

Comme j'ai eu un coup de réputation de boost à partir de cela, j'ai décidé d'ajouter un peu plus précisément sur l'injection de dépendance.

Probablement la forme la plus simple de l'injection de dépendance (ne riez pas) est un paramètre. Le code dépendant dépend des données, et que les données sont injectées par les moyens de transmission du paramètre.

Oui, c'est idiot, et il n'a pas d'adresse orientée objet, le point de l'injection de dépendance, mais un programmeur fonctionnel vous dire que (si vous avez d'abord des fonctions de classe) c'est le seul type de l'injection de dépendance dont vous avez besoin. Le point ici est de prendre un exemple trivial, et de montrer le potentiel de problèmes.

Vous permet de profiter de cette simple fonction traditionnelle - syntaxe C++ n'est pas important ici, mais je dois préciser quelque sorte...

void Say_Hello_World ()
{
  std::cout << "Hello World" << std::endl;
}

J'ai une dépendance je veux extraire et injecter - le texte "Hello World". Assez facile...

void Say_Something (const char *p_text)
{
  std::cout << p_text << std::endl;
}

Comment est-ce plus rigides que les originaux? Eh bien, si je décide que la sortie doit être en unicode. J'ai probablement ne souhaitez pas utiliser std::cout de std::wcout. Mais cela signifie que mes cordes alors être de wchar_t, pas de char. Chaque appelant doit être changé, ou (plus raisonnable), de la vieille mise en œuvre sera remplacé par un adaptateur qui convertit la chaîne et appelle la nouvelle mise en œuvre.

C'est le travail de maintenance là qui ne sont pas nécessaires si nous avions conservé l'original.

Et si cela semble trivial, jetez un oeil à ce monde réel, la fonction de l'API Win32...

http://msdn.microsoft.com/en-us/library/ms632680%28v=vs.85%29.aspx

C'est 12 "dépendances" à traiter. Par exemple, si les résolutions d'écran vraiment énorme, peut-être que nous aurons besoin de 64 bits coordonner des valeurs et une autre version de CreateWindowEx. Et oui, il y a déjà une version plus ancienne encore traîner, qui, vraisemblablement, est tracé à la version la plus récente en coulisses...

http://msdn.microsoft.com/en-us/library/ms632679%28v=vs.85%29.aspx

Ces "dépendances" ne sont pas seulement un problème pour le développeur d'origine - tout le monde qui utilise cette interface a qu'à regarder ce que les dépendances sont, comment ils sont, et ce qu'ils signifient, et que faire pour leur application. C'est là que les mots "valeurs par défaut raisonnables" peuvent rendre la vie beaucoup plus simple.

Orientée objet injection de dépendance n'est pas différent dans son principe. L'écriture d'une classe est une surcharge, à la fois dans le code source du texte et dans le temps dans le révélateur, et si cette classe est écrite pour la fourniture de dépendances selon certains objets dépendants spécifications, alors dépendante de l'objet est verrouillé dans le soutien de cette interface, même si il y a un besoin de remplacer la mise en œuvre de cet objet.

Rien de tout cela devrait être lu comme affirmant que l'injection de dépendance est mauvais, loin de là. Mais toute bonne technique peut être appliquée de manière excessive et au mauvais endroit. Tout comme chaque chaîne doit être extraite et transformée en paramètre, pas chaque de bas niveau comportement doit être extrait à partir de haut niveau des objets et de les transformer en une injection de dépendance.

81voto

Epaga Points 12717

Voici ma propre réaction initiale : essentiellement les mêmes inconvénients de n’importe quel modèle.

  • Il faut du temps pour apprendre
  • si mal compris il peut conduire à plus de mal que de bien
  • Si à l’extrême, il peut être plus de travail que justifierait l’avantage

48voto

kyoryu Points 8281

Le plus grand « inconvénient » d’Inversion de contrôle (pas tout à fait DI, mais assez proche), c’est qu’elle tend à supprimer ayant un seul point à regarder un aperçu d’un algorithme. C’est fondamentalement ce qui arrive quand vous avez découplé, bien que le code - la possibilité de regarder en un seul endroit est un artefact de couplage étroit.

41voto

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X