Was bedeutet "niedrige Kopplung und hohe Kohäsion"?


151

Ich habe Probleme, die Aussage zu verstehen low in coupling and high in cohesion. Ich habe viel darüber gegoogelt und gelesen, finde es aber immer noch schwer zu verstehen.

Was ich verstehe, High cohesionbedeutet, dass wir Klassen haben sollten, die darauf spezialisiert sind, eine bestimmte Funktion auszuführen. Hoffe das ist richtig? Wie eine Kreditkartenvalidierungsklasse, die darauf spezialisiert ist, nur Kreditkarten zu validieren.

Und immer noch nicht verstehen, was niedrige Kopplung bedeutet?


4
Für eine detailliertere Erklärung können Sie die Antwort aus diesem Beitrag Cohesion & Coupling
Infinity

Diese Antwort ist sicherlich besser und prägnanter als die hier gegebenen.
Lokesh

In der Tat ist dies ein Duplikat davon. Die Antwort von Infinity ist das einzige Nicht-Duplikat, das hier bisher nicht erwähnt wurde.
Cellepo

Antworten:


231

Was ich glaube ist folgendes:

Kohäsion bezieht sich auf den Grad, in dem die Elemente eines Moduls / einer Klasse zusammengehören. Es wird empfohlen, dass der zugehörige Code nahe beieinander liegt. Daher sollten wir eine hohe Kohäsion anstreben und den gesamten zugehörigen Code so eng wie möglich zusammenbinden. Es hat mit den Elementen innerhalb des Moduls / der Klasse zu tun .

Die Kopplung bezieht sich auf den Grad, in dem die verschiedenen Module / Klassen voneinander abhängen. Es wird empfohlen, dass alle Module so weit wie möglich unabhängig sind. Aus diesem Grund ist die Kopplung gering. Es hat mit den Elementen zwischen verschiedenen Modulen / Klassen zu tun .

Die Visualisierung des gesamten Bildes ist hilfreich:

Geben Sie hier die Bildbeschreibung ein

Der Screenshot stammt von Coursera .


20
Unser Professor sagt: "Bei hoher Kohäsion geht es darum, sicherzustellen, dass das Modul nicht viele Dinge tut, sondern nur eine bestimmte Sache."
Lokesh

2
Nach meiner Meinung ist es eher so, als würde man sicherstellen, dass ein Modul etwas tut, nicht viele Module dasselbe tun. Auf diese Weise können Sie sicherstellen, dass nur ein einziges Modul das Verhalten spezifiziert, sodass das Gesamtverhalten für ein Ding zusammenhängend ist.
Sschrass

5
@Lokesh Ich denke, dein Kommentar verwirrt die Dinge. Ihr Professor verwechselt hohen Zusammenhalt mit dem "Prinzip der Einzelverantwortung". Hoher Zusammenhalt bedeutet, ähnliche und verwandte Dinge zusammenzuhalten. Sie können einen hohen Zusammenhalt in einem Objekt oder einer Dienstleistung haben, die aus vielen Funktionen besteht.
Max Hodges

17
Dieses Diagramm bedeutet buchstäblich nichts.
Liam

1
In Bezug auf die Mikrodienstarchitektur bedeutet hohe Kohäsion, dass stark verwandte Dinge in einem Mikrodienst zusammengehalten werden sollten, und lose Kopplung bedeutet, dass ein Mikrodienst selbst feinkörnig sein sollte, um in einem begrenzten Kontext zu arbeiten, dh eine Sache unabhängig zu tun.
Sactiw

41

Der Zusammenhalt in der Softwareentwicklung ist wie im wirklichen Leben, wie sehr die Elemente, die aus einem Ganzen bestehen (in unserem Fall sagen wir eine Klasse), tatsächlich zusammengehören können. Somit ist es ein Maß dafür, wie stark jede Funktionalität, die durch den Quellcode eines Softwaremoduls ausgedrückt wird, in Beziehung steht.

Eine Möglichkeit, den Zusammenhalt in Bezug auf OO zu betrachten, besteht darin, dass die Methoden in der Klasse eines der privaten Attribute verwenden.

