Description du Patron de Conception Injection de Dépendance
Contexte
Dans la programmation orientée objet, le résultat attendu de notre système est généralement issu de la collaboration de plusieurs objets. C’est à dire que les objets communiquent ensemble afin de produire le résultat escompté. Par exemple un objet A peut avoir besoin du service proposé par l’objet B, pour la bonne exécution de sa tâche. Ainsi, nous disons que l’objet B est une dépendance pour l’objet A.
Problème
Comment donner à l’objet A, une instance de l’objet B afin qu’il exécute sa tâche?
Solution
L’injection de dépendance est donc le fait d’injecter l’instance d’un objet dans un autre objet.
L’objet B est injecté automatiquement dans l’objet A, sans que ce dernier n’a à le le faire lui même.
Avantages
- Offre une facilité pour tester l’application.
- Réduit le couplage fort entre les différents objets.
- Augmente la cohésion.
- Accroît la maintenabilité de l’application.
Exemple
Dans ce petit exemple nous nous rendons compte que ClassA dépends de ClassB pour la bonne exécution de sa tâche. ClassA peut très bien construire une instance de l’object ClassB dont il dépends, en se servant de l’opérateur ‘new‘ de java.
class ClassA {
private ClassB classB;
public ClassA() {
this.classB = new ClassB();
}
public void methodeA(){};
}
class ClassB {
public ClassB(){}
public void methodeB(){};
}
Cependant ceci est une mauvaise pratique et entraine enormément de désavantage (à l’instar d’un fort couplage entre les 2 objets) comme présenter à l’exemple ci-dessous.
Pour la mise en oeuvre de l’injection de dépendance, nous aurons donc besoin d’un système ou outil qui nous permettra, d’injecter dynamiquement les dépendances entre les objets, ce qui introduit la notion d’inversion de contrôle.
On parle d’inversion de contrôle car ClassA n’a aucun contrôle sur comment et quand ClassB est instancié. Tout ce qu’il reçoit c’est une instance de de ClassB dont il a besoin. C’est donc l’outil chargé d’injecter la dépendance, qui contrôle quand et comment instancier et injecter une dépendance.
Bien que nous pouvons nous même implémenter un système qui nous permette d’injecter dynamiquement des dépendances, nous ne le ferons pas ici car il existe déjà des outils assez robuste et qui ont fait leur preuve.
Un de ces outils est le framework spring, qui est l’un des plus utilisé pour l’injection des dépendances dans la sphère du développement Java.