CodeGym /Java-Kurse /Modul 3: Java Professional /So lösen Sie die Kopplung zwischen Softwaremodulen

So lösen Sie die Kopplung zwischen Softwaremodulen

Modul 3: Java Professional
Level 14 , Lektion 7
Verfügbar

8.1 Zersetzung ist alles

Zur Verdeutlichung ein Bild aus einem guten Artikel „Entkopplung objektorientierter Systeme“, das die wichtigsten Punkte veranschaulicht, die besprochen werden.

Zersetzung

Denken Sie immer noch, dass das Entwerfen einer Anwendungsarchitektur einfach ist?

8.2 Schnittstellen, Implementierung ausblenden

Die Hauptprinzipien zur Reduzierung der Kopplung des Systems sind die Prinzipien von OOP und das dahinter stehende Prinzip von Kapselung + Abstraktion + Polymorphismus.

Genau deshalb:

  • Module sollten füreinander „Black Boxes“ sein (Kapselung) . Das bedeutet, dass ein Modul nicht in ein anderes Modul „klettern“ sollte und nichts über dessen interne Struktur wissen sollte. Objekte in einem Subsystem sollten nicht direkt auf Objekte in einem anderen Subsystem zugreifen.
  • Module/Subsysteme sollten nur über Schnittstellen (d. h. Abstraktionen , die nicht von Implementierungsdetails abhängen) miteinander interagieren . Dementsprechend muss jedes Modul über eine oder mehrere klar definierte Schnittstellen für die Interaktion mit anderen Modulen verfügen.

Das Prinzip der „Black Box“ (Kapselung) ermöglicht es uns, die Struktur jedes Subsystems unabhängig von anderen Subsystemen zu betrachten. Das Modul, das eine „Blackbox“ darstellt, kann relativ frei verändert werden. Probleme können nur an der Schnittstelle verschiedener Module (oder eines Moduls und einer Umgebung) auftreten.

Und diese Interaktion muss in der allgemeinsten (abstrakten) Form beschrieben werden, also in Form einer Schnittstelle. In diesem Fall funktioniert der Code mit jeder Implementierung, die dem Schnittstellenvertrag entspricht, gleich. Diese Fähigkeit, über eine einheitliche Schnittstelle mit verschiedenen Implementierungen (Modulen oder Objekten) zu arbeiten, wird Polymorphismus genannt.

Deshalb ist Servlet eine Schnittstelle : Der Webcontainer weiß nichts über Servlets, denn es handelt sich um einige Objekte, die die Servlet-Schnittstelle implementieren, und das war’s. Servlets wissen auch ein wenig über die Struktur des Containers. Die Servlet-Schnittstelle ist dieser Vertrag, dieser Standard, diese minimale Interaktion, die erforderlich ist, damit Java-Webanwendungen die Welt erobern.

Polymorphismus ist keineswegs das Überschreiben von Methoden, wie manchmal fälschlicherweise angenommen wird, sondern zunächst einmal die Austauschbarkeit von Modulen/Objekten mit derselben Schnittstelle oder „eine Schnittstelle, viele Implementierungen“. Um Polymorphismus zu implementieren, ist der Vererbungsmechanismus überhaupt nicht erforderlich. Dies ist wichtig zu verstehen, da eine Vererbung im Allgemeinen nach Möglichkeit vermieden werden sollte .

Dank Schnittstellen und Polymorphismus wird gerade die Möglichkeit erreicht, den Code zu modifizieren und zu erweitern, ohne das bereits Geschriebene zu ändern (Open-Closed-Prinzip).

Solange das Zusammenspiel von Modulen ausschließlich in Form von Schnittstellen beschrieben wird und nicht an bestimmte Implementierungen gebunden ist, haben Sie die Möglichkeit, für das System absolut „schmerzlos“ ein Modul durch ein anderes zu ersetzen, das die gleiche Schnittstelle implementiert, und zwar auch Fügen Sie ein neues hinzu und erweitern Sie dadurch die Funktionalität.

Es ist wie im LEGO-Konstruktor – die Schnittstelle standardisiert die Interaktion und dient als eine Art Anschluss, an den jedes Modul mit passendem Anschluss angeschlossen werden kann.