Jetzt ist die Diskussion größer als diese, aber Hohe Kohäsion (oder der beste Typ der Kohäsion - die funktionale Kohäsion) ist, wenn Teile eines Moduls gruppiert werden, weil sie alle zu einer einzigen genau definierten Aufgabe des Moduls beitragen.

In einfachen Worten bedeutet Kopplung , wie viel eine Komponente (stellen Sie sich eine Klasse vor, wenn auch nicht unbedingt) über das Innenleben oder die inneren Elemente einer anderen weiß, dh wie viel Wissen sie über die andere Komponente hat.

Die lose Kopplung ist eine Methode, um die Komponenten in einem System oder Netzwerk so miteinander zu verbinden, dass diese Komponenten so wenig wie möglich voneinander abhängig sind.

Ich habe einen Blog-Beitrag darüber geschrieben. All dies wird ausführlich mit Beispielen usw. erläutert. Außerdem werden die Vorteile erläutert, warum Sie diese Grundsätze befolgen sollten.


26

Im Software-Design bedeutet hohe Kohäsion , dass die Klasse eine Sache und eine Sache sehr gut machen sollte. Ein hoher Zusammenhalt ist eng mit dem Prinzip der Einzelverantwortung verbunden .

Eine geringe Kopplung legt nahe, dass die Klasse möglichst geringe Abhängigkeiten aufweisen sollte. Außerdem sollten Abhängigkeiten, die vorhanden sein müssen, schwache Abhängigkeiten sein - bevorzugen Sie die Abhängigkeit von der Schnittstelle gegenüber der Abhängigkeit von der konkreten Klasse oder bevorzugen Sie die Zusammensetzung gegenüber der Vererbung.

Hohe Kohäsion und niedrige Kopplung geben uns besser gestalteten Code, der einfacher zu warten ist.


Sie haben die Abhängigkeitsinjektion verpasst. Es hängt eng mit der geringen Kopplung zusammen, um sicherzustellen, dass eine Klasse die geringsten / keine Abhängigkeiten aufweist.
BugHunterUK

16

Kurze und klare Antwort

  • Hoher Zusammenhalt : Elemente innerhalb einer Klasse / eines Moduls sollten funktional zusammengehören und eine bestimmte Sache tun.
  • Lose Kopplung : Zwischen verschiedenen Klassen / Modulen sollte eine minimale Abhängigkeit bestehen.

9

Eine niedrige Kopplung erfolgt im Zusammenhang mit zwei oder vielen Modulen. Wenn eine Änderung in einem Modul zu vielen Änderungen in einem anderen Modul führt, werden sie als stark gekoppelt bezeichnet. Hier hilft die schnittstellenbasierte Programmierung. Änderungen innerhalb des Moduls wirken sich nicht auf das andere Modul aus, da sich die Schnittstelle (der Mittelwert der Interaktion) zwischen ihnen nicht geändert hat.

Hoher Zusammenhalt - Fügen Sie ähnliche Dinge zusammen. Eine Klasse sollte also Methoden oder Verhaltensweisen haben, um verwandte Aufgaben zu erledigen. Nur um ein übertrieben schlechtes Beispiel zu geben: Eine Implementierung der List-Schnittstelle sollte keine Operation in Bezug auf String haben. Die String-Klasse sollte Methoden und Felder haben, die für String relevant sind, und in ähnlicher Weise sollte die Implementierung von List entsprechende Dinge enthalten.

Hoffentlich hilft das.


5

Lange Rede, kurzer Sinn, niedrige Kopplung, wie ich es verstanden habe, bedeutete, dass Komponenten ausgetauscht werden können, ohne die ordnungsgemäße Funktion eines Systems zu beeinträchtigen. Grundsätzlich modulieren Sie Ihr System in funktionierende Komponenten, die einzeln aktualisiert werden können, ohne das System zu beschädigen


1
Ist das nicht dasselbe wie hoher Zusammenhalt?
user1315906

4

Hast du ein Smartphone? Gibt es eine große App oder viele kleine? Antwortet eine App auf eine andere? Können Sie eine App verwenden, während Sie eine andere installieren, aktualisieren und / oder deinstallieren? Dass jede App in sich geschlossen ist, ist ein hoher Zusammenhalt. Dass jede App unabhängig von den anderen ist, ist eine geringe Kopplung. DevOps bevorzugt diese Architektur, da Sie damit eine diskrete kontinuierliche Bereitstellung durchführen können, ohne das gesamte System zu stören.


