Das Dependency Inversion Principle ist das letztgenannte der fünf Prinzipien für gutes Software-Design gemäss SOLID. Dies soll jedoch nicht heissen, dass es das am wenigsten Wichtige der fünf ist, oder dass mit dass den zahlreichen Prinzipien neben SOLID (DRY, YAGNI, KISS...) keine Beachtung geschenkt werden soll!
Die SOLID-Prinzipien verlangen, dass der Quellcode gewisse Eigenschaften und Strukturen aufweist, geben jedoch keine Vorgaben, wie diese Strukturen umzusetzen sind.
Alle diese Fragen und Herausforderungen können mit dem Dependency Inversion Principle gelöst werden! Viel mehr kann sogar gesagt werden, dass das Dependency Inversion Principle eine Implikation des OCP und LSP ist, und man den anderen Prinzipien nicht folgen kann, ohne auch dem DIP zu folgen.
Das Prinzip wurde 1996 von Robert C. Martin beschrieben und mit dem Namen "Dependency Inversion Principle" versehen. Die Kernaussagen sind:
A. High level modules should not depend upon low level modules. Both should depend upon abstractions.
B. Abstractions should not depend upon details. Details should depend upon abstractions.
Robert C. Martin, "The Dependency Inversion Principle", 1996
Um diese Aussagen richtig zu verstehen, ist es nötig, die verwendeten Begriffe in diesem Zusammenhang genau zu beschreiben:
In seinem Artikel beschreibt Robert C. Martin drei Eigenschaften, welche zu schlechter Software-Qualität führen können, und mit dem Dependency Inversion Principle vermieden werden können:
Die Bezeichnung "Dependency Inversion Principle" impliziert, dass ein Vergleich gezogen wird zu einer anderen Art, Software zu strukturieren, und diese Struktur dann invertiert wird.
Der Vergleich wird gezogen zu "traditionellen" Software-Strukturen. Bei diesen wird die Applikation schrittweise von den Low-level Klassen (z.B. das Framework) zu den High-level Klassen (Logik und UI) auf den darunterliegenden Modulen aufgebaut, und damit Abhängigkeiten erstellt. Dies hat zur Folge, dass sich eine Änderung in den Low-level Modulen durch die gesamte Applikation ziehen würde --> Abhängigkeiten sind transitiv. Bei einer MVC-Applikation könnte das Layering also so aussehen:
Mit dem Dependency Inversion Principle hingegen würden die Layer schematisch so aussehen:
Das Dependency Inversion Principle kann aber sehr wohl auch innerhalb eines Layers zur Verwendung kommen, insbesondere bei Micro-Service-Architekturen.