L'injection de dépendances

Fournir à un objet ses dépendances au lieu de les lui faire créer : injection par constructeur, par mutateur, rôle de l'assembleur ou du conteneur, et effet sur les tests.

  • 30 cartes
  • 5 thèmes
  • Gratuit

Le programme, thème par thème

Le poids de chaque thème suit celui que lui donne l'examen.

  1. Notions
  2. Questions
  3. Ranger et relier
  4. Mises en situation
  5. Comprendre

Quelques cartes du deck

  • Dépendance : de quoi s'agit-il ?

    Voir la réponse

    Objet dont une classe a besoin pour accomplir son travail : un service d'envoi, un accès aux données, une horloge.

    Le problème n'est pas d'avoir des dépendances, c'est de les créer soi-même avec new : la classe se retrouve attachée à une implémentation précise.

  • Quelle version de Commande applique l'injection par constructeur ?

    • Commande(Notifieur n) { this.n = n; }
    • Commande() { this.n = new ServiceMail(); }
    • void setNotifieur(Notifieur n) { this.n = n; }
    • Commande() { this.n = Notifieurs.parDefaut(); }, une fabrique statique
    Voir la réponse

    Commande(Notifieur n) { this.n = n; }

    La première reçoit sa dépendance à la création. La deuxième est une injection par mutateur. Les deux autres créent ou cherchent elles-mêmes leur dépendance : la classe reste liée à une implémentation.

  • Une classe qui crée elle-même sa dépendance concrète avec … est liée à cette implémentation et ne peut plus être testée avec une fausse.

    Voir la réponse

    Une classe qui crée elle-même sa dépendance concrète avec new est liée à cette implémentation et ne peut plus être testée avec une fausse.

    Le mot-clé new dans le code métier est le signal à chercher : la création appartient à l'assembleur, pas à la classe qui utilise l'objet.

  • Injection de dépendances : de quoi s'agit-il ?

    Voir la réponse

    Technique qui consiste à fournir à un objet, de l'extérieur, les objets dont il a besoin, au lieu qu'il les construise lui-même.

    La classe ne connaît plus que l'interface de ce qu'elle utilise ; on peut changer l'implémentation, par exemple pour un test, sans la toucher.

  • Commande crée elle-même son service avec new ServiceMail(). Les tests envoient de vrais mails à chaque exécution. Quelle correction ?

    • Mettre ServiceMail en singleton et l'appeler par ServiceMail.instance()
    • Définir une interface Notifieur, que Commande reçoit par son constructeur
    • Déplacer le new ServiceMail() dans une méthode privée de Commande
    • Désactiver l'envoi dans ServiceMail quand une variable d'environnement le demande
    Voir la réponse

    Définir une interface Notifieur, que Commande reçoit par son constructeur

    Un singleton ou une méthode privée gardent Commande liée à ServiceMail. Le drapeau d'environnement place du code de test dans le code de production. Seule l'injection permet de passer une doublure qui n'envoie rien.