Kohäsion ist ein Hinweis darauf, wie eng und fokussiert die Verantwortlichkeiten eines Softwareelements sind.
Die Kopplung bezieht sich darauf, wie stark ein Softwareelement mit anderen Elementen verbunden ist.
Das Softwareelement kann eine Klasse, ein Paket, eine Komponente, ein Subsystem oder ein System sein. Beim Entwurf der Systeme wird empfohlen, Softwareelemente mit hoher Kohäsion und geringer Kopplung zu verwenden .
Geringe Kohäsion führt zu monolithischen Klassen, die schwer aufrechtzuerhalten, zu verstehen und die Wiederverwendbarkeit zu verringern sind. Ähnlich hohe Kopplung führt zu Klassen, die eng gekoppelt sind und Änderungen sind nicht lokal, schwer zu ändern und reduzieren die Wiederverwendung.
Wir können ein hypothetisches Szenario annehmen, in dem wir ein typisches Monitoring ConnectionPool
mit den folgenden Anforderungen entwerfen . Beachten Sie, dass es für eine einfache Klasse wie zu viel aussehen mag, ConnectionPool
aber die grundlegende Absicht besteht darin, nur eine geringe Kopplung und einen hohen Zusammenhalt anhand eines einfachen Beispiels zu demonstrieren, und ich denke, dies sollte helfen.
- Unterstützung beim Herstellen einer Verbindung
- Verbindung herstellen
- Erhalten Sie Statistiken über Verbindung und Nutzungsanzahl
- Holen Sie sich Statistiken über Verbindung gegen Zeit
- Speichern Sie die Informationen zum Abrufen und Freigeben von Verbindungen in einer Datenbank, um sie später zu melden.
Mit geringem Zusammenhalt könnten wir eine ConnectionPool
Klasse entwerfen , indem wir all diese Funktionen / Verantwortlichkeiten wie unten beschrieben in eine einzige Klasse packen. Wir können sehen, dass diese einzelne Klasse für das Verbindungsmanagement, die Interaktion mit der Datenbank sowie die Verwaltung der Verbindungsstatistiken verantwortlich ist.
Mit hohem Zusammenhalt können wir diese Verantwortung auf die Klassen verteilen und sie wartbarer und wiederverwendbarer machen.
Um eine niedrige Kopplung zu demonstrieren, werden wir mit dem ConnectionPool
obigen Diagramm für hohe Kohäsion fortfahren . Wenn wir uns das obige Diagramm ansehen, obwohl es eine hohe Kohäsion unterstützt, ConnectionPool
ist das eng mit der ConnectionStatistics
Klasse gekoppelt und PersistentStore
es interagiert direkt mit ihnen. Um die Kopplung zu verringern, könnten wir stattdessen eine ConnectionListener
Schnittstelle einführen und diese beiden Klassen die Schnittstelle implementieren lassen und sie sich bei der ConnectionPool
Klasse registrieren lassen . Und der ConnectionPool
Wille durchläuft diese Listener und benachrichtigt sie über Verbindungsabruf- und Freigabeereignisse und ermöglicht weniger Kopplung.
Hinweis / Wort oder Vorsicht: In diesem einfachen Szenario mag es wie ein Overkill aussehen. Wenn wir uns jedoch ein Echtzeitszenario vorstellen, in dem unsere Anwendung mit mehreren Diensten von Drittanbietern interagieren muss, um eine Transaktion abzuschließen: Koppeln Sie unseren Code direkt mit den Diensten von Drittanbietern Dies würde bedeuten, dass Änderungen am Dienst eines Drittanbieters an mehreren Stellen zu Änderungen an unserem Code führen könnten. Stattdessen könnte Facade
dies zu einer internen Interaktion mit diesen mehreren Diensten führen und Änderungen an den Diensten werden lokal für den Dienst Facade
und erzwingen eine geringe Kopplung mit dem Drittanbieter Dienstleistungen.