Kohäsion

Die Kohäsion bestimmt ein Maß für die Stärke des inneren Zusammenhangs eines Moduls. Dabei definiert ein Modul im Sinne des Software-Engineerings einen zusammenhängenden Programmcode mit einem gemeinsamen Namen, unter dem es auch von anderen Programmteilen identifiziert und aufgerufen werden kann. Die möglichen Ausprägungen einer Kohäsion werden dabei auf einer Skala von eins bis sieben eingeordnet. Das höchste Maß mit sieben ist dabei Systemen mit funktionaler Dekomposition zuzuordnen. Gut zu pflegende und wiederverwendbare Module basieren auf einer starken Kohäsion. Kohäsion ist neben Kopplung, Datenkapselung sowie Information Hiding ein Kriterium für die Modularisierung.


Im Software-Engineering gab es bereits früh Ansätze, die sich mit dem Thema der Kohäsion auseinander setzten. Hierbei ging man zunächst davon aus, ähnliche Funktionen zusammenzufassen. Das führte in der Folge aber nicht unbedingt zu einer stabilen Systemstruktur. Im Zusammenhang mit der Objekt- aber auch der aspektorientierten Programmierung hat der Begriff der Kohäsion eine zentrale Bedeutung, so dass die nachfolgende Differenzierung sinnvoll erscheint:

Zufällige Kohäsion. Wird auch als der Zustand von vollständig fehlender Kohäsion bezeichnet. Dabei realisiert ein Modul Folgen von Programm-Anweisungen, die in keinerlei Zusammenhang miteinander stehen.

Logische Kohäsion. Die Aktionen eines Moduls stehen in direkter Beziehung zueinander und können vom aufrufenden Modul zum Beispiel durch die explizite Übergabe eines Parameters gezielt angesprochen werden.

Zeitliche Kohäsion. Die Aktionen eines Moduls stehen in zeitlichem Zusammenhang zueinander.

Prozedurale Kohäsion. Die Aktionen eines Moduls werden in einer bestimmten Abfolge von Schritten umgesetzt.

Kommunikative Kohäsion. Setzt zunächst eine prozedurale Kohäsion voraus und den Zugriff auf einen gemeinsamen Datenbestand.

Objektbezogene Kohäsion. In einem Modul werden mehrere Aktionen umgesetzt, die jedoch völlig unabhängig voneinander implementiert sind, aber auf einen gemeinsamen Datenbestand zugreifen. Typische Beispiele für eine objektbezogende Kohäsion sind die Implementierung eines abstrakten Datentyps oder eines Objektes.

Funktionale Kohäsion. Ein Modul verantwortet genau eine Aktion.

Damit ist die Bestimmung der Kohäsion als ein Maß für die Zusammengehörigkeit der Anweisungen innerhalb eines Moduls auf einer Skala mit Eins beginnend (= zufällige Kohäsion) und aufsteigend bis zu Sieben (= funktionale Kohäsion) direkt abzulesen.

Eine bessere Kohäsion für ein Modul wird im Wesentlichen dadurch erreicht, dass

  • das Prinzip der Datenkapselung im Sinne der Objekt-orientierten Software-Entwicklung um-gesetzt wird - d.h. keine globalen Datenobjekte,
  • die Regeln zur Bildung von Paketen eingehalten werden,
  • bei der objektorientierten Software-Entwicklung Datenstrukturen ( Instanzvariablen) und Operationen ( Methoden) eng miteinander verbinden,
  • nicht mehrere Operationen derselben Funktion dienen,
  • Schnittstellen zwischen Modulen müssen effizient gestaltet sein,
  • eine sinnvolle Kombination von Kopplung und Kohäsion beachtet wird, und
  • dass keine Partitionierung in Untergruppen von ursprünglich zusammengehörenden Methoden und Attributen erfolgt. Hier spricht man auch von Kohärenten Klassen.
Auch die aspektorientierte Programmierung unterstützt ein hohes Maß an Kohäsion, da hierbei die Funktionale Kohäsion ein grundlegendes Ziel ist. Dieses Ziel wird genau daran erreicht, wenn eine von der Umgebung isolierte Aktion ausgeführt wird, man bezeichnet dies auch als Crosscutting-Verhalten. Die genannten anderen Differenzierungen kommen bei der Aspekt-orientierten Programmierung nicht in Betracht weil

  • die Logische Kohäsion die Möglichkeit eines direkten Aufrufs voraussetzen würde,
  • bei der zeitlichen, prozeduralen sowie kommunikativen Kohäsion eine zeitliche und inhaltliche Reihenfolge vorausgesetzt wird, die dem Crosscutting-Verhalten widerspricht und
  • die Zuordnung von Aspekten zur objektorientierten Kohäsion ebenso nicht möglich ist, weil Aspekte sich immer am Verhalten und nicht an den Daten orientieren. Würden sich Aspekte nämlich ausschließlich an einem gemeinsamen Datenbestand orientieren, würden wiederum mehrere Funktionen ineinander integriert - es wären dann weder eine funktionale Kohäsion noch die Wiederverwendbarkeit dieses Aspektes darstellbar.
Ein hohes Maß an Kohäsion eines Moduls erleichtert also sowohl dessen Verständnis, als auch dessen Wartung und mögliche Anpassung.

Informationen zum Artikel
Deutsch: Kohäsion
Englisch: cohesion
Veröffentlicht: 28.10.2013
Wörter: 634
Tags: #Entwicklung, Codierung
Links: Anpassung, Anweisung, Aspekt, Aspektorientierte Programmierung, Crosscutting Concerns