Was ist hoher Zusammenhalt und wie wird er verwendet / hergestellt?


83

Ich lerne Computerprogrammierung und bin an mehreren Stellen auf das Konzept des Zusammenhalts gestoßen, und ich verstehe, dass es wünschenswert ist, dass eine Software einen "hohen Zusammenhalt" aufweist, aber was bedeutet das? Ich bin ein Java-, C- und Python-Programmierer, der C ++ aus dem Buch C ++ Primer lernt, in dem der Zusammenhalt erwähnt wird, ohne ihn im Index zu haben. Können Sie mich auf einige Links zu diesem Thema verweisen? Ich fand die Wikipedia-Seite über den Zusammenhalt in der Informatik nicht informativ, da sie nur besagt, dass es sich um eine qualitative Maßnahme handelt und keine echten Codebeispiele enthält.



3
Hoher Zusammenhalt: verwandtes Verhalten, um zusammenzusitzen, und nicht verwandtes Verhalten, um anderswo zu sitzen.
Teoman Shipahi

Antworten:


237

Hoher Zusammenhalt ist, wenn Sie eine Klasse haben, die einen genau definierten Job macht. Geringer Zusammenhalt ist, wenn eine Klasse viele Jobs erledigt, die nicht viel gemeinsam haben.

Nehmen wir dieses Beispiel:

Sie haben eine Klasse, die zwei Zahlen hinzufügt, aber dieselbe Klasse erstellt ein Fenster, in dem das Ergebnis angezeigt wird. Dies ist eine Klasse mit geringer Kohäsion, da das Fenster und die Addieroperation nicht viel gemeinsam haben. Das Fenster ist der visuelle Teil des Programms und die Additionsfunktion ist die Logik dahinter.

Um eine Lösung mit hohem Zusammenhalt zu erstellen, müssten Sie ein Klassenfenster und eine Klassensumme erstellen. Das Fenster ruft die Methode von Sum auf, um das Ergebnis abzurufen und anzuzeigen. Auf diese Weise entwickeln Sie die Logik und die GUI Ihrer Anwendung separat.


14
Ehrlich gesagt definiere ich Kohäsion nicht so. Ihre Definition ist SRP (Single Responsiblity Principle). Bei der Kohäsion geht es darum, ob paketweise umkreisende Klassen mit denselben Merkmalen nahe beieinander liegen oder nicht.
v.oddou

4
Das SRP (Single Responsiblity Principle) ist nur eine weitere Möglichkeit, dasselbe Konzept auszudrücken. Zusammenhalt ist eher eine Metrik; Die SRP ist eine pragmatische Richtlinie, die, wenn sie befolgt wird, zu zusammenhängenden Klassen führt.
ComDubh

3
Ich denke, das Klassenfenster sollte kein Objekt der Klassensumme aufrufen, da sein einziger Zweck darin besteht, es zu rendern, ohne über die "Existenz" der Klassensumme oder einer anderen Klasse Bescheid zu wissen. Es sollte eine andere Klasse geben, z. B. Treiber, die das Ergebnis von erhalten soll die
Summenklasse

1
Ich verstehe es nicht Dies ist kein Zusammenhalt gemäß dem sauberen Code von Onkel Bob. Dies ist SRP
Karlihnos

Sehr nette Erklärung! Danke
Vincent Llauderes

54

Eine Erklärung dessen, was es aus Steve McConnells Code Complete ist :

Kohäsion bezieht sich darauf, wie eng alle Routinen in einer Klasse oder der gesamte Code in einer Routine einen zentralen Zweck unterstützen . Klassen, die stark verwandte Funktionen enthalten, werden als stark kohäsiv beschrieben, und das heuristische Ziel besteht darin, den Zusammenhalt so stark wie möglich zu gestalten. Kohäsion ist ein nützliches Werkzeug zur Verwaltung der Komplexität, denn je mehr Code in einer Klasse einen zentralen Zweck unterstützt, desto leichter kann sich Ihr Gehirn an alles erinnern, was der Code tut.

Eine Möglichkeit, dies mit Onkel Bobs Clean Code zu erreichen :

Klassen sollten eine kleine Anzahl von Instanzvariablen haben . Jede der Methoden einer Klasse sollte eine oder mehrere dieser Variablen manipulieren. Je mehr Variablen eine Methode manipuliert, desto kohärenter ist diese Methode im Allgemeinen für ihre Klasse. Eine Klasse, in der jede Variable von jeder Methode verwendet wird, ist maximal kohäsiv.

Im Allgemeinen ist es weder ratsam noch möglich, solche maximal zusammenhängenden Klassen zu schaffen. Andererseits möchten wir, dass der Zusammenhalt hoch ist. Wenn die Kohäsion hoch ist, bedeutet dies, dass die Methoden und Variablen der Klasse voneinander abhängig sind und als logisches Ganzes zusammenhalten.

