Kohäsion ist ein Hinweis darauf, wie verwandt und fokussiert die Verantwortlichkeiten eines Software-Elements sind.
Kopplung bezieht sich darauf, wie stark ein Software-Element mit anderen Elementen verbunden ist.
Das Software-Element könnte eine Klasse, ein Paket, eine Komponente, ein Subsystem oder ein System sein. Und beim Entwerfen der Systeme wird empfohlen, Software-Elemente mit hoher Kohäsion und geringer Kopplung zu haben.
Niedrige Kohäsion führt zu monolithischen Klassen, die schwer zu pflegen, zu verstehen sind und die Wiederverwendbarkeit verringern. Ähnlich führt hohe Kopplung zu Klassen, die eng miteinander verbunden sind, Änderungen sind nicht lokal durchführbar, schwer zu ändern und die Wiederverwendung verringert sich.
Wir können uns ein hypothetisches Szenario vorstellen, bei dem wir einen typischen überwachbaren ConnectionPool
mit den folgenden Anforderungen entwerfen. Beachten Sie, dass dies vielleicht zu viel aussieht für eine einfache Klasse wie ConnectionPool
, aber die Grundintention besteht nur darin, eine geringe Kopplung und hohe Kohäsion anhand eines einfachen Beispiels zu demonstrieren, was hoffentlich hilfreich ist.
- Unterstützung beim Verbindungsaufbau
- Verbindung freigeben
- Statistiken über Verbindung vs. Nutzungsanzahl abrufen
- Statistiken über Verbindung vs. Zeit abrufen
- Die Verbindungsabruf- und Freigabeinformationen in einer Datenbank speichern, um sie später für Berichte zu verwenden.
Mit geringer Kohäsion könnten wir eine ConnectionPool
-Klasse entwerfen, indem wir alle diese Funktionalitäten/Verantwortlichkeiten gewaltsam in eine einzige Klasse stecken, wie unten gezeigt. Wir können sehen, dass diese einzelne Klasse für die Verwaltung der Verbindung, die Interaktion mit der Datenbank sowie für die Beibehaltung von Verbindungsstatistiken verantwortlich ist.
Mit hoher Kohäsion können wir diese Verantwortlichkeiten auf die Klassen verteilen und sie wartbarer und wiederverwendbarer gestalten.
Um geringe Kopplung zu demonstrieren, werden wir mit dem Diagramm für die hohe Kohäsion des ConnectionPool
oben fortfahren. Wenn wir uns das obige Diagramm ansehen, obwohl es hohe Kohäsion unterstützt, ist der ConnectionPool
eng mit der Klasse ConnectionStatistics
und dem PersistentStore
gekoppelt, mit denen er direkt interagiert. Um die Kopplung zu reduzieren, könnten wir eine Schnittstelle ConnectionListener
einführen und diese beiden Klassen die Schnittstelle implementieren lassen und sie bei der Klasse ConnectionPool
registrieren lassen. Der ConnectionPool
wird dann durch diese Zuhörer iterieren und sie über die Ereignisse des Verbindungsaufbaus und der -freigabe informieren und damit die Kopplung verringern.
Hinweis/Wort der Vorsicht: Für dieses einfache Szenario mag es übertrieben erscheinen, aber wenn wir uns ein Echtzeitszenario vorstellen, in dem unsere Anwendung mit mehreren Drittanbieterdiensten interagieren muss, um eine Transaktion abzuschließen: Das direkte Koppeln unseres Codes mit den Drittanbieterdiensten bedeutet, dass Änderungen an den Drittanbieterdiensten dazu führen könnten, dass unser Code an mehreren Stellen geändert werden muss, anstatt könnten wir eine Facade
haben, die intern mit diesen verschiedenen Diensten interagiert und Änderungen an den Diensten werden lokal für die Facade
und erzwingen eine geringe Kopplung mit den Drittanbieterdiensten.
3 Stimmen
Schauen Sie es sich an: msdn.microsoft.com/en-us/magazine/cc947917.aspx
6 Stimmen
Ich möchte auf diesen Artikel hinweisen: S.O.L.I.D. Softwareentwicklung, ein Schritt nach dem anderen. Grz, Kris.
5 Stimmen
Dies ist der neueste Beitrag zu diesem Thema.
4 Stimmen
Siehe auch: stackoverflow.com/questions/39946/coupling-and-cohesion
1 Stimmen
Tatsächlich handelt es sich hierbei um eine Kopie von jener.
0 Stimmen
Ich bin in den letzten Jahren immer wieder auf diese Seite zurückgekommen und habe oft festgestellt, wie subjektiv diese Antworten sind. Meiner Meinung nach liegt das daran, dass die Worte subjektiv verwendet werden. Wenn wir die Kombination von 2 Dingen mögen, sagen wir "gute Kohäsion", und wenn sie schlecht sind, sagen wir "eng gekoppelt". Das Entfernen von gut/eng ist ziemlich verwirrend - aber TLDR: je unterschiedlicher etwas ist, desto weiter sollte es auseinander liegen. Offenbar funktioniert das aber nicht so gut für Teams - das ist das Gegenteil von Vielfalt.