Pour ce faire correctement, nous devons d'abord définir les dépendances et l'injection.
- Dépendance: toute ressource dont une opération a besoin.
- Injection: passage de cette ressource à l'opération, généralement comme argument d'une méthode.
Un exemple rudimentaire serait une méthode qui ajoute deux valeurs. De toute évidence, cette méthode nécessite l'ajout de valeurs. S'ils sont fournis en les passant comme arguments, ce serait déjà un cas d'injection de dépendance. L'alternative serait d'implémenter les opérandes en tant que propriétés ou variables globales. De cette façon, aucune dépendance ne serait injectée, les dépendances seraient disponibles à l'extérieur en amont.
Supposons que vous utilisiez des propriétés à la place et que vous les nommiez A et B. Si vous modifiez les noms en Op1 et Op2, vous rompriez la méthode Add. Ou votre IDE mettrait à jour tous les noms pour vous, le fait est que la méthode devrait également être mise à jour car elle a des dépendances avec des ressources externes.
Cet exemple est basique mais vous pouvez imaginer des exemples plus complexes où la méthode effectue une opération sur un objet comme une image ou où elle lit à partir d'un flux de fichiers. Voulez-vous que la méthode atteigne l'image, exigeant qu'elle sache où elle se trouve? Non. Voulez-vous que la méthode ouvre le fichier lui-même, lui demandant de savoir où chercher le fichier ou même de savoir qu'il lira un fichier? Non.
Le point: réduire la fonctionnalité d'une méthode à son comportement de base et dissocier la méthode de son environnement. Vous obtenez le premier en faisant le second, vous pouvez considérer cela comme la définition de l'injection de dépendance.
Les avantages: puisque les dépendances de l'environnement de la méthode ont été éliminées, les modifications apportées à la méthode n'auront pas d'impact sur l'environnement et vice versa. => L'application devient plus facile à maintenir (modifier).