Hinweis: Dies wurde von meinem früheren Beispiel vollständig umgeschrieben
Denken Sie an Steckdosen. In jedem Land gilt die Politik auf höchster Ebene, dass Steckdosen immer gleich sind. Es spielt keine Rolle, woher Sie Ihren Strom beziehen (Kohle, Gas, Atom). Die Steckdosen an der Wand sollten immer die gleiche Strommenge über die gleichen Anschlüsse abgeben.
Jetzt können Sie jedes Gerät an diese Buchse anschließen, da alle Geräte eine gemeinsame Schnittstelle haben, den "Stecker". Die übergeordnete Richtlinie muss niemals einen Teil dieser Implementierungsdetails vorschreiben. Einfach etwas einstecken und es geht.
Wenn Sie ein Gerät haben, das keine Wechselstromversorgung benötigt - möglicherweise wird es mit einem 7-V-Gleichstromkreis betrieben -, können Sie diese übergeordnete Richtlinie weiterhin verwenden. Sie benötigen lediglich eine Art Adapter zwischen dem Netzteil und dem Gerät. Und da alle dieselbe Richtlinie auf hoher Ebene haben, kann der Hersteller dies in die Implementierung einbauen, ohne Änderungen an der Richtlinie auf hoher Ebene vorzunehmen. Die Person, die die Implementierung mit der Richtlinie verbindet (Sie schließen Ihren Laptop an), muss dies auch nicht wirklich verstehen.
Wenn der Hersteller dasselbe Gerät in einem anderen Land verkaufen möchte, muss er lediglich einen anderen Adapter entwickeln. Dieselbe Implementierung kann also mit mehreren Richtlinien arbeiten, während dieselbe Richtlinie mehrere Implementierungen ausführen kann.
Dies ist ein perfektes Beispiel für die Abhängigkeitsinversion.
Aber hier ist das Interessante: Kehren Sie zu dem zurück, was ich zuerst gesagt habe. "Es ist egal, woher Sie Ihren Strom beziehen." Dies ist auch ein Implementierungsdetail. Auf höchster Ebene wird weiterhin davon ausgegangen, dass alle Steckdosen dieselbe Form haben und dieselbe Art von Strom abgeben. Die Details der Implementierung auf niedriger Ebene sind sowohl, woher der Strom kommt, als auch, wie er läuft.
In Bezug auf die Programmierung bedeutet dies, dass die übergeordnete Richtlinie die Schnittstelle ist (sofern eine Sprache dies unterstützt. Eine andere Form der DI ist die Duck-Typisierung.), Die eine API bereitstellt und die von der Anwendung verwendet wird Anwendung verbraucht es und die API selbst, die sich nicht verstehen müssen.
Adapter können verwendet werden, um dieselbe Implementierung in verschiedene Richtlinien einzufügen.
Der klassische Ansatz bei der Wiederverwendung von Software besteht darin, Komponenten zu erstellen, die von nichts anderem abhängen (das macht sie zu Low-Level-Komponenten), und dann Komponenten auf höherer Ebene zu erstellen, die von Komponenten auf niedrigerer Ebene abhängen. "High Level" und "Low Level" werden spezifisch durch die Richtung der Abhängigkeit bestimmt, die nicht der Funktion des Bauteils eigen ist, sondern oft nur eine architektonische Entscheidung.
Wenn also einzelne Geschäftsanwendungen ohne Abhängigkeit von der Workflow-Automatisierung erstellt werden, Ihr Workflow-Controller jedoch direkte Abhängigkeiten von der Geschäftsanwendung aufweist, sollte klar sein, dass die Workflow-Automatisierung eine "übergeordnete Richtlinie" und die Geschäftsanwendung eine Richtlinie ist "Low Level" -Komponente. Beachten Sie, dass diese Struktur nicht obligatorisch ist. Wenn Ihre Workflow-Automatisierungskomponente ein allgemeines Framework ist, das nicht an Ihre spezifischen Geschäftsanwendungen gekoppelt ist, sondern für die Bedienung verschiedener Anwendungen konfiguriert werden kann, haben Sie bereits mit der Anwendung des DIP begonnen. In dieser Situation ist die Trennung "hoher Pegel" / "niedriger Pegel" zwischen diesen beiden Dingen möglicherweise nicht mehr sinnvoll.
Der Name "Abhängigkeitsinversion" ist also etwas irreführend - da Abhängigkeiten nicht "invertiert", sondern vollständig entfernt werden (oder genauer: von Kompilierzeitabhängigkeiten in Laufzeitabhängigkeiten geändert).
quelle
Ich benutze ein einfaches Bild, um DIP zu erklären. Die klassische Sichtweise der Softwareentwicklung ist ein Konstruktionsprozess, bei dem jede Schicht über den unteren Schichten liegt, die sie unterstützen. Die Verwendung des Abhängigkeitsinversionsprinzips ähnelt eher dem Aufbau eines Mobiltelefons.
Anstelle der höheren Schichten, die auf den niedrigeren Schichten sitzen, verbinden die höheren Schichten des Mobilgeräts die unteren Schichten über die Verbindungsschnur. In gewisser Weise hängen die unteren Ebenen von dieser Schnittstelle ab, um Unterstützung zu erhalten (ohne die Zeichenfolge, auf die sie fallen würden). Das ist DIP auf den Punkt gebracht.
quelle