Prinzip der Abhängigkeitsumkehrung: Wie definieren Sie "Richtlinien auf hoher Ebene" und "Details auf niedriger Ebene" für andere Personen?

13

Ich versuche, meinen (meist jüngeren) Kollegen das Prinzip der Abhängigkeitsinversion zu erklären. Wie können wir definieren, welches die "High-Level-Policy" und welches das "Low-Level-Detail" in einer Software ist? Wenn unsere Software beispielsweise den Workflow mehrerer Geschäftsanwendungen automatisiert, warum ist die Workflow-Automatisierung dann die übergeordnete Richtlinie und die Geschäftsanwendungen sind die Details?

Louis Rhys
quelle

Antworten:

11

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.

pdr
quelle
+1 Crikey. Wusste nicht, dass ich so viel von einer einfachen Steckdose lernen kann :)
dreza
7

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).

Doc Brown
quelle
1
Nicht ganz. Die Inversion erfolgt, weil die niedrigeren Ebenen eine Abhängigkeit von der Schnittstelle haben. Nach dem Prinzip der Schnittstellentrennung (das I in SOLID) gehört diese Schnittstelle dem Client. Die untere Ebene ist also metaphorisch vom Client abhängig.
Michael Brown
2
@MikeBrown: das ist eine mögliche Sichtweise. Ich bevorzuge die Sichtweise, in der die Schnittstelle nicht zu A oder B gehört, sondern zur Infrastruktur oder Umgebung von A und B.
Doc Brown
1

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.Hängendes Mobile

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.

Michael Brown
quelle
+1 für den schönen Vergleich. In diesem Bild können Sie meinen Punkt sehen - alle Ebenen hängen von Schnittstellen ab, aber nicht niedrigere Ebenen von höheren oder umgekehrt.
Doc Brown
Ich verstehe, was du sagst, das Interface gehört weder zur höheren noch zur niedrigeren Ebene.
Michael Brown
1
Er fragte nicht, wie DIP zu erklären sei, er fragte, wie zu erklären sei, welche Teile der Anwendung Richtlinien auf hoher Ebene und welche Implementierungen auf niedriger Ebene seien. Ihre Analogie muss nicht weit gehen, um das zu tun. Sie müssen lediglich in der Lage sein, die Dekorationen zu ändern, ohne die Zeichenfolge zu ändern (wenn dies nicht möglich ist, enthält die allgemeine Mobilrichtlinie zu viele Details zur Implementierung der Dekoration).
pdr
1
(und in der Tat können Sie ein völlig neues Handy aus verschiedenen Materialien bauen und die gleichen Dekorationen daran aufhängen - das ist Doc Browns Punkt)
pdr