Die Serie
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.