Sonntag, 24. Februar 2013

Kopplung und Kohäsion - Komplexitätsbetrachtungen

Erst indem Software-Elemente zueinander in Beziehung treten, also Kopplungen eingehen, sind sie in der Lage, höherwertige Funktionen zu realisieren. Zugleich entsteht durch jede Beziehung eine Abhängigkeit, welche die System-Komplexität steigen lässt. Kopplungen sind zugleich Segen und Fluch der Softwaretechnik.

Was ist Software-Komplexität?

Software-Komplexität hat einen psychologischen Aspekt, und dies macht es schwierig, sie ausschließlich auf der Grundlage von Systemeigenschaften zu bestimmen. Etablierte Komplexitätsmetriken fokussieren unweigerlich auf bestimmte Eigenschaften der Software und lassen andere außer Acht. Ein universaler und praktikabler Begriff der Software-Komplexität steht uns bis heute nicht zur Verfügung. Dennoch würden viele Software-Schaffende zustimmen, dass es bei der Konstruktion von Software oftmals um die Reduktion und Handhabung von Komplexität geht.

Wie in [Sneed 2010] gezeigt wird, lassen sich zahlreiche Eigenschaften, die zur Bestimmung der Komplexität von Software-Systemen in den letzten Jahrzehnten vorgeschlagen wurden, als Beziehungen abstrahieren. Auf ähnliche Weise formalisiert [Wang 2007] Komplexität: Er betrachtet die Komplexität als maximal, wenn alle Komponenten eines Systems mit allen Komponenten in Beziehung stehen. Die Komplexität eines konkreten Systems kann dann als Teilmenge dieser maximalen Komplexität betrachtet werden.

Die maximale Komplexität wächst mit der Anzahl der Komponenten quadratisch, sie entspricht der Anzahl der Kanten in einem vollständigen Graphen, die bei gegebener Anzahl der Knoten n wie folgt berechnet wird:


Etwas unbefriedigend an diesem (immerhin einfachen) Ansatz ist die Vermischung von Ausmaß und Komplexität eines Software-Systems: Mit der Größe des Systmems steigt automatisch auch seine maximale Komplexität. Um die reine Komplexität verschiedener Lösungen größenunabhängig vergleichen zu können, wäre es sicherlich wünschenswert, die gefundene Maßzahl zu normalisieren. Dennoch halten wir fest:
Software-Komplexität lässt sich wesentlich auf der Grundlage der Beziehungen zwischen den Elementen des Systems bestimmen.

 Weniger Kopplung = Komplexitätsreduktion?

Wo sich Kopplungen ersatzlos entfernen lassen, führt eine geringere Kopplung automatisch zu einer Komplexitätsreduktion des Systems. Im Zusammenhang mit Kopplung und Kohäsion geht es jedoch oftmals nicht um das reine Entfernen von Beziehungen, sondern um eine Gruppierung und Kapselung von Beziehungen innerhalb kohäsiver Software-Elemente (Systeme, Komponenten, Module, ...). Eine Komplexitätsreduktion wird in diesem Fall nur dann erreicht, wenn eine "komplexere" Beziehungsart durch eine weniger komplexe ersetzt wird. Dass eine solche Komplexitätsreduktion durchaus oftmals erreicht wird, zeigen einige plausible Annahmen:
  • Beziehungen zwischen zwei Systemlandschaften sind oftmals komplexer als Beziehungen zwischen zwei Systemen innerhalb einer Systemlandschaft.
  • Beziehungen zwischen zwei verschiedenen Systemen sind oftmals komplexer als Beziehungen innerhalb eines Systems.
  • Beziehungen zwischen Modulen sind oftmals komplexer als Beziehungen zwischen Funktionen.
  • Beziehungen zwischen Funktionen sind oftmals komplexer als Beziehungen innerhalb einer Funktion.
Weniger Kopplung zu Gunsten von mehr Kohäsion wirkt also genau dann komplexitätsreduzierend, wenn eine "komplexere" Beziehungsart durch eine weniger komplexe ersetzt wird. Neben der Gruppierung und Kapselung von Abhängigkeiten ist dies ein wesentlicher Aspekt der Prinzipien, die eine lose Kopplung und eine hohe Kohäsion verlangen.

In welcher Hinsicht einzelne Beziehungen als komplexer einzustufen sind als andere, muss dabei an einer anderen Stelle noch ausführlicher betrachtet werden.

Quellen

[Sneed 2010] - Software in Zahlen - Die Vermessung von Applikationen, Harry Sneed, Richard Seidl, Manfred Baumgartner (2010)
[Wang 2007]  - Software Engineering Foundations - A Software Science Perspective, Wang, Yingxu (2007)