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
|