> Antwortet eine App auf eine andere? . . Nun ja, einige tun es. Viele Apps verwenden die Kamera-App, indem die Trainings-App Herz- und Trainingsdaten an Gesundheit und Aktivitäten weiterleitet. Ich kann einen Ausschnitt von einer App für viele andere freigeben. Meine Alarm-App kennt die Zeit und spielt einen Titel aus der Musik-App ab ...
Max Hodges

@MaxHodges das Ding (geringe Kohäsion und hohe Kopplung) wird abgeschrieben und sollte so gering wie möglich gehalten werden. In einigen Fällen, wie Sie erwähnt haben. Dies kann nicht vollständig entfernt werden.
M. Habib

2

Vererbung oder Verallgemeinerung ist ein Beispiel für eine hohe Kopplung (dh eine hohe gegenseitige Abhängigkeit). Damit habe ich gemeint, dass die übergeordnete Klasse bei der Vererbung häufig Basisfunktionalitäten definiert, die von ihrer untergeordneten Klasse verwendet werden, und dass sich Änderungen der Methoden der übergeordneten Klasse direkt auf die untergeordneten Klassen auswirken. Daher können wir sagen, dass zwischen den Klassen ein größeres Maß an gegenseitiger Abhängigkeit besteht.

Die Realisierung oder Verwendung einer Schnittstelle ist ein Beispiel für eine hohe Kohäsion (dh eine geringe gegenseitige Abhängigkeit). Dies bedeutet, dass eine Schnittstelle einen Vertrag für jede Klasse vorlegt, die ihn implementiert, aber jede Klasse das Recht hat, in der Schnittstelle deklarierte Methoden auf ihre eigene Weise zu implementieren, und Änderungen an der in einer Klasse deklarierten Methode keine andere Klasse betreffen.


2

Zusammenhalt - wie eng alles miteinander verbunden ist.
Kopplung - wie alles miteinander verbunden ist.

Nehmen wir ein Beispiel: Wir wollen ein selbstfahrendes Auto entwerfen.

(1) Wir brauchen den Motor, um richtig zu laufen.

(2) Wir brauchen das Auto, um alleine zu fahren.

Alle Klassen und Funktionen in (1) Starten und Laufenlassen des Motors funktionieren hervorragend zusammen, helfen dem Auto jedoch nicht beim Lenken. Also platzieren wir diese Klassen hinter einer Motorsteuerung.

Alle Klassen und Funktionen in (2) funktionieren hervorragend, um das Auto zu lenken, zu beschleunigen und zu bremsen. Sie helfen dem Auto nicht beim Starten oder schicken Benzin zu den Kolben. Deshalb platzieren wir diese Klassen hinter einem eigenen Driving Controller.

Diese Controller werden verwendet, um mit allen verfügbaren Klassen und Funktionen zu kommunizieren. Die Steuerungen kommunizieren dann nur miteinander. Dies bedeutet, dass ich keine Funktion in der Kolbenklasse aus der Gaspedalklasse aufrufen kann, um das Auto schneller zu machen.

Die Pedalklasse muss die Fahrsteuerung bitten, mit der Motorsteuerung zu sprechen, die dann die Kolbenklasse anweist, schneller zu fahren. Dies ermöglicht es uns Programmierern, Probleme zu finden und große Programme ohne Bedenken zu kombinieren. Dies liegt daran, dass der Code alle hinter dem Controller funktionierte.


1

Geringe Kopplung und hohe Kohäsion sind ein empfohlenes Phänomen.

Kopplung bedeutet, inwieweit verschiedene Module voneinander abhängig sind und wie die anderen Module davon betroffen sind, einige / erhebliche Funktionen eines Moduls zu ändern. Eine geringe Kopplung wird hervorgehoben, da die Abhängigkeit gering gehalten werden muss, damit an anderen Modulen die geringsten / vernachlässigbaren Änderungen vorgenommen werden.


1

Ein Beispiel könnte hilfreich sein. Stellen Sie sich ein System vor, das Daten generiert und in einen Datenspeicher legt, entweder eine Datei auf der Festplatte oder eine Datenbank.

