Injection de dépendances en C++

Publié dans C / C++ | Marqué avec , , , ,
Share

L’injection de dépendances, que l’on retrouve généralement sous le terme de dependency injection (DI pour les intimes) est un concept de programmation très simple.

Pistolet à injection

Pistolet à injection (de dépendances of course)

L’idée de base c’est de ne pas faire ça :

class Foo {
    private Bar bar;

    public Foo() {
        bar = new Bar();
    }
}

Mais ça :

class Foo {
    private IBar bar;

    public Foo(IBar bar) {
        this->bar = bar;
    }
}

Ce n’est alors plus la classe Foo qui instancie son Bar. On a un découplage entre ces deux classes ! Foo sait qu’elle va utiliser une instance de l’interface IBar, mais elle ne sait pas laquelle. Qu’importe ! Une autre classe lui transmettra une instance de Bar en production, ou bien une instance de BarTest dans le cadre d’un test unitaire.

Voilà. Cette technique est résolument et implacablement utilisée en Java, notamment grâce à Spring qui offre une manière très simple et puissance de gérer l’injection de dépendances. Et c’est formidable ! Pour les tests, pour la réutilisation du code… Magique !
Cette technique est aussi poussée en PHP, grâce à Symfony2 je trouve qu’on la retrouve de plus en plus. De même en Javascript, grâce à Node.js.

Et en C++ ? Des frameworks comme Qt devrait sûrement proposer un outils pour faciliter ce type de programmation (et permettre d’en tirer partie). Apparemment, ce n’est pas une priorité. Alors il y a tout un tas d’outils qui flottent dans la netosphère :

Toutes ces propositions ne me plaisent pas vraiment… Trop intrusives. Trop de code à écrire.
Cependant, je suis tombé l’autre jour sur un article assez formidable « Depencency injection in C++ » cherchant à démontrer qu’il faut peut-être faire différemment en C++. L’injection de dépendance : oui ! Mais à la mode C++, avec des templates. Ce qui pause malgré tout quelques problèmes d’instanciation et de destruction… à étudier malgrè tout.

Au final, je préfère vraiment me contenter d’architecturer mon code pour lui permettre de gérer l’injection de dépendances, et de me contenter de coder des Factory pour l’instant. Jusqu’à ce qu’une solution propre, légère et stable voit le jour.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*