Montag, 30. Juni 2014

Zyklische Abhängigkeiten - Einführung

Dieser Artikel ist Teil der folgenden Serie über zyklische Abhängigkeiten. Zahlreiche Grundbegriffe, Konzepte und empirische Befunde wurden im Rahmen dieser Serie detailliert dargestellt. Der vorliegende Artikel gibt eine Einführung und erste Übersicht in die Thematik.

Die Serie

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

Zyklen zwischen Software-Elementen sind ein vielschichtiges Phänomen, das von Entwicklern wahlweise verharmlost oder verteufelt wird. Prominente Autoren wie David Parnas, Robert C. Martin oder John Lakos haben versucht, die Zyklenfreiheit absolut einzufordern. Diesem Anspruch steht eine Praxis gegenüber, in der Zyklen weit verbreitet sind, ohne dass in allen Fällen klar ist, ob sie in Zusammenhang mit akuten Problemen stehen.

Erst in neueren Forschungen entwickelt sich ein differenzierteres Bild, das die Diskrepanz zwischen Anspruch und Wirklichkeit allmählich aufdeckt. Diese Differenzierung findet auf verschiedenen Ebenen statt:
  • Es muss unterschieden werden, welche konkreten Entitäten einen Zyklus bilden. Allgemein scheinen Zyklen zwischen Typen (Klassen, Interfaces, Traits, Enums, ...) weniger problematisch zu sein als Zyklen zwischen Namespace-artigen Gruppierungen von Typen (Java-Packages, C++-Namespaces, ...). Als problematischste Zyklus-Form werden Zyklen zwischen physischen Einheiten angesehen.
  • Es existieren erste Ansätze, domänenbedingte (sog. intrinsische) Zyklen von überflüssigen Zyklen werkzeugbasiert zu unterscheiden. Diese Unterscheidungsmöglichkeit zielt auf die Einschränkung eines häufigen Rechtfertigungsmusters ab, das die vorgefundenen Software-Zyklen mit Zyklen in der jeweiligen Domäne begründet.
  • Es werden erwünschte von unerwünschten Zyklen unterschieden. Hierzu existieren verschiedene Ansätze:
    • Es werden (weitgehend) messbare Eigenschaften von Zyklen vorgeschlagen, die es besser erlauben, die Erwünschtheit von Zyklen mit statischen Analysewerkzeugen einschätzen zu können. Beispiele für derartige Eigenschaften sind Distanzen zwischen den Elementen von Zyklen oder verschiedene Zyklus-Topologien.
    • Zyklen werden im Kontext anderer Strukturen betrachtet. Beispielsweise können Zyklen auf Typ-Ebene im Kontext von Namespaces oder physischen Einheiten betrachtet werden. Zyklen auf Namespace-Ebene können in den Kontext der Namespace-Hierarchie gesetzt werden usw.
  • Zyklen können sich zudem hinsichtlich der Stärke ihres Zusammenhalts unterscheiden. Je mehr Einzelabhängigkeiten aus einem Zyklus entfernt werden müssen, um den Zyklus zu beseitigen, desto stärker ist der Zusammenhalt, desto mehr Aufwand würde bei einem eventuell erforderlichen Refactoring entstehen.
In den folgenden Artikeln werde ich versuchen, dieses differenzierte Bild zyklischer Abhängigkeiten nachzuzeichnen.