SOLID-Prinzipien in C++: Theorie und Praxis von A bis Z

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

SOLID-Prinzipien in C++: Theorie und Praxis von A bis Z



SOLID ist ein Akronym, das fünf grundlegende Prinzipien der objektorientierten Programmierung und des Designs bezeichnet, formuliert von Robert C. Martin (auch bekannt als "Uncle Bob"). Für C++ sind diese Prinzipien besonders wichtig, da sie die Erstellung von flexiblem, wartbarem und testbarem Code ermöglichen, der leicht skalierbar ist. In diesem Artikel analysieren wir jedes Prinzip aus theoretischer Sicht und untermauern es mit praktischen Beispielen in C++.



Was ist SOLID und warum wird es benötigt?

SOLID ist eine Reihe von Regeln, die dem Entwickler helfen, "schlechten" Code zu vermeiden. Die Einhaltung dieser Prinzipien führt zu einer Verringerung der Kopplung (coupling) und einer Erhöhung der Kohäsion (cohesion) von Modulen. In C++, wo die leistungsstarken Möglichkeiten von Templates und Mehrfachvererbung leicht zu Chaos führen können, dient SOLID als zuverlässiger Kompass. Jeder Buchstabe des Akronyms steht für Folgendes:

  • S — Single Responsibility Principle (Prinzip der einzigen Verantwortung)
  • O — Open-Closed Principle (Prinzip der Offenheit/Geschlossenheit)
  • L — Liskov Substitution Principle (Liskovsches Substitutionsprinzip)
  • I — Interface Segregation Principle (Prinzip der Schnittstellentrennung)
  • D — Dependency Inversion Principle (Prinzip der Abhängigkeitsumkehr)


Prinzip der einzigen Verantwortung (Single Responsibility)

Theorie: Eine Klasse sollte nur einen Grund für eine Änderung haben. Mit anderen Worten, die Klasse sollte nur für einen Teil der Funktionalität des Programms verantwortlich sein.

Praxis in C++: Die Verletzung dieses Prinzips führt oft zu "gottähnlichen Objekten", die alles auf einmal erledigen.

// ❌ Schlecht: Klasse verletzt SRPclass Report {public:    void generateReport() { /* Datengenerierung */ }    void saveToFile(const std::string& filename) { /* Dateischreiben */ }    void printReport() { /* Drucken */ }};

// ✅ Gut: Verantwortung aufteilenclass ReportData {public: std::string generate() { return "Report data"; }};

class ReportSaver {public: void save(const std::string& data, const std::string& filename) { std::ofstream file(filename); file << data; }};

class ReportPrinter {public: void print(const std::string& data) { /* Drucken */ }};

Im guten Beispiel ist jede Klasse für ihre eigene Aufgabe verantwortlich. Dies vereinfacht das Testen und die Änderung des Codes.



Prinzip der Offenheit/Geschlossenheit (Open-Closed)

Theorie: Softwareentitäten (Klassen, Module, Funktionen) sollten für Erweiterungen offen, aber für Modifikationen geschlossen sein.

Praxis in C++: Erreicht wird dies durch Abstraktion und Polymorphie.

// ❌ Schlecht: Um eine neue Form hinzuzufügen, muss der Code geändert werdenclass AreaCalculator {public:    double calculateArea(std::string shapeType, double param) {        if (shapeType == "circle") {            return 3.14 * param * param;        } else if (shapeType == "square") {            return param * param;        }        return 0.0;    }};

// ✅ Gut: Polymorphie verwendenclass Shape {public: virtual double area() const = 0; virtual ~Shape() = default;};

class Circle : public Shape { double radius;public: Circle(double r) : radius(r) {} double area() const override { return 3.14159 * radius * radius; }};

class Square : public Shape { double side;public: Square(double s) : side(s) {} double area() const override { return side * side; }};

class AreaCalculatorOCP {public: double calculate(const Shape& shape) { return shape.area(); }};

Jetzt muss zum Hinzufügen einer neuen Form (z. B. eines Dreiecks) der Code A

Blogs

Buchempfehlungen