Sur la page Wikipedia sur l' injection de dépendance, la section des inconvénients nous dit ceci:
L'injection de dépendance augmente le couplage en obligeant l'utilisateur d'un sous-système à répondre aux besoins de ce sous-système.
avec un lien vers un article contre l'injection de dépendance .
L'injection de dépendance fait qu'une classe utilise l'interface au lieu de l'implémentation concrète. Cela devrait entraîner une diminution du couplage , non?
Qu'est-ce que je rate? Comment le lien de dépendance augmente-t-il le couplage entre les classes?
Réponses:
Dépendance L'injection diminue le couplage entre une classe et sa dépendance. Mais il augmente le couplage entre une classe et son consommateur (puisque le consommateur a besoin de plus d’informations pour la créer) et la dépendance et son consommateur (puisque le consommateur a besoin de connaître la dépendance à utiliser).
Très souvent, c'est un bon compromis. La classe ne devrait pas savoir les détails au sujet de ses dépendances au - delà d' une interface, et il devrait être la responsabilité de l'application de lier des bits spécifiques de code ensemble.
la source
Supposons que vous ayez un sous
S
- système qui dépend d'une connexion à une base de donnéesD
. Sans injection de dépendance, il existe un lien relativement étroit entreS
etD
, car ilS
faut savoir comment l’utiliserD
et le créer. Le reste du système peut toutefois ignorer parfaitement cette dépendance entreS
etD
.Avec l'injection de dépendance, le couplage entre
S
etD
devient plus lâche, car vous supprimez deS
la connaissance comment créer un fichierD
.S
juste besoin de savoir comment l'utiliser. Le couplage global accru provient du fait que d' autres parties du système doivent maintenant savoirD
et éventuellement en créer un. L'ampleur de cette augmentation du couplage dépend de la manière dont la dépendanceD
est injectée dansS
:S
besoin d'une dépendanceD
et éventuellement du savoir-faire pour en créer une.S
par laquelle unD
est injecté a besoin d'une dépendanceD
et éventuellement du savoir-faire pour en créer une.Dans les deux cas, le nombre de classes dépendantes
D
augmente et le savoir-faire pour créer une imageD
immobile doit être présent quelque part dans le système. Cela crée une augmentation globale du couplage.la source
S
doit fournir une usine àD
, ce qui signifie qu'il doit savoir quiS
utiliseD
(ou au moins une interface de celle-ci).Je ne suis pas du tout d'accord pour dire que cela augmente le couplage.
Sans injection de dépendance, vous avez un couplage étroit entre un sous-système et la mise en œuvre concrète de la dépendance.
Avec l'injection de dépendance, vous avez découplé le sous-système de la mise en œuvre de la dépendance.
Argumenter sur le fait qu'il augmente le couplage entre le consommateur et ce sous-système est TRÈS discutable car cela implique que le consommateur est maintenant étroitement couplé à la dépendance requise par le sous-système. Tout ce que cela signifie, c'est que vous écrivez un code étroitement couplé qui couple votre consommateur à la dépendance. Idéalement ALL votre code est découplé.
Injection de constructeur:
La résolution des dépendances est gérée par un conteneur d'injection de dépendances ou une usine. Le consommateur peut obtenir une implémentation concrète du sous-système à partir du conteneur d'injection de dépendance ou d'une usine.
Le consommateur n'a pas besoin de savoir à quoi ressemble le constructeur du sous-système. Il n'y a pas de couplage avec la dépendance du sous-système.
Méthode d'injection:
Identique à l'injection de constructeur, sauf que le consommateur doit maintenant obtenir une instance concrète de la dépendance du conteneur ou de l'usine (ou même l'injecter méthode / constructeur) et l'injecter dans la méthode. Encore une fois, le consommateur n'est pas associé à une implémentation concrète de la dépendance.
TL; DR Le pire cas d'injection de dépendance dans un sous-système est que le couplage est décalé vers le code consommateur. IL N'Y A AUCUNE AUGMENTATION GLOBALE DU COUPLAGE.
Le meilleur des cas est que tous les systèmes sont maintenant faiblement couplés et que l'injection de dépendance est contrôlée par le biais de conteneurs ou d'usines d'injection de dépendance.
la source