Der Begriff des Zusammenhalts ist stark mit dem Begriff der Kopplung verbunden; Es gibt auch ein Prinzip, das auf der Heuristik der hohen Kohäsion basiert und als Single Responsibility Principle (das S von SOLID) bezeichnet wird.


1
Ich denke, Ihre Antwort ist vollständiger als die akzeptierte, da sie sowohl SRP als auch Zusammenhalt beschreibt und somit hilft, die Besonderheiten und Unterschiede zwischen diesen beiden Konzepten zu verstehen.
The Once-ler

18

Hoher Zusammenhalt ist ein Software-Engineering-Konzept. Grundsätzlich heißt es, dass eine Klasse nur das tun sollte, was sie tun soll, und das vollständig. Überladen Sie es nicht mit Funktionen, die es nicht ausführen soll, und was auch immer direkt damit zusammenhängt, sollte auch nicht im Code einer anderen Klasse erscheinen.

Das Beispiel ist ziemlich subjektiv, da wir auch die Skala berücksichtigen müssen. Ein einfaches Programm sollte nicht zu modularisiert sein, da es sonst fragmentiert wird. Während ein komplexes Programm möglicherweise mehr Abstraktionsebenen benötigt, um sich um die Komplexität zu kümmern.

zB E-Mail-Klasse. Es sollte Datenelemente zu, von, cc, bcc, subject, body enthalten und kann diese Methoden saveAsDraft (), send (), discardDraft () enthalten. Login () sollte jedoch nicht hier sein, da es eine Reihe von E-Mail-Protokollen gibt, und sollte separat implementiert werden.


Es ist die Definition von SRP: "Eine Klasse sollte nur das tun, was sie tun soll, und das vollständig."
AliN11

11

Die Kohäsion wird normalerweise mit einer der LCOM-Metriken (Mangel an Kohäsion) gemessen. Die ursprüngliche LCOM-Metrik stammt von Chidamber und Kemerer. Siehe zum Beispiel: http://www.computing.dcu.ie/~renaat/ca421/LCOM.html

Ein konkreteres Beispiel: Wenn eine Klasse beispielsweise ein privates Feld und drei Methoden hat; Wenn alle drei Methoden dieses Feld verwenden, um eine Operation auszuführen, ist die Klasse sehr zusammenhängend.

Pseudocode einer zusammenhängenden Klasse:

class FooBar {
  private SomeObject _bla = new SomeObject();

  public void FirstMethod() {
    _bla.FirstCall();
  }

  public void SecondMethod() {
    _bla.SecondCall();
  }

  public void ThirdMethod() {
    _bla.ThirdCall();
  }
}

Wenn eine Klasse beispielsweise drei private Felder und drei Methoden hat; Wenn alle drei Methoden nur eines der drei Felder verwenden, ist die Klasse schlecht zusammenhängend.

Pseudocode einer schlecht zusammenhängenden Klasse:

class FooBar {
  private SomeObject _bla = new SomeObject();
  private SomeObject _foo = new SomeObject();
  private SomeObject _bar = new SomeObject();

  public void FirstMethod() {
    _bla.Call();
  }

  public void SecondMethod() {
    _foo.Call();
  }

  public void ThirdMethod() {
    _bar.Call();
  }
}

Die Klasse, die eines tut, ist das Prinzip der Einzelverantwortung, das von Robert C. Martin stammt und eines der SOLID- Prinzipien ist. Das Prinzip schreibt vor, dass eine Klasse nur einen Grund zur Änderung haben sollte.

Die Einhaltung des Grundsatzes der Einzelverantwortung könnte möglicherweise zu einem zusammenhängenderen Kodex führen, aber meiner Meinung nach sind dies zwei verschiedene Dinge.


4

Dies ist ein Beispiel für einen geringen Zusammenhalt:

class Calculator
{


     public static void main(String args[])
     {

          //calculating sum here
          result = a + b;
          //calculating difference here
          result = a - b;
          //same for multiplication and division
     }
}

Ein hoher Zusammenhalt bedeutet jedoch, dass die Funktionen in den Klassen das tun, was sie tun sollen (wie sie genannt werden). Und nicht irgendeine Funktion, die die Arbeit einer anderen Funktion erledigt. Folgendes kann also ein Beispiel für einen hohen Zusammenhalt sein:

class Calculator
{


     public static void main(String args[])
     {

          Calculator myObj = new Calculator();
          System.out.println(myObj.SumOfTwoNumbers(5,7));
      }


     public int SumOfTwoNumbers(int a, int b)
     {

          return (a+b);
     }

     //similarly for other operations

}

3

