Kohäsion ist ein qualitatives Maß, d.h. der zu messende Quellcode wird anhand einer Rubrik untersucht, um eine Klassifizierung zu ermitteln. Die Kohäsionstypen, von der schlechtesten bis zur besten, sind wie folgt:
Zufällige Kohäsion (schlechteste) Zufällige Kohäsion ist, wenn Teile eines Moduls willkürlich gruppiert sind; die einzige Beziehung zwischen den Teilen ist, dass sie zusammen gruppiert wurden (z. B. eine Klasse „Utilities“). Beispiel:
/*Groups: The function definitionsParts: The terms on each function*/Module A{ /* Implementation of r(x) = 5x + 3 There is no particular reason to group functions in this way, so the module is said to have Coincidental Cohesion. */ r(x) = a(x) + b(x) a(x) = 2x + 1 b(x) = 3x + 2}
Logische Kohäsion Logische Kohäsion ist, wenn Teile eines Moduls gruppiert werden, weil sie logisch kategorisiert sind, um das Gleiche zu tun, obwohl sie von Natur aus unterschiedlich sind (z. B. Gruppierung aller Routinen zur Behandlung von Maus- und Tastatureingaben). Zeitliche Kohäsion Zeitliche Kohäsion liegt vor, wenn Teile eines Moduls danach gruppiert sind, wann sie verarbeitet werden – die Teile werden zu einem bestimmten Zeitpunkt der Programmausführung verarbeitet (z. B. eine Funktion, die nach dem Abfangen einer Ausnahme aufgerufen wird, die offene Dateien schließt, ein Fehlerprotokoll erstellt und den Benutzer benachrichtigt). Prozedurale Kohäsion Prozedurale Kohäsion liegt vor, wenn Teile eines Moduls gruppiert sind, weil sie immer einer bestimmten Ausführungsreihenfolge folgen (z. B. eine Funktion, die Dateirechte prüft und dann die Datei öffnet). Kommunikative/informationelle Kohäsion Kommunikative Kohäsion liegt vor, wenn Teile eines Moduls gruppiert sind, weil sie auf denselben Daten operieren (z. B. ein Modul, das auf demselben Datensatz von Informationen operiert). Sequentielle Kohäsion Sequentielle Kohäsion liegt vor, wenn Teile eines Moduls gruppiert sind, weil die Ausgabe von einem Teil die Eingabe für einen anderen Teil ist, wie bei einem Fließband (z. B. eine Funktion, die Daten aus einer Datei liest und verarbeitet). Funktionale Kohäsion (am besten) Von funktionaler Kohäsion spricht man, wenn Teile eines Moduls gruppiert sind, weil sie alle zu einer einzigen wohldefinierten Aufgabe des Moduls beitragen (z. B. die lexikalische Analyse eines XML-Strings). Beispiel:
/*Groups: The function definitionsParts: The terms on each function*/Module A { /* Implementation of arithmetic operations This module is said to have functional cohesion because there is an intention to group simple arithmetic operations on it. */ a(x, y) = x + y b(x, y) = x * y}Module B { /* Module B: Implements r(x) = 5x + 3 This module can be said to have atomic cohesion. The whole system (with Modules A and B as parts) can also be said to have functional cohesion, because its parts both have specific separate purposes. */ r(x) = .a(.b(5, x), 3)}
Perfekte Kohäsion (atomar) Beispiel.
/*Groups: The function definitionsParts: The terms on each function*/Module A { /* Implementation of r(x) = 2x + 1 + 3x + 2 It's said to have perfect cohesion because it cannot be reduced any more than that. */ r(x) = 5x + 3}
Obwohl es sich bei der Kohäsion um eine Art Rangskala handelt, zeigen die Ränge keine stetige Progression der verbesserten Kohäsion an. Studien von verschiedenen Personen, darunter Larry Constantine, Edward Yourdon und Steve McConnell, zeigen, dass die ersten beiden Arten von Kohäsion minderwertig sind; kommunikative und sequenzielle Kohäsion sind sehr gut; und funktionale Kohäsion ist überlegen.
Während funktionale Kohäsion als die wünschenswerteste Art von Kohäsion für ein Softwaremodul angesehen wird, ist sie möglicherweise nicht erreichbar. Es gibt Fälle, in denen die kommunikative Kohäsion das höchste Maß an Kohäsion ist, das unter den gegebenen Umständen erreicht werden kann.