
Die SOLID-Prinzipien zielen darauf ab, objektorientierte Software langfristig wartbarer zu machen. In meinem Blog widme ich jedem der fünf Prinzipien einen eigenen Beitrag.
- Single Responsibility Principle
- Open-Closed Principle
- Liskov-Substitution Principle
- Interface Segregation Principle
- Dependency Inversion Principle
Das Dependency Inversion Principle (DIP) ist ein Entwurfsprinzip von Robert C. Martin. Es bildet zusammen mit vier anderen Prinzipien das Akronym SOLID und steht für dessen letzten Buchstaben. Es hat folgende Aussage:
High-level modules should not depend on low-level modules. Both should depend on abstractions. Abstractions should not depend on details. Details should depend on abstractions.
Robert C. Martin
Bedeutung des DIP
Das DIP besagt, dass zwei Module eine Beziehung nicht über ihre konkreten Implementierungen, sondern eine Abstraktion darstellen sollten. Bei der Abstraktion kann es sich um ein Interface oder eine abstrakte Klasse handeln. Diese Abstraktion spezifiziert auch die Details, also den Vertrag zur Schnittstelle zwischen den beiden Klassen.
Eine mögliche Form der Beziehung ist eine Hat-Beziehung. Ein Auto hat Räder. Eine Tür hat ein Schloss. Ein Fenster hat eine Scheibe. Auto und Rad, Tür und Schloss, Fenster und Scheibe sollen sich gemäß DIP jeweils nur über eine Abstraktion kennen. Dadurch sind beide Seiten austauschbar und können durch alternative Implementierungen ersetzt werden, solange diese die Schnittstellenspezifikationen einhalten.
Verletzung des DIP
Ein Verletzung des DIP führt zu einer engen Kopplung zwischen Modulen. Wachsen diese mit der Zeit und verletzen dann auch noch das Single Responsibility Principle (SRP), so besteht die Gefahr, dass ein Big Ball of Mud entsteht, ein Quellcode mit sehr vielen Verzahnungen und ohne erkennbare Struktur, bei dem durch die komplexen Beziehungen schon kleinste Änderungen sehr schwierig umzusetzen sind, ohne dass dabei neue Fehler eingeführt werden. Oftmals führt das Missachten des DIP zu zyklischen Abhängigkeiten, also wechselseitigen Beziehungen zwischen Modulen. Eine Änderung an einem der beiden Module, die in einer Beziehung stehen, hat dann meist zur Folge, dass das andere Modul auch angepasst werden muss.
Das DIP im Alltag
Das DIP ist wohl das beste SOLID-Prinzip um einen Bezug zur realen Welt herzustellen: Elektrogeräte werden über einen Stecker und eine Steckdose mit der Stromquelle verbunden. Die Steckdose ist dabei die Abstraktion der Stromquelle. Der Stecker ist die Abstraktion des Stromverbrauchers. Niemand würde auf die Idee kommen, einen Staubsauger direkt an das Stromnetz zu löten.
Eine Glühbirne wird über Gewinde und Fassung mit einer Lampe verbunden. Wasserhähne, Duschköpfe und Klobrillen verfügen über standardisierte Schraubanschlüsse, um installiert und auch jederzeit wieder ersetzt werden zu können. Diese Ersetzbarkeit führt zu nachhaltigen Produkten – in der realen Welt wie in der objektorientierten Programmierung.