Eine allgemeine Art, sich das Prinzip des Zusammenhalts vorzustellen, besteht darin, dass Sie einen Code zusammen mit anderem Code suchen sollten, der entweder davon abhängt oder von dem er abhängt. Kohäsion kann und sollte auf Kompositionsniveaus angewendet werden, die über dem Klassenniveau liegen. Beispielsweise sollte ein Paket oder Namespace idealerweise Klassen enthalten, die sich auf ein allgemeines Thema beziehen und die stärker voneinander abhängig sind als von anderen Paketen / Namespaces. Dh Abhängigkeiten lokal halten.


1

Zusammenhalt bedeutet, dass eine Klasse oder eine Methode nur einen definierten Job ausführt. Der Name der Methode oder Klasse sollte ebenfalls selbsterklärend sein. Wenn Sie beispielsweise einen Taschenrechner schreiben, sollten Sie die Klasse "Taschenrechner" und nicht "asdfghj" nennen. Sie sollten auch in Betracht ziehen, für jede Aufgabe eine Methode zu erstellen, z. B. subtrahieren () addieren () usw. Der Programmierer, der Ihr Programm möglicherweise in Zukunft verwendet, weiß genau, was Ihre Methoden tun. Eine gute Benennung kann den Kommentaraufwand verringern

Ein Prinzip ist auch TROCKEN - wiederholen Sie sich nicht


1

Der Begriff Kohäsion wurde ursprünglich verwendet, um Module des Quellcodes als qualitatives Maß dafür zu beschreiben, wie gut der Quellcode des Moduls miteinander in Beziehung stand. Die Idee des Zusammenhalts wird in einer Vielzahl von Bereichen verwendet. Zum Beispiel kann eine Gruppe von Menschen wie eine Militäreinheit zusammenhalten, was bedeutet, dass die Menschen in der Einheit zusammenarbeiten, um ein gemeinsames Ziel zu erreichen.

Das Wesentliche am Zusammenhalt des Quellcodes ist, dass der Quellcode in einem Modul auf ein gemeinsames, genau definiertes Ziel hinarbeitet. Die Mindestmenge an Quellcode, die zum Erstellen der Modulausgänge benötigt wird, befindet sich im Modul und nicht mehr. Die Schnittstelle ist gut definiert und die Eingänge fließen über die Schnittstelle ein und die Ausgänge fließen über die Schnittstelle zurück. Es gibt keine Nebenwirkungen und der Schwerpunkt liegt auf Minimalismus.

Ein Vorteil von funktional zusammenhängenden Modulen besteht darin, dass die Entwicklung und Automatisierung von Komponententests unkompliziert ist. Tatsächlich ist ein gutes Maß für die Kohäsion eines Moduls, wie einfach es ist, einen vollständigen Satz umfassender Komponententests für das Modul zu erstellen.

Ein Modul kann eine Klasse in einer objektorientierten Sprache oder eine Funktion in einer funktionalen Sprache oder einer nicht objektorientierten Sprache wie C sein. Ein Großteil der ursprünglichen Arbeit in diesem Bereich der Messung des Zusammenhalts betraf hauptsächlich die Arbeit mit COBOL-Programmen bei IBM in den USA Der Zusammenhalt der 1970er Jahre ist also definitiv nicht nur ein objektorientiertes Konzept.

Die ursprüngliche Absicht der Forschung, aus der das Konzept des Zusammenhalts und das damit verbundene Konzept der Kopplung hervorgingen, war die Untersuchung, wo die Merkmale von Programmen liegen, die leicht zu verstehen, aufrechtzuerhalten und zu erweitern sind. Ziel war es, Best Practices für die Programmierung zu erlernen, diese Best Practices zu kodifizieren und diese dann anderen Programmierern beizubringen.

Das Ziel guter Programmierer ist es, Quellcode zu schreiben, dessen Kohäsion angesichts der Umgebung und des zu lösenden Problems so hoch wie möglich ist. Dies impliziert, dass in einer großen Anwendung einige Teile des Quellcode-Körpers von anderen Teilen hinsichtlich des Kohäsionsgrades des Quellcodes in diesem Modul oder dieser Klasse abweichen. Manchmal ist das Beste, was Sie erreichen können, der zeitliche oder sequentielle Zusammenhalt aufgrund des Problems, das Sie lösen möchten.

Das beste Maß an Kohäsion ist der funktionale Zusammenhalt. Ein Modul mit funktionaler Kohäsion ähnelt einer mathematischen Funktion, indem Sie eine Reihe von Eingaben bereitstellen und eine bestimmte Ausgabe erhalten. Ein wirklich funktionsfähiges Modul hat neben der Ausgabe weder Nebenwirkungen noch behält es irgendeinen Zustand bei. Es wird stattdessen eine gut definierte Schnittstelle haben, die die Funktionalität des Moduls kapselt, ohne die Interna des Moduls freizulegen, und die Person, die das Modul verwendet, stellt einen bestimmten Satz von Eingaben bereit und erhält dafür eine bestimmte Ausgabe. Ein wirklich funktionierendes Modul sollte auch threadsicher sein.

