Donnerstag, 27. November 2014

Einfachheit der Struktur - Größe, Kohäsion und Kopplung

In den vorhergehenden Artikeln haben wir die Konzepte der Kohäsion sowie der Kopplung besprochen. Im vorliegenden Artikel möchte ich nun die Zusammenhänge zwischen Kohäsion, Kopplung und der Größe von Software-Elementen betrachten. Wir können diese Zusammenhänge als ein Spiel der Kräfte auffassen, die sich antagonistisch gegenüberstehen. Einige Kräfte wirken in Richtung einer Ausdehnung der Struktur-Elemente einer Ebene. Andere Kräfte wirken eingrenzend auf dieselben Elemente. Es lassen sich drei fundamentale Kräfte identifizieren:
  • Internalisierungskraft: die Tendenz, Relationen zu internalisieren (ausdehnend)
  • kohäsive Abstoßung zwischen Subelementen, die nicht zusammengehören (eingrenzend)
  • Überdehnung von Elementen, die zu viele Subelemente aufnehmen (eingrenzend)
Es ergibt sich das folgende Gesamtbild, das wir in den folgenden Abschnitten eingehend behandeln werden:

1. Internalisierungskraft

Wir können das Streben nach Entkopplung auf einer gegebenen Ebene des Software-Systems als eine Kraft auffassen, die uns dazu bewegen möchte, Relationen zu internalisieren. Um dies etwas zu präzisieren, führe ich folgende Sprachregelung ein:

Gegeben sei eine aktuelle Betrachtungs-Ebene, z. B. die Ebene der Typen oder die Ebene der Pakete. Wir sprechen auf dieser Ebene von "Elementen", die aus "Subelementen" zusammengesetzt sind. Und wir sprechen weiterhin
  • von einer internen Relation, wenn diese Relation zwischen zwei Subelementen besteht, die beide zu einem einzigen Element gehören
  • von einer externen Relation, wenn diese Relation zwischen zwei Subelementen besteht, die zu verschiedenen Elementen gehören.
Wären unsere Elemente Module, so könnten wir von intramodularen und extramodularen Relationen sprechen. Da wir uns sprachlich nicht auf Module festlegen wollen, sprechen wir von internen und externen Relationen. Dabei behalten wir im Sinn, dass diese Sprachregelung immer eine festgelegte System-Ebene voraussetzt, d. h. es muss klar sein, welcher Art die Elemente und Subelemente sind.

Interne Relationen fassen wir als positiv auf, da sie die strukturelle Kohäsion verstärken. Externe Relationen fassen wir als negativ auf, da sie den Kopplungsgrad auf der gegebenen System-Ebene erhöhen. Das Streben nach Internalisierung von Relationen basiert also sowohl auf der Forderung nach hoher Kohäsion als auch auf der Forderung nach schwacher Kopplung. Ich nenne diese Kraft Internalisierungskraft.

Da beide Subelemente einer Relation zum selben Element gehören müssen, damit die Relation zu einer internen Relation wird, wirkt die Internalisierungskraft tendentiell in Richtung einer Vergrößerung der Elemente. Um eine Relation zu internalisieren, muss immer auch mindestens ein neues Subelement in das Element aufgenommen werden.

2. Kohäsive Abstoßung

Die Internalisierungskraft drängt uns also dazu, immer mehr Subelemente in ein Element aufzunehmen. Würde dieser Kraft nichts entgegenstehen, so führte dies zu einem monolithischen Gesamtelement, in dem alle Relationen interne Relationen wären und es keine externen Relationen mehr gäbe. Der erste Antagonist dieser Tendenz leitet sich aus dem Konzept der Kohäsion ab.

Die Forderung nach Kohäsion bedeutet, dass in einem Element nur solche Subelemente zusammengefasst werden sollen, die zusammengehören (engl. togetherness). Bei aller Unschärfe dieses Zusammengehörigkeits-Konzepts ist doch klar, dass in einem hinreichend großen System Subelemente existieren, die nicht zusammengehören und die also nicht in dasselbe Element aufgenommen werden sollten. Ich bezeichne diese Kraft, die sich dagegen sträubt, dass unzusammengehörige Subelemente in dasselbe Element aufgenommen werden, als kohäsive Abstoßung.

An dieser Stelle bemerken wir, dass das Konzept der Kohäsion zwei Facetten hat, denn es ist auch sinnvoll, von einer kohäsiven Anziehung zu sprechen. Stellen wir fest, dass zwei Subelemente zusammengehören, so möchten wir sie intuitiv in dasselbe Element aufnehmen, da dies die Kohäsion des Elements erhöht. Die kohäsive Anziehung wirkt auf die Subelemente selbst, während die Internalisierungskraft auf die Relationen wirkt. In der Regel wird jedoch die kohäsive Anziehung dadurch widergespiegelt, dass die beiden Subelemente durch eine Relation verbunden sind. In solchen Fällen wirkt bereits die Internalisierungskraft. Wir können daher die kohäsive Anziehung als enge Verwandte der Internalisierungskraft auffassen und müssen nicht gesondert auf sie eingehen.

Wichtig ist, dass die kohäsive Abstoßung jeweils vom einzelnen Subelement ausgeht, das sich der Internalisierungskraft des Elements widersetzt. Dies unterscheidet die kohäsive Abstoßung von der Überdehnung, die wir im folgenden Abschnitt behandeln.

3. Überdehnung

Unter den meisten Autoren besteht Einigkeit darüber, dass die Komplexität eines Elements schneller ansteigt als seine Größe. Einige Autoren (z. B. [Wang2007] oder [Sessions2011]) unterstellen gar ein exponentielles Wachstum. Ohne in die Details dieser Diskussion einsteigen zu wollen, geht das oben gezeigte Kräftemodell davon aus, dass die Komplexität eines Elements mit seiner Größe (d. h. der Zahl seiner Subelemente) ansteigt und dass dieser Anstieg (zumindest ab einer bestimmten Mindestzahl) steiler ist als der Größenanstieg.

Ein Teil dieses Komplexitätsanstiegs mag auf fehlende Kohäsion zurückzuführen sein, die wir bereits als kohäsive Abstoßung beschrieben hatten. Es spielen jedoch auch andere Aspekte eine bedeutsame Rolle:
  • Zahlreiche Autoren (z. B. [Wang2007] oder [Lilienthal2008]) heben kognitive Aspekte hervor, die mit der Beschränkung der kognitiven menschlichen Ressourcen zu tun haben. Werden solche Größenlimits überschritten, so können die Subelemente eines Elements nicht mehr innerhalb eines einzigen kognitiven Verarbeitungsvorgangs erfasst oder erinnert werden, so dass der Vorgang sequentialisiert (in mehrere aufeinanderfolgende Teilvorgänge aufgeteilt) oder parallelisiert (= auf verschiedene Personen aufgeteilt) werden muss.
  • Andere Autoren stellen den exponentiellen Anstieg potentieller Relationen [Wang2007] oder gar potentieller Partinionierungen [Sessions2011] in einen Zusammenhang mit dem Komplexitätsanstieg.
Diese Aspekte haben eher mit der Größe des Elements selbst zu tun als mit den Zusammenhängen zwischen einzelnen Elementen, wie es bei der kohäsiven Abstoßung der Fall war. Wir können diese Aspekte als eine der Vergrößerung entgegenwirkende Kraft auffassen, da mit zunehmender Größe ein immer größerer Preis gezahlt werden muss, um weitere Subelemente in das Element aufzunehmen. Um diesen Preis nicht allgemein mit "Komplexität" bezeichnen zu müssen (der Begriff, an den wir uns im Rahmen dieser Artikelserie wesentlich vielschichtiger annhähern wollen), nenne ich diese Kraft Überdehnung.

4. Der Wunsch nach einer Gesamtformel

Nur zu gerne würden wir strukturelle Komplexität als Funktion einer festen Anzahl von Eigenschaften betrachten, z. B. als f(Größe, Kohäsionsgrad, Kopplungsgrad). Die oben gezeigte Abbildung könnte den Eindruck vermitteln, als wäre dies möglich. Derzeit existiert jedoch kein allgemein akzeptiertes Modell, das eine solche Funktion zur Verfügung stellt. In [Sessions2011] wird ein Modell vorgestellt, das zumindest den Versuch macht. Dieses Modell werde ich im nächsten Blogartikel vorstellen.

5. Zusammenfassung

Obwohl Größe, Kohäsion, Kopplung und Komplexität zu den meist untersuchten Eigenschaften von Software gehören, existiert bis heute kein zufriedenstellendes Modell, dass diese Eigenschaften in Beziehung setzt. Insbesondere sind diese Zusammenhänge nicht so formal untersucht worden, dass es möglich wäre, eine mathematisch fundierte Gesamtfunktion zu entwickeln.

Im vorliegenden Artikel haben wir versucht, eine grundlegende Zusammenhänge zu beschreiben und zu veranschaulichen. Zu diesem Zweck haben wir auf die Metapher eines Kräftemodells zurückgegriffen und die genannten Konzepte als Kräfte modelliert, die auf die Ausdehnung oder Eingrenzung einzelner Software-Elemente einer Struktur-Ebene wirken. Wir konnten drei Grundkräfte identifizieren:
  • die Internalisierungskraft, die darauf abzielt, Relationen zwischen Subelementen in das Innere von Elementen aufzunehmen (sowie ihre enge Verwandte, die kohäsive Anziehung)
  • die kohäsive Abstoßung, die als Widerstand einzelner Subelemente aufgefasst werden kann, in ein bestimmtes Element aufgenommen zu werden
  • die Überdehnung, die als ein mit der Größe eines Elements immer steiler ansteigender Widerstand aufgefasst werden kann, weitere Subelemente in das Element aufzunehmen.
Die Modellierung von Struktur-Ebenen bewegt sich im Spannungsfeld dieser Kräfte.

6. Quellen

[Lilienthal2008] - Komplexität von Softwarearchitekturen, Carola Lilienthal (2008)

[Sessions2011] - The Mathematics of IT Simplication, Roger Sessions (2011), siehe http://dl.dropboxusercontent.com/u/97323460/WebDocuments/WhitePapers/MathOfITSimplification-103.pdf

[Wang2007] - Software Engineering Foundations - A Software Science Perspective, Wang, Yingxu (2007)