2012-12-22 10 views
87

Ich habe Probleme, die Aussage low in coupling and high in cohesion zu verstehen. Ich habe gegoogelt und viel darüber gelesen, aber immer noch schwer zu verstehen.Was bedeutet "wenig Kupplung und hohe Kohäsion"

Zu was ich verstehe ist High cohesion bedeutet, dass wir Klassen haben sollten, die auf eine bestimmte Funktion spezialisiert sind. Hoffe das ist richtig? Wie eine Kreditkarten-Validierungsklasse, die darauf spezialisiert ist, nur Kreditkarten zu validieren.

Und immer noch nicht verstehen, was Low Coupling bedeutet?

+2

Für eine detailliertere Erklärung, Sie können von diesem Beitrag [Kohäsions & Kupplung] (http://stackoverflow.com/questions/3085285/cohesion-coupling) – Infinity

+0

[Diese Antwort] (http auf die Antwort bevorzugen: // stackoverflow.com/a/3085419/2623749) ist sicherlich besser und prägnanter als die hier angegebenen. – Lokesh

Antwort

135

Was ich glaube, das ist:

Kohäsion bezieht sich auf das Ausmaß, in dem die Elemente eines Moduls/Klasse zusammengehören, wird vorgeschlagen, dass der verwandte Code nahe beieinander liegen sollte, also sollten wir nach einer hohen Kohäsion streben und den gesamten Code so nah wie möglich zusammenfügen. Es hat mit den Elementen innerhalb das Modul/Klasse zu tun.

Kopplung bezieht sich auf den Grad, zu dem die verschiedenen Module/Klassen voneinander abhängen, es wird vorgeschlagen, dass alle Module so weit wie möglich unabhängig sein sollten, deshalb niedrige Kopplung. Es hat mit den Elementen zwischen verschiedenen Modulen/Klassen zu tun.

+5

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

+1

Von was ich glaube, es ist mehr wie "Sicherstellen, dass ein Modul eine Sache macht, nicht viele Module das gleiche tun", dadurch können Sie sicherstellen, dass nur ein einzelnes Modul das Verhalten angibt, so dass das Gesamtverhalten für eine Sache zusammenhängend ist . – sschrass

4

Lange Rede, kurzer Sinn, niedrige Kopplung, so wie ich es verstanden habe, bedeutete, dass Komponenten ausgelagert werden können, ohne dass die Funktion eines Systems beeinträchtigt wird. Basicaly Ihr System in funktionierende Komponenten modulize, die ohne zu brechen, das System individuell aktualisiert werden können

+0

Ist das nicht dasselbe wie High Cohesion? – user1315906

0

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

Kopplung bedeutet, inwieweit verschiedene Module voneinander abhängig sind und wie sich die anderen Module auf die Änderung der Funktionalität eines Moduls auswirken. Eine niedrige Kopplung wird hervorgehoben, da die Abhängigkeit niedrig gehalten werden muss, so dass zumindest geringfügige/vernachlässigbare Änderungen an anderen Modulen vorgenommen werden.

7

Geringe Kopplung ist im Zusammenhang mit zwei oder vielen Modulen. Wenn eine Änderung in einem Modul viele Änderungen in einem anderen Modul zur Folge hat, dann wird gesagt, dass sie stark gekoppelt sind. Hier hilft die schnittstellenbasierte Programmierung. Jede Änderung innerhalb des Moduls wirkt sich nicht auf das andere Modul aus, da sich die Schnittstelle (der Mittelwert der Interaktion) zwischen ihnen nicht geändert hat.

Hohe Kohäsion- Setzen Sie die ähnlichen Dinge zusammen. Also sollte eine Klasse Methoden oder Verhaltensweisen haben, um damit verbundene 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, Felder haben, die für String relevant sind, und ähnlich sollte die Implementierung von List entsprechende Dinge haben.

Hoffe, dass hilft.

23

Zusammenhalt In Software-Engineering, wie im wirklichen Leben, ist, wie viel die Elemente aus einem Ganzen (in unserem Fall sagen wir eine Klasse) kann gesagt werden, dass sie tatsächlich zusammen gehören. 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, die Kohäsion in Bezug auf OO zu betrachten, besteht darin, ob die Methoden in der Klasse eines der privaten Attribute verwenden.

Jetzt ist die Diskussion größer als das, aber High Cohesion (oder der beste Typ der Kohäsion - die funktionale Kohäsion) ist, wenn Teile eines Moduls gruppiert sind, weil sie alle zu einer einzigen gut definierten Aufgabe des Moduls beitragen. Koppeln Koppeln in einfachen Worten, ist, wie viel eine Komponente (wieder vorstellen, eine Klasse, obwohl nicht unbedingt) über die inneren Funktionen oder inneren Elemente eines anderen, d.h. wie viel Wissen es von der anderen Komponente hat.

lose Kopplung ist ein Verfahren zum Verbinden der Komponenten in einem System oder Netzwerk, so dass diejenigen Komponenten, die voneinander abhängig sind, um den geringsten Umfang praktisch möglich ...

I wrote a blog post darüber. Es behandelt all dies sehr detailliert, mit Beispielen usw. Es erklärt auch die Vorteile, warum Sie diese Prinzipien befolgen sollten.

10

In Software-Design hohe Kohäsion bedeutet, dass Klasse sollte eine Sache und eine Sache sehr gut tun. Hohe Kohäsion ist eng verwandt mit Single responsibility principle.

Niedrige Kopplung schlagen vor, dass die Klasse möglichst wenig Abhängigkeiten haben sollte. Abhängigkeiten, die vorhanden sein müssen, sollten auch schwache Abhängigkeiten sein - bevorzugen die Abhängigkeit von der Schnittstelle und nicht die Abhängigkeit von der konkreten Klasse oder bevorzugen die Zusammensetzung gegenüber der Vererbung.

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

+0

Sie haben Dependency Injection verpasst. Es ist eng verwandt mit niedriger Kopplung, um sicherzustellen, dass eine Klasse die geringsten/keine Abhängigkeiten aufweist. – BugHunterUK

0

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

Hohe Kohäsion kann erreicht werden, indem der Datenspeichercode vom Datenherstellungscode getrennt wird. (und trennt den Plattenspeicher tatsächlich vom Datenbankspeicher).

Low Coupling kann erreicht werden, indem sichergestellt wird, dass die Datenproduktion keine unnötige Kenntnis des Datenspeichers hat (z. B. fragt den Datenspeicher nicht nach Dateinamen oder DB-Verbindungen).

0

Vererbung oder Generalisierung ist ein Beispiel für hohe Kopplung (d. H. Hohe Interdependenz). Was ich damit meine, ist, dass die Elternklasse bei der Vererbung oft Basisfunktionalitäten definiert, die von ihrer Kindklasse verwendet werden, und die Änderung der Methoden der Elternklasse sich direkt auf ihre Kindklassen auswirkt. Daher können wir sagen, dass zwischen den Klassen ein größerer Grad an wechselseitiger Abhängigkeit besteht.

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

2

Haben Sie ein Smartphone? Gibt es eine große App oder viele kleine? Antwortet eine App auf eine andere? Können Sie während der Installation, Aktualisierung und/oder Deinstallation einer anderen App eine App verwenden? Dass jede App in sich abgeschlossen ist, ist eine hohe Kohäsion. Dass jede App unabhängig von den anderen ist, ist eine geringe Kopplung. DevOps favorisiert diese Architektur, weil es eine diskrete kontinuierliche Bereitstellung ermöglicht, ohne das gesamte System zu stören.