Methoden-Kohäsion

Unter Kohäsion versteht man den Zusammenhalt einer Methode. Anders ausgedrückt: wie eng stehen die Operationen innerhalb einer Methode miteinander in Beziehung?

Grundsatz: je stärker die Kohäsion innerhalb einer Methode, um so besser!

Ein Beispiel für perfekte Kohäsion ist die Methode sin(). Die ganze Methode ist nur einem einzigen Zweck gewidment, nämlich der Berechnung eines Sinus-Wertes. Eine Methode sinAndTan() besitzt schon beträchtlich weniger Kohäsion, da hier mehr als ein Ziel verfolgt wird. Das Ziel sollte immer sein, Methoden zu schreiben, die einen einzigen Zweck haben und somit starke Kohäsion aufweisen.

Arten von Kohäsion

Man kann mehrere Arten von Kohäsion unterscheiden. Unter "Art" kann man den Grund verstehen, warum bestimmte Operationen in einer Methode vereint sind. Grundsätzlich kann zwischen akzeptabler und inakzeptabler Kohäsion unterschieden werden.

Akzeptable Kohäsion

Im Folgenden werden die (wichtigsten) Arten von aktzeptabler Kohäsion beschrieben, wobei sie in absteigender Kohäsions-Intensität geordnet sind.

Funktionale
Kohäsion:

Die stärkste und beste Kohäsionsart. Die Methode führt eine einzige Operation aus.

Beispiele: sin(), getCustomerName(), eraseFile(), getLocation()

Sequentielle
Kohäsion:

Die Art der Kohäsion tritt dann auf, wenn eine Methode Operationen enthält, die die selben Daten benutzen und in einer bestimmten Reihenfolge aufgerufen werden müssen aber zusammen keine vollständige Funktion bilden.

Beispiel: Ein Programm besitzt fünf Operationen: Datei öffnen, Datei lesen, Berechnen, Ergebnisse ausgeben und Datei schließen. Die Funktionen sind in zwei Methoden doStep1() und doStep2() organisiert. doStep1() und doStep2() haben sequentielle Kohäsion, weil durch diese Aufteilung keine unabhängigen Methoden entstanden sind. Besser wäre hier allerdings die Zusammenfassung der Operationen in eine Methode getFileData(), die wiederrum funktionale Kohäsion besitzt.

Kommunkations-kohäsion:

Wenn die Operationen einer Methode die selben Daten benützen und dies der einzige Zusammenhang zwischen diesen Operationen ist, spricht man von Kommunikationskohäsion.

Beispiel: GetNameAndChangePhoneNumber() hat Kommunikationskohäsion, wenn sowohl der Name als auch die Telefonnummer, z.B. im selben Kunden-Objekt gespeichert sind.

Temporale Kohäsion:

Wenn Operationen in eine Methode kombiniert wurden, weil sie zu einem bestimmten Zeitpunkt ausgeführt werden müssen, ist dies temporale Kohäsion. Typischerweise heißen solchen Methoden dann startup() oder shutdown().

Dies ist eine problematische Art der Kohäsion. Jedoch kann sie akzeptiert werden, wenn in solchen Methoden keine Operationen direkt ausgeführt werden, sondern nur andere Methoden aufgerufen werden, die die eigentlichen Aufgaben erfüllen.

   

Inakzeptable Kohäsion

Die folgenden Arten von Kohäsion sollten vermieden werden.

Prozedurale Kohäsion:

Diese Art der Kohäsion ist dann vorhanden, wenn Operationen in einer Routine in einer bestimmten Reihenfolge ausgeführt werden, aber keine gemeinsamen Daten verwendet.

Beispiel: Eine Methode, die verschiedene Arten von Berichten nacheinander druckt. So eine Methode ist schwierig zu benennen.

Logische Kohäsion:

Dies ist dann der Fall, wenn verschiedene Operationen in einer Methode sind, die durch ein Kontrollflag ausgewählt werden. D.h. der Aufrufer muss über den internen Aufbau der Methode Bescheid wissen.

Gekennzeichnet sind solche Methoden meist durch eine große if bzw. switch-Anweisung, die das einzige ist, was diese Methode zusammenhält. Um diese nicht akzeptable Art der Kohäsion aufzuheben, sollte die Methode in mehrere Methoden aufgeteilt werden, die jeweils wieder nur einem bestimmten Zweck dienen.

Zufällige (chaotische Kohäsion):

Von dieser Art der Kohäsion spricht man, wenn die Operationen in der Methode offensichtlich völlig willkürlich und chaotisch zusammengesteckt wurden. Es ist nicht erkennbar, warum diese Operationen in einer Methode sind.

Das "schlechte Beispiel" aus der Einleitung weist eine solche chaotische Kohäsion auf.

 

Weiter