Eine hohe Kohäsion kann erreicht werden, indem der Datenspeichercode vom Datenproduktionscode getrennt wird. (und tatsächlich den Plattenspeicher vom Datenbankspeicher trennen).

Eine niedrige Kopplung kann erreicht werden, indem sichergestellt wird, dass die Datenproduktion keine unnötigen Kenntnisse über den Datenspeicher hat (z. B. fragt der Datenspeicher nicht nach Dateinamen oder Datenbankverbindungen).


1

Hier ist eine Antwort aus einem abstrakten, graphentheoretischen Blickwinkel:

Vereinfachen wir das Problem, indem wir nur (gerichtete) Abhängigkeitsgraphen zwischen statusbehafteten Objekten betrachten.

Eine äußerst einfache Antwort lässt sich anhand zweier Grenzfälle von Abhängigkeitsgraphen veranschaulichen :

Der 1. Grenzfall : ein Cluster-Diagramm .

Ein Clustergraph ist die perfekteste Realisierung eines Abhängigkeitsgraphen mit hoher Kohäsion und niedriger Kopplung (bei einer Reihe von Clustergrößen).

Die Abhängigkeit zwischen Clustern ist maximal (vollständig verbunden) und die Abhängigkeit zwischen Clustern ist minimal (Null).

Dies ist eine abstrakte Darstellung der Antwort in einem der Grenzfälle .

Der 2. Grenzfall ist ein vollständig verbundener Graph, bei dem alles von allem abhängt.

Die Realität liegt irgendwo dazwischen, je näher am Clustergraphen, desto besser, nach meinem bescheidenen Verständnis.

Unter einem anderen Gesichtspunkt : Wenn Sie einen gerichteten Abhängigkeitsgraphen betrachten, sollte dieser idealerweise azyklisch sein, wenn nicht, bilden Zyklen die kleinsten Cluster / Komponenten.

Ein Schritt nach oben / unten in der Hierarchie entspricht "einer Instanz" von loser Kopplung, enger Kohäsion in einer Software, aber es ist möglich, dieses Prinzip der losen Kopplung / engen Kohäsion als sich wiederholendes Phänomen in verschiedenen Tiefen eines azyklisch gerichteten Graphen (oder weiter) zu betrachten einer seiner Spannbäume).

Eine solche Zerlegung eines Systems in eine Hierarchie hilft, die exponentielle Komplexität zu überwinden (sagen wir, jeder Cluster hat 10 Elemente). Dann sind es in 6 Schichten bereits 1 Million Objekte:

10 Cluster bilden 1 Supercluster, 10 Supercluster bilden 1 Hypercluster und so weiter ... Ohne das Konzept der engen Kohäsion und der losen Kopplung wäre eine solche hierarchische Architektur nicht möglich.

Dies könnte also die wahre Bedeutung der Geschichte sein und nicht nur die niedrige Kohäsion und die niedrige Kopplung innerhalb von nur zwei Schichten. Die wahre Bedeutung wird deutlich, wenn Abstraktionen auf höherer Ebene und ihre Wechselwirkungen betrachtet werden.


0

Ich denke, Sie haben so viele rote Definitionen, aber falls Sie immer noch Zweifel haben oder falls Sie neu in der Programmierung sind und sich eingehend damit befassen möchten, empfehle ich Ihnen, dieses Video anzuschauen: https://youtu.be/HpJTGW9AwX0 Es ist nur eine Referenz, um mehr Informationen über Polymorphismus zu erhalten ... Ich hoffe, Sie bekommen damit ein besseres Verständnis


0

Niedrige Kopplung: - Wird es sehr einfach halten. Wenn Sie Ihr Modul ändern, wie wirkt es sich auf andere Module aus?

Beispiel: - Wenn Ihre Service-API als JAR verfügbar gemacht wird, wird durch jede Änderung der Methodensignatur die aufrufende API (High / Tight-Kopplung) unterbrochen.

Wenn Ihr Modul und ein anderes Modul über asynchrone Nachrichten kommunizieren. Solange Sie Nachrichten erhalten, ist Ihre Methodenänderungssignatur lokal für Ihr Modul (niedrige Kopplung).

Wenn sich das Nachrichtenformat ändert, muss der anrufende Client natürlich einige Änderungen vornehmen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.