Abhängigkeitsinjektion in C++: Ein einfacher Leitfaden für Anfänger

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einführung in Dependency Injection in C++



Wenn Sie gerade erst anfangen, C++ zu lernen, schreiben Sie einfache Programme, bei denen Klassen ihre Abhängigkeiten direkt erstellen. Zum Beispiel erstellt die Klasse Car selbst ein Objekt Engine. Das funktioniert für kleine Projekte, aber wenn der Code wächst, führt dieser Ansatz zu ernsthaften Problemen: Der Code wird fest gekoppelt, schwer zu testen und zu ändern.



Dependency Injection (DI) ist ein Entwurfsmuster, bei dem ein Objekt seine Abhängigkeiten von außen erhält, anstatt sie selbst zu erstellen. Dies ist eines der Schlüsselprinzipien von SOLID, nämlich das Prinzip der Abhängigkeitsumkehr (Dependency Inversion Principle).



In diesem Artikel werden wir untersuchen, was Dependency Injection in C++ ist, warum sie benötigt wird und wie man sie in der Praxis anwendet. Sie werden sehen, wie dieses Muster den Code flexibel, testbar und wartbar macht.



Warum ohne DI schlecht: Das Problem der festen Kopplung



Stellen Sie sich vor, Sie schreiben ein Smart-Home-Steuerungssystem. Es gibt eine Klasse SmartLight, die eine Glühbirne steuert. In einer naiven Implementierung erstellt sie selbst ein Objekt Bulb:



#include <iostream>#include <string>

class Bulb {public: void turnOn() { std::cout << "Glühbirne eingeschaltet"; } void turnOff() { std::cout << "Glühbirne ausgeschaltet"; }};

class SmartLight {private: Bulb bulb; // Feste Abhängigkeitpublic: void activate() { bulb.turnOn(); } void deactivate() { bulb.turnOff(); }};

int main() { SmartLight light; light.activate(); return 0;}


Welche Probleme gibt es hier?



  • Feste Kopplung: SmartLight ist untrennbar an Bulb gebunden. Wenn Sie eine andere Glühbirne verwenden möchten (z.B. eine intelligente LED oder Phillips Hue), müssen Sie den Code der Klasse ändern.
  • Schwierigkeit beim Testen: Sie können die echte Glühbirne in Unit-Tests nicht durch einen "Platzhalter" (Mock) ersetzen.
  • Verletzung des SRP: Die Klasse SmartLight macht zwei Dinge: Sie steuert die Glühbirne und erstellt sie.


Dies ist ein klassisches Beispiel für feste Kopplung (tight coupling), die Dependency Injection beseitigen soll.



Was ist Dependency Injection in C++: Grundlegende Konzepte



Dependency Injection (DI) ist eine Technik, bei der ein Objekt seine Abhängigkeiten (normalerweise über den Konstruktor, Setter oder ein Interface) von einer externen Quelle erhält, anstatt sie selbst zu erstellen. Die Grundidee: „Frage nicht, was du brauchst – es wird dir gegeben“.



In C++ wird DI umgesetzt durch:



  • Schnittstellen (abstrakte Klassen): Abhängigkeiten werden über abstrakte Typen deklariert, nicht über konkrete Klassen.
  • Konstruktor mit Parametern: Abhängigkeiten werden über den Konstruktor übergeben (die gebräuchlichste Methode).
  • Setter: Abhängigkeiten werden nach der Erstellung des Objekts gesetzt.
  • Abhängigkeitscontainer: Spezielle Bibliotheken, die Abhängigkeiten automatisch erstellen und injizieren (z.B. boost.di).


Lassen Sie uns das Beispiel mit dem intelligenten Licht unter Verwendung von DI umschreiben:



#include <iostream>#include <memory>

// Abstraktes Interface für die Glühbirneclass IBulb {public: virtual void turnOn() = 0; virtual void turnOff() = 0; virtual ~IBulb() = default;};

// Konkrete Implementierung: Normale Glühbirneclass Bulb : public IBulb {public: void turnOn() override { std::cout << "Glühbirne eingeschaltet"; } void turnOff() override { std::cout << "Glühbirne ausgeschaltet"; }};

// Andere Implementierung: LED-Glühbirneclass LedBulb : public IBulb {public: void turnOn() override { std::cout << "LED-Glühbirne eingeschaltet"; } void turnOff() override {

Blogs

Buchempfehlungen