Donnerstag, 10. Juli 2014

Zyklische Abhängigkeiten - verschiedene Formen

Dieser Artikel ist Teil der folgenden Serie über zyklische Abhängigkeiten. Zahlreiche Grundbegriffe, Konzepte und empirische Befunde wurden im Rahmen dieser Serie detailliert dargestellt. Im vorliegenden Artikel stelle ich unterschiedliche Erscheinungsformen zyklischer Abhängigkeiten vor.

Die Serie

Einführung
Terminologie
Werkzeugunterstützung für Java
Wo liegt eigentlich das Problem?
Einfluss auf Qualitätsmerkmale
Die Praxis
Verschiedene Erscheinungsformen (dieser Artikel)
Zusammenhang mit der Pakethierarchie
Zusammenhang mit der Domäne
Einige Metriken
Durchbrechung von Zyklen
Das Prinzip

Nachdem ich im vorigen Artikel einige Studien vorgestellt habe, die zeigen, in welchem Ausmaß zyklische Abhängigkeiten in der Praxis vorkommen, werde ich nun die Ergebnisse der aktuellen Studie "On The Shape of Circular Dependencies in Java Programs" [Dietrich2014] zusammenfassen, die ein differenzierteres Bild der Erscheinungsformen von Zyklen zeichnet. Die Autoren werfen die Frage auf, ob die weite Verbreitung von Zyklen womöglich darauf hinweisen könnte, dass Zyklen in bestimmten Varianten weniger problematisch sind als in anderen Varianten. Sie teilen Zyklen in folgende topologische Kategorien ein:
Diese Topologien wurden auf der Basis folgender Kriterien ausgewählt. Jede Topologie muss ...
  • einer bekannten visuellen Metapher entsprechen (Verständlichkeit)
  • mit Metriken von geringer Komplexität werkzeugbasiert ermittelbar sein (Skalierbarkeit)
  • in signifikanter Häufigkeit in realer Software vorkommen (Relevanz)
  • unter einer kleinen Zahl zufälliger Modifikationen stabil bleiben (Stabilität).
Insgesamt wurden 107 Software-Systeme auf das Vorkommen dieser Topologien hin untersucht. Dabei können 98,7% aller Zyklen einer der genannten Topologien zugeordnet werden, was auf eine gute Vollständigkeit der vorgeschlagenen Kategorien hindeutet. Die folgenden Tabellen geben eine Übersicht der Ergebnisse für Klassen. Die linke Tabelle gibt die Anzahl der gefundenen Zyklen an, während die rechte Tabelle die Zyklengrößen (Durchschnitt, Maximum und Standardabweichung) darstellt. Die Spalte "class (tangles)" enthält dabei die Werte unter Einbeziehung innerer Klassen. In der Spalte "top level class (tangles)" sind die entsprechenden Werte unter Ausblendung innerer Klassen enthalten.
Folgende Ergebnisse sind hervorzuheben:
  • Die größte Zahl der Zyklen entfällt auf die Kategorie Tiny.
  • Die symmetrischen Formen Circle, Chain, Clique und Star sind tendentiell seltener. Zudem tendieren sie dazu, kleiner zu sein.
  • Mehr als zwei Drittel der Zyklen entstehen durch die Beteiligung innerer Klassen.
  • Die meisten in Zyklen involvierten Klassen gehören der Multi-hub-Kategorie an, nämlich 34549 (class) bzw. 19884 (top level class). Mit weitem Abstand folgen dann bereits Star (6952 bzw. 485), Tiny (4752 bzw. 1430) und Circle (2190 bzw. 617).
  • Zyklen der Multi-hub-Kategorie sind im Durchschnitt auch die größten Zyklen.
Für Pakete fehlen in der Studie leider die Größenmaße der Zyklen. Die Autoren unterscheiden weak package tangles und strong package tangles. Dabei sind weak package tangles ("schwache Paketzyklen") einfach diejenigen Zyklen, die sich unmittelbar aus dem Abhängigkeitsgraphen der Pakete ergeben. Strong package tangles ("starke Paketzyklen") werden hingegen auf der Grundlage der Klassenzyklen gebildet, so dass immer dann (und nur dann), wenn ein Klassenzyklus zwischen Klassen verschiedener Packages existiert, auch ein Paketzyklus zwischen diesen Paketen angenommen wird.
Diese Ergebnisse bestätigen im Wesentlichen die Klassensicht:
  • Zyklen der Kategorien Tiny und Multi-hub kommen am häufigsten vor.
  • Die Art und Weise der Zyklenermittlung auf Paketebene (schwach oder stark) macht insbesondere für die Kategorien Tiny- und Multi-hub-Zyklen einen signifikanten Unterschied.
    • Für die Kategorie Tiny werden fast zwei Mal mehr starke Zyklen gefunden als schwache.
    • Für die Kategorie Multi-hub werden umgekehrt ca. 40% mehr schwache Zyklen gefunden als starke.
  • Von den verbleibenden Kategorien bildet Circle die stärkste. Die anderen Kategorien treten nur sporadisch auf.

Sterne sind vermutlich beabsichtigt

In der Arbeit "Anatomie zyklischer Abhängigkeiten in Softwaresystemen" [Savernik2007] wird versucht, eine Einteilung von Zyklen in die Kategorien "harmlos", "beabsichtigt" und "verbesserungswürdig" vorzunehmen. 

Zwar erfolgt die Differenzierung verschiedener Zyklen-Formen in dieser Arbeit noch nicht so präzise wie in [Dietrich2014], es werden jedoch bereits Star-Zyklen ("Sterne") gesondert betrachtet. Savernik stellt in seiner empirischen Untersuchung (die insgesamt 14 Software-Systeme umfasst) fest, dass Sterne am häufigsten aus genau drei Klassen bestehen, findet aber auch Sterne mit bis zu 15 Klassen vor. [Dietrich2014] präzisiert dieses Bild, indem hier die Sterne eine Durchschnittsgröße von 7,5 Klassen aufweisen und im Maximum 97 Klassen umfassen.

Savernik ordnet Sterne nun in die Kategorie "beabsichtigt" ein, da "das Zustandekommen eines Sterns nicht als Zufall zu werten" sei. Diese Argumentation ähnelt der folgenden Sichtweise: 
"Symmetrische Topologien sind hochgradig reguläre Formen, die sehr wahrscheinlich nicht als komplex wahrgenommen werden, selbst wenn sie groß sind." [Dietrich2014]
Während [Dietrich2014] allerdings lediglich die Auswirkung der Symmetrie auf die Verständlichkeit betrachtet, unterstellt Savernik eine Entwurfsabsicht. Dies dürfte zwar nicht in allen Fällen zutreffen, es kann aber auch nicht abgestritten werden, dass ein rein zufälliges oder unabsichtliches Zustandekommen eher unwahrscheinlich ist. Beiden Argumenten ist gemein, dass der negative Effekt stark symmetrischer Formen potentiell geringer ist als der unregelmäßiger Formen.

Schlussfolgerungen

Zyklen der Kategorie Tiny sind klein und überschaubar. Die hier geschilderten Probleme der gesteigerten Infizierbarkeit und Schwergewichtigkeit treten daher für diese Zyklen entweder gar nicht oder stark abgemildert auf. Die bloße Zahl der Zyklen eines Systems ist daher noch wenig aussagekräftig hinsichtlich der Auswirkung auf dessen Qualitätseigenschaften.

Ein weiteres überraschendes Ergebnis der Studie ist die Vielzahl der Zyklen, die sich erst durch Berücksichtigung innerer Klassen ergibt. Diese Zyklen könnten sich analog zu Tiny-Zyklen als weniger problematisch erweisen, da die wechselseitige Kommunikation innerer und äußerer Klassen meist gut begründet ist und nicht mit größerer Infizierbarkeit oder Schwergewichtigkeit anderer Systemteile einhergeht.

Als die eigentlich problematische Zyklus-Kategorie erweisen sich Multi-hub-Zyklen. Diese treten häufig auf und sind meist deutlich größer als andere Zyklus-Formen. Zudem erschwert ihre irreguläre, asymmetrische Form potentiell das Verständnis der gebildeten Strukturen. Auch legt die Multi-hub-Struktur nahe, dass das Ausmaß der innerzyklischen Abhängigkeiten stärker als bspw. für Circle- und Chain-Zyklen ist, so dass auch das Ausmaß eventueller Restrukturierungs-Maßnahmen potentiell größer ist.

Quellen

[Dietrich2014] - On The Shape of Circular Dependencies in Java Programs, Al-Mutawa H., Dietrich J., Marsland S., McCartin, C., Proceedings ASWEC'14, Preprint (2014)

[Savernik2007] - Anatomie zyklischer Abhängigkeiten in Softwaresystemen, Savernik, Leo (2007)