Injection de Dépendances en C++ : guide complet pour débutants

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Qu'est-ce que l'Injection de Dépendances en C++ et pourquoi en a-t-on besoin ?

\n\n

L'Injection de Dépendances (DI) est l'un des principes clés de la programmation orientée objet, qui permet de rendre le code plus flexible, testable et maintenable. Si vous êtes débutant en C++ et que vous avez entendu des termes comme "couplage faible" ou "inversion de contrôle" sans les comprendre complètement, cet article est pour vous.

\n\n

En termes simples, l'Injection de Dépendances est une technique par laquelle un objet reçoit ses dépendances de l'extérieur, plutôt que de les créer lui-même. Au lieu que la classe crée elle-même les objets d'autres classes, ces objets sont "injectés" dans celle-ci via le constructeur, un setter ou une interface.

\n\n

Problème : couplage fort (tight coupling)

\n\n

Imaginez que vous écrivez une application pour envoyer des notifications. Sans DI, votre code pourrait ressembler à ceci :

\n\n
#include <iostream>\n#include <string>\n\nclass EmailService {\npublic:\n    void send(const std::string& message) {\n        std::cout << "Envoi d'email : " << message << std::endl;\n    }\n};\n\nclass Notification {\nprivate:\n    EmailService emailService;  // Dépendance rigide !\npublic:\n    void notify(const std::string& msg) {\n        emailService.send(msg);\n    }\n};\n\nint main() {\n    Notification notif;\n    notif.notify("Bonjour, le monde !");\n    return 0;\n}
\n\n

Dans cet exemple, la classe Notification est fortement couplée à EmailService. Si vous souhaitez ajouter des notifications SMS ou de la journalisation, vous devrez réécrire la classe Notification. Un tel code est difficile à tester, à étendre et à maintenir.

\n\n

Solution : Injection de Dépendances (Dependency Injection)

\n\n

Pour résoudre le problème du couplage fort, nous utilisons la DI. L'idée principale est de définir une interface (classe abstraite) pour le service de notification et de la transmettre à la classe Notification de l'extérieur.

\n\n

Étape 1 : Créer une interface abstraite

\n\n
#include <iostream>\n#include <string>\n#include <memory>\n\n// Interface abstraite pour tous les services de notification\nclass IMessageService {\npublic:\n    virtual ~IMessageService() = default;\n    virtual void send(const std::string& message) = 0;\n};
\n\n

Étape 2 : Implémenter les services concrets

\n\n
class EmailService : public IMessageService {\npublic:\n    void send(const std::string& message) override {\n        std::cout << "📧 Email : " << message << std::endl;\n    }\n};\n\nclass SMSService : public IMessageService {\npublic:\n    void send(const std::string& message) override {\n        std::cout << "📱 SMS : " << message << std::endl;\n    }\n};
\n\n

Étape 3 : Injecter la dépendance via le constructeur

\n\n
class Notification {\nprivate:\n    std::unique_ptr<IMessageService> service;  // Dépendance injectée de l'extérieur\npublic:\n    // Injection via le constructeur (Constructor Injection)\n    Notification(std::unique_ptr<IMessageService> svc) \n        : service(std::move(svc)) {}\n    \n    void notify(const std::string& msg) {\n        service->send(msg);\n    }\n};\n\nint main() {\n    // Créer une implémentation concrète\n    auto emailService = std::make_unique<EmailService>();\n    \n    // L'injecter dans Notification\n    Notification notif(std::move(emailService));\n    notif.notify("L'Injection de Dépendances fonctionne !");\n    \n    // Facilement passer à SMS\n    auto smsService = std::make_unique<SMSService>();\n    Notification smsNotif(std::move(smsService));\n    smsNotif.notify("Maintenant via SMS !");\n    \n    return 0;\n}
\n\n

Trois principales méthodes d'injection de dépendances en C++

\n\n

1. Constructor Injection (via le constructeur)

\n

La méthode la plus courante et recommandée. Les dépendances sont transmises lors de la création de l'objet et restent inchangées tout au long de sa vie.

\n\n
<                

Blogs

Book Recommendations