Viele Programmiersprachenbibliotheken enthalten eine Reihe von Beispielen für Funktionsmodule, ob Klassen, Vorlagen oder Funktionen. Die funktionalsten zusammenhängenden Beispiele wären mathematische Funktionen wie Sünde, Kosinus, Quadratwurzel usw.

Andere Funktionen können Nebenwirkungen haben oder einen Zustand aufrechterhalten, was dazu führt, dass die Verwendung dieser Funktionen komplizierter wird.

Zum Beispiel eine Funktion, die eine Ausnahme auslöst oder eine globale Fehlervariable setzt ( errnoin C) oder in einer Sequenz verwendet werden muss ( strtok()Funktion ist ein Beispiel aus der Standard C-Bibliothek, da sie einen internen Zustand beibehält) oder die einen Zeiger bereitstellt, der dann muss verwaltet werden oder ein Protokoll an ein Protokolldienstprogramm ausgeben, sind Beispiele für eine Funktion, die keinen funktionalen Zusammenhalt mehr aufweist.

Ich habe sowohl das Originalbuch von Yourdon als auch Constantine, Structured Programming, gelesen, in dem ich in den 1980er Jahren zum ersten Mal auf die Idee des Zusammenhalts gestoßen bin, und Meilir Page-Jones 'Buch Practical Guide to Structured Systems Design, und Page-Jones hat es viel besser beschrieben sowohl Kopplung als auch Zusammenhalt. Das Buch von Yourdon und Constantine wirkt etwas akademischer. Steve McConnells Buch Code Complete ist ziemlich gut und praktisch, und die überarbeitete Ausgabe hat einiges über gute Programmierpraxis zu sagen.


Sie sagen, The minimum amount of source code needed to create the module outputs is in the module and no moredies hängt nicht mit dem Zusammenhalt zusammen, sondern mit DTSTTCPW
v.oddou

@ v.oddou, die Mindestmenge an Code hängt tatsächlich mit dem Zusammenhalt zusammen. Je mehr Code in einem Modul vorhanden ist, der nicht mit den Modulausgaben zusammenhängt, desto wahrscheinlicher hat der Code Nebenwirkungen und damit eine geringere Kohäsion. Jedes Konzept hat unterschiedliche Perspektiven, insbesondere Konzepte wie Kohäsion, die etwas mehrdeutig sind. Die Messungen für die Kohäsion sind qualitativ und erfordern eine Art Fuzzy-Logik, um ein bestimmtes Modul der einen oder anderen Kategorie unter Verwendung einer Rubrik zuzuordnen. Die Angabe des Mindestcodes für die Ausgänge ist keine ausreichende Eigenschaft für eine hohe Kohäsion, sondern nur eine von mehreren.
Richard Chambers


0

Die meisten Antworten erklären nicht, was Zusammenhalt ist. Es ist im sauberen Code von Onkel Bobs Buch gut definiert.

Klassen sollten eine kleine Anzahl von Instanzvariablen haben. Jede der Methoden einer Klasse sollte eine oder mehrere dieser Variablen manipulieren. Je mehr Variablen eine Methode manipuliert, desto kohärenter ist diese Methode im Allgemeinen für ihre Klasse. Eine Klasse, in der jede Variable von jeder Methode verwendet wird, ist maximal kohäsiv. Im Allgemeinen ist es weder ratsam noch möglich, solche maximal zusammenhängenden Klassen zu schaffen. Andererseits möchten wir, dass der Zusammenhalt hoch ist. Wenn die Kohäsion hoch ist, bedeutet dies, dass die Methoden und Variablen der Klasse voneinander abhängig sind und als logisches Ganzes zusammenhalten.

Lassen Sie es mich mit einer Klassendefinition erklären

class FooBar {
private _bla;
private _foo;
private _bar;

function doStuff()

   if(this._bla>10){
     this._foo = 10;
     this._bar = 20;
   }

}
function doOtherStuff(){

    if(this._foo==10){
       this._bar = 100;
       this._bla = 200;
    }
}

}

Wenn Sie das obige Beispiel sehen, ist die Klasse zusammenhängend, was bedeutet, dass die Variablen von der Klasse gemeinsam genutzt werden, um zusammenzuarbeiten. Weitere Variablen werden gemeinsam genutzt, was bedeutet, dass die Klasse sehr zusammenhängend ist und als eine Einheit arbeitet.

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.