Die Flexibilität des Designers wird dadurch gewährleistet, dass wir einfach ein Modul oder Teil durch ein anderes mit denselben Anschlüssen (mit derselben Schnittstelle) ersetzen und beliebig viele neue Teile hinzufügen können (gleichzeitig vorhandene). Teile werden in keiner Weise verändert oder verändert).

Mithilfe von Schnittstellen können Sie ein einfacheres System aufbauen, indem Sie jedes Subsystem als Ganzes betrachten und seine interne Struktur ignorieren. Sie ermöglichen Modulen die Interaktion und wissen gleichzeitig nichts über die interne Struktur voneinander, wodurch das Prinzip des minimalen Wissens, das die Grundlage der losen Kopplung bildet, vollständig umgesetzt wird.

Je allgemeiner/abstrakter die Schnittstellen definiert sind und je weniger Einschränkungen sie der Interaktion auferlegen, desto flexibler ist das System. Von hier aus folgt tatsächlich ein weiteres Prinzip von SOLID – das Interface -Segregations-Prinzip , das „dicken Schnittstellen“ entgegensteht.

Er sagt, dass große, umfangreiche Schnittstellen in kleinere, spezifischere Schnittstellen zerlegt werden sollten, sodass Clients kleiner Schnittstellen (abhängige Module) nur über die Methoden Bescheid wissen, mit denen sie arbeiten müssen.

Dieser Grundsatz wird wie folgt formuliert: „Kunden sollten sich nicht auf Methoden verlassen (auf Methoden achten), die sie nicht verwenden“ oder „Viele spezialisierte Schnittstellen sind besser als eine universelle“.

Es stellt sich heraus, dass eine schwache Konnektivität nur dann gegeben ist, wenn die Interaktion und Abhängigkeiten von Modulen nur mithilfe von Schnittstellen, also Abstraktionen, beschrieben werden, ohne Kenntnisse über deren interne Struktur und Struktur zu nutzen. Und tatsächlich wird so die Kapselung implementiert. Darüber hinaus haben wir die Möglichkeit, das Verhalten des Systems zu erweitern/zu ändern, indem wir verschiedene Implementierungen hinzufügen und verwenden, also aufgrund von Polymorphismus. Ja, wir sind wieder bei OOP angekommen – Encapsulation, Abstraction, Polymorphism.

8.3 Fassade: Modulschnittstelle

Hier wird ein erfahrener Programmierer fragen: Wenn das Design nicht auf der Ebene von Objekten erfolgt, die selbst die entsprechenden Schnittstellen implementieren, sondern auf der Ebene von Modulen, wie sieht dann die Implementierung der Modulschnittstelle aus?

Antwort: In der Sprache der Entwurfsmuster kann ein spezielles Objekt für die Implementierung der Modulschnittstelle verantwortlich sein – Fassade . Wenn Sie Methoden für ein Objekt aufrufen, das das Gateway-Suffix enthält (z. B. MobileApiGateway), handelt es sich höchstwahrscheinlich um eine Fassade.

Eine Fassade ist ein Schnittstellenobjekt , das eine Reihe von Operationen auf hoher Ebene für die Arbeit mit einem bestimmten Subsystem sammelt und dabei seine interne Struktur und wahre Komplexität verbirgt . Bietet Schutz vor Änderungen in der Subsystemimplementierung. Dient als einziger Einstiegspunkt – „Sie treten gegen die Fassade, und er weiß, wer in diesem Subsystem getreten werden muss, um zu bekommen, was er braucht.“

Sie haben gerade eines der wichtigsten Entwurfsmuster kennengelernt, das es Ihnen ermöglicht, das Konzept von Schnittstellen beim Entwurf von Modulen zu nutzen und diese dadurch zu entkoppeln – „Fassade“.

Darüber hinaus ermöglicht „Facade“, mit Modulen genauso zu arbeiten wie mit gewöhnlichen Objekten und beim Entwerfen von Modulen alle nützlichen Prinzipien und Techniken anzuwenden, die bei der Gestaltung von Klassen zum Einsatz kommen.

Fassade: Modulschnittstelle

Hinweis : Obwohl die meisten Programmierer die Bedeutung von Schnittstellen beim Entwerfen von Klassen (Objekten) verstehen, scheinen viele die Idee zu entdecken, Schnittstellen auch auf Modulebene zu verwenden.

Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION