Injection de dépendances

Aujourd’hui, il est indispensable de passer sur l’injection de dépendances pour des projets durables. L’importance est de faciliter les dépendances entre vos classes.

Définition

Wikipédia est toujours une bonne référence et explique bien ce qu’est l’injection de dépendances fr.wikipedia.org/wiki/Injection_de_dépendances.

Quasiment chaque langage de programmation a son injection de dépendances. Ce n’est pas un outil compliqué car il n’est pas nécessaire d’avoir une librairie pré-compilée pour faire ce travail : vous pouvez le faire directement dans le langage.

Dépendance ?

Votre code a souvent des dépendances vers d’autres classes, c’est bien normal. Cela dépend du langage mais je vais essayer de faire une synthèse.

class Foo {
    public function __construct() {
        $this->bar = new Bar();
    }
}

Vous pouvez voir une dépendance entre la classe Foo et Bar, sans injection. Il y a 2 types d’injections de dépendances pour moi, par le constructeur ou par un appel à une méthode.

class Foo {
    public function __construct(Bar $bar) {
        $this->bar = $bar;
    }
    // ou ..
    public function setBar(Bar $bar) {
        $this->bar = $bar
    }
}

Mais on peut aller encore plus loin car on peut créer une dépendance avec des interfaces, et c’est mieux ! Vous pouvez également le faire via une factory (plus rare) : cela crée plus de dépendances car votre classe sera dépendante de la factory et de ce qu’elle récupère de celle-ci. Dans du langage faiblement typé, vous devrez tester le return de la fonction create ou faire confiance à la classe Factory.

class Foo {
    public function __construct(BarFactory $factory) {
        $this->bar = $factory->create();
    }
    public function setBar(BarInterface $bar) {
        $this->bar = $bar;
    }
}

Injection ?

Les types d’injections de dépendances se complètent. Par exemple on peut faire un constructeur qui demande l’interface d’une factory. Dans le cas de la dépendance, il y a donc 2 façons d’injecter les classes.

En interne, c’est-à-dire directement dans la classe (très lié au premier cas de dépendance).

class Foo {
    public function __construct(BarInterface $bar) {
        $this->bar = $bar;
    }
}
 
$a = new Foo(new Bar());

En externe, ce que je préfère, c’est-à-dire via des fichiers de configuration (XML, YAML, etc.), comme on peut le voir dans Symfony via le service container. Pour information, Symfony est un framework PHP SOA.

Pourquoi autant de moyens pour l’injection de dépendances ?

Attention je n’ai pas dit qu’il y avait strictement que 2 façons d’avoir des dépendances et de les injecter.

En réalité, cela dépend des langages de programmation. Il pourrait y en avoir plus, par exemple via un objet de configuration, via des variables static, public, ou même directement de l’injecteur.
Par contre, on ne fait pas de méthode qui serait le seul point d’entrée aux dépendances (exemple : « injectionDependances(*instances) ») : même s’il y a des cas exceptionnels, cela ne rime à rien ! L’injection de dépendances est un design pattern. De toute façon, la méthode d’injection dépend du besoin métier et de ce que l’on veut obtenir.

Ce qu’il faut retenir, c’est que vous pouvez créer plusieurs objets d’une même classe qui pourront avoir une fonction métier tout à fait différente selon l’injection de dépendances, et ainsi préserver un projet entièrement homogène, configurable et extensible.

L’exemple PHP

PHP a plusieurs projets pour l’injection de dépendances dont 5 qui me viennent à l’esprit :

  • Pimple pimple.sensiolabs.org : simple et efficace qui a pour but d’être petit, rapide et suffisant.
  • Twittee github.com/fabpot/twittee : un injecteur de dépendances de moins de 140 caractères (mon préféré et plus drôle).
  • DependencyInjection github.com/symfony/DependencyInjection : composant Symfony très complet et puissant.
  • DI php-di.org : projet intégré dans Zend (mais non spécifique à celui-ci) qui a pour objectif d’unifier un peu toutes ces librairies. Il ne fait pas parti du FIG (Framework Interop Group).

Pour moi, l’injection de dépendances dans un projet est quelque chose de primordiale d’obligatoire : cela coûte seulement le temps d’écrire les ID de vos classes et évite de faire du Singleton partout dans votre projet (ce qui quelque soit le contexte, n’est pas négligeable).

Pour finir, il existe un tutoriel français pour expliquer, sur le tas, comment faire de l’injection de dépendances dans votre projet :
fr.openclassrooms.com/informatique/cours/introduction-a-l-injection-de-dependances-en-php

 

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *