SOLID-Prinzipien
Kurz: SOLID fasst fünf Leitlinien für wartbare objektorientierte Software zusammen: Single Responsibility, Open/Closed, Liskov Substitution, Interface Segregation und Dependency Inversion.
Genauer: Die Prinzipien stammen von Robert C. Martin („Uncle Bob“). Sie helfen, Klassen klein, austauschbar und leicht änderbar zu halten. Sie sind Faustregeln, keine Gesetze: Wer sie sklavisch befolgt, erzeugt leicht Überabstraktion.
Im Detail
| Buchstabe | Prinzip | Kurzfassung |
|---|---|---|
| S | Single Responsibility | Eine Klasse hat genau einen Grund, sich zu ändern. |
| O | Open/Closed | Offen für Erweiterung, geschlossen für Änderung. |
| L | Liskov Substitution | Unterklassen müssen sich überall wie ihre Oberklasse verwenden lassen. |
| I | Interface Segregation | Lieber mehrere kleine Schnittstellen als eine große. |
| D | Dependency Inversion | Hohe Ebenen hängen von Abstraktionen ab, nicht von Details. |
S: Single Responsibility
# Zu viel in einer Klasse: Berechnung, Speicherung UND Ausgabe
class Rechnung:
def berechne(self): ...
def speichere_in_datenbank(self): ...
def drucke_pdf(self): ...
# Besser: getrennt
class Rechnung: ... # nur Daten und Berechnung
class RechnungRepository: ... # speichert
class RechnungDrucker: ... # drucktO: Open/Closed
Neue Rabattarten sollen ohne Änderung bestehender Klassen hinzukommen: Eine gemeinsame Schnittstelle (Rabatt) und jeweils eine neue Klasse (StudentenRabatt) statt einer wachsenden if/else-Kette (siehe Strategy-Muster).
L: Liskov
Ein Quadrat, das von Rechteck erbt und setBreite so ändert, dass auch die Höhe wechselt, verletzt die Erwartung an ein Rechteck. Die Vererbung (Vererbung) muss echte „ist ein“-Beziehungen abbilden.
I und D
Ein Drucker-Interface mit drucken, scannen und faxen zwingt einfache Drucker, unnütze Methoden zu implementieren – besser drei kleine Schnittstellen. Dependency Inversion wird mit Dependency Injection umgesetzt.
Siehe auch: Dependency Injection, Clean Code, OOP, Schnittstelle