Prinzip der Abhängigkeitsinversion: Verstehen, wie sowohl Komponenten auf niedriger als auch auf hoher Ebene von Abstraktionen abhängen

10

Ich lerne etwas über das Prinzip der Abhängigkeitsinversion. Es sagt, dass:

High-Level-Module sollten nicht von Low-Level-Modulen abhängen. Beides sollte von Abstraktionen abhängen.

Für eine Weile habe ich versucht zu verstehen, was es bedeutet, dass sowohl die Komponenten auf hoher Ebene als auch die Komponenten auf niedriger Ebene sich auf die Abstraktionen verlassen und von ihnen abhängig sind .

Ich gehe davon aus, dass beide in irgendeiner Weise von derselben Abstraktion abhängen sollten . Bitte korrigieren Sie mich, wenn dies falsch ist.

Ich bin zu einem Schluss gekommen, was dies bedeutet. Bitte bestätigen Sie, ob dies korrekt ist.

Geben Sie hier die Bildbeschreibung ein

" Die übergeordneten Komponenten sind abhängig von der Abstraktion" - Bedeutung:

Die Komponenten auf hoher Ebene kommunizieren mit einer Schnittstelle, um mit den Komponenten auf niedriger Ebene zu kommunizieren , anstatt direkt mit konkreten Komponenten auf niedriger Ebene zu kommunizieren. Die Low-Level-Komponenten implementieren diese Schnittstelle.

" Die Low-Level-Komponenten sind abhängig von der Abstraktion" - Bedeutung:

Die Low-Level-Komponenten werden in Bezug auf die Schnittstelle definiert und entworfen. Sie sind so konzipiert, dass sie zur Schnittstelle passen . Sie sind abhängig von der Schnittstelle, so wie die Schnittstelle definiert, wie sie gestaltet sind. (Oft implementieren Low-Level-Klassen diese Schnittstelle).

Auf diese Weise sind sowohl die Komponenten auf hoher als auch die Komponenten auf niedriger Ebene "von der Abstraktion abhängig", jedoch auf unterschiedliche Weise.

Ist das ein gutes Verständnis?

Aviv Cohn
quelle
8
Du bist ziemlich genau richtig. Das letzte Puzzleteil ist, dass die Schnittstelle durch die Komponente auf hoher Ebene definiert wird , nicht durch die Komponente auf niedriger Ebene. Mit anderen Worten, das übergeordnete Unternehmen (z. B. das Domänenmodell) kann den bequemsten Weg wählen, um mit dem Code auf niedriger Ebene (wie dem Datenzugriffscode) zu sprechen, und es ist Aufgabe des Codes auf niedriger Ebene, sich anzupassen zu dieser Schnittstelle. Wenn Sie verstehen, dass die Schnittstelle Teil des Verhaltens auf hoher Ebene ist, ist der Begriff "Abhängigkeitsinversion" viel sinnvoller.
Benjamin Hodgson
1
@BenjaminHodgson Ich verstehe. Lass mich sehen, ob ich verstehe. Offensichtlich kann ein Objekt keine Schnittstelle definieren, das ist die Aufgabe des Programmierers. Mit "die Schnittstelle wird durch die übergeordnete Komponente definiert" meine ich also "der Programmierer definiert die Schnittstelle im Hinblick darauf, wie die übergeordneten Komponenten bequem mit den untergeordneten Komponenten kommunizieren können ". Bestätigen Sie?
Aviv Cohn
(da die Low-Level-Benutzer diese Schnittstelle später implementieren und danach konstruieren werden).
Aviv Cohn
Ja, offensichtlich wird der gesamte Code vom Programmierer geschrieben. Ich habe versucht, die Idee zu vermitteln, dass die Schnittstelle konzeptionell Teil des übergeordneten Anliegens ist. Sie sollten es in dasselbe Paket wie Ihren High-Level-Code einfügen und es sollte sich entsprechend den Geschäftsanforderungen ändern, nicht als Reaktion auf Änderungen der Implementierungsdetails.
Benjamin Hodgson
1
Ich möchte nur eine Einschränkung hinzufügen, dass Sie, obwohl dies ideal ist, nicht immer den Luxus haben, die Low-Level-Schnittstelle in Bezug auf die Anforderungen der High-Level-Komponente zu definieren. Wenn Sie beispielsweise eine vorhandene Bibliothek integrieren, die einige nützliche Funktionen in Ihre App bietet, verfügen Sie wahrscheinlich über Komponenten auf hoher Ebene, die die Geschäftsfunktion darstellen, die Sie ausführen möchten. Sie verwenden diese Bibliothek auf niedriger Ebene (wie zum Beispiel iText), um die Arbeit tatsächlich zu erledigen . Sie werden wahrscheinlich nicht den Luxus haben, die Abstraktion zu definieren, ohne Rücksicht darauf, was iText benötigt.
Calphool

Antworten:

6

Ihr Verständnis des Konzepts ist sehr genau.

Wenn Sie jetzt auf Ausnahmen, Sonderfälle oder philosophische Kleinigkeiten hinweisen, werden Sie von Ihrer gegenwärtigen Klarheit des Konzepts abgelenkt.

Ich würde jedoch vorschlagen, dass Sie UML-Symbole verwenden:

Geben Sie hier die Bildbeschreibung ein

  • Pfeil öffnen: verwendet
  • Geschlossener Pfeil: erbt oder implementiert
  • << Name in Klammern >>: Schnittstelle oder abstrakte Klasse
Tulains Córdova
quelle
0

Ja, viele Leute denken an Software-Konstruktion wie an Hochbau. Die DB ist das "Fundament", auf dem sich die DAL befindet, die Business-Schicht befindet sich auf der DAL, die Benutzeroberfläche befindet sich auf der Business-Schicht ...

Stellen Sie es sich stattdessen als hängendes Handy vor. Wo die "Schichten" an einem gemeinsamen Anker hängen. Benutzeroberfläche und Business Layer hängen beide an der Business-Schnittstelle, Business Layer und DAL hängen beide an der DAL-Schnittstelle, DAL und Datenbank verbinden sich über die DB-Schnittstelle.

Michael Brown
quelle