Donnerstag, 10. April 2014

Stabilität - eine Metrik-Definition

Im vorhergehenden Blogartikel (Stabilität - die Übertragung auf Software-Elemente) wurde dargestellt, dass Martin das Konzept der Stabilität in einem ersten Operationalisierungs-Schritt mit Änderungskosten gleichsetzt. Stabil ist demnach, was sich nur mit hohem Aufwand ändern lässt. Martin verwendet diese eingeschränkte Definition ganz bewusst, um Stabilität in einem zweiten Schritt messbar zu machen. 

Man könnte die bisherige Stabilitäts-Definition als Änderungswiderstand bezeichnen, wobei sich dieser Widerstand auf der Basis der Kosten ergibt, die mit der Änderung verbunden sind.

Diesem Widerstand stellt Martin nun den Änderungsdruck gegenüber, der darauf hinwirkt, dass die Komponente geändert werden muss. Wie sich zeigt, lassen sich beide Kräfte durch ein vereinfachtes metrisches Modell ausdrücken, das ausschließlich die eingehenden und ausgehenden Abhängigkeiten der Komponente abzählt und in Beziehung setzt.

Die Anzahl von Abhängigkeiten

Abhängigkeiten lassen sich zählen. Ein Software-Element verwendet ein anderes Software-Element zählbar häufig, und es wird auch zählbar häufig verwendet.
  • Änderungsdruck: Verwendet ein Software-Element viele andere Software-Elemente, so wird es hierdurch instabiler, da Änderungen in diesen anderen Elementen auch Änderung im betrachteten Element erforderlich machen könnten. Man könnte sagen: Durch die Zahl der Abhängigkeiten wächst der Änderungsdruck auf das Element. Hängt ein Software-Element von keinem anderen Element ab, so nennt Martin diese Eigenschaft "Unabhängigkeit" (engl. "Independence").
  • Änderungswiderstand: Wird ein Software-Element von vielen anderen Software-Elementen verwendet, so wird es hierdurch stabiler, da Änderungen in diesem Element potentiell auch Änderungen in allen von ihm abhängigen Elementen bewirken könnten. Diese hohen Änderungskosten wirken der potentiellen Änderung entgegen und machen sie unwahrscheinlicher. Der Änderungswiderstand des Elements wächst. Martin nennt diese Eigenschaft eines Software-Elements "verantwortungsvoll" (engl. "responsible").
Durch bloßes Zählen der eingehenden und ausgehenden Abhängigkeiten können auf diese Weise Änderungsdruck und Änderungswiderstand eines Software-Elements quantifiziert werden. Dies ist zwar eine sehr eingeschränkte Sichtweise, ermöglicht aber die Formulierung einer simplen Stabilitätsmetrik in Bezug auf Packages:
  • Ca (afferent couplings): Die Anzahl von Klassen außerhalb des Packages, die von Klassen innerhalb des Packages abhängen.
  • Ce (efferent couplings): Die Anzahl von Klassen innerhalb des Packages, die von Klassen außerhalb des Packages abhängen.
  • I (Instability): Ce / (Ca + Ce).
Zunächst ist anzumerken, dass ich an dieser Stelle der Martin'schen Definition als Instability folge, obwohl bislang immer von "Stabilität" die Rede war. Martin hat sich für diese inverse Definition entschieden, und auf diese Weise ist auch immer klar, dass bei der Erwähnung von Instability die Metrik gemeint ist und nicht die allgemeinere Stabilitätsidee.
 
Man kann sich bei Ansicht der Instability-Metrik fragen, warum nicht direkt Ce / Ca gewählt wurde: Die ausgehenden Abhängigkeiten wirken erhöhend, die eingehenden Abhängigkeiten vermindernd auf die Metrik. Dann aber wäre die Metrik nicht auf einen Wert zwischen 0 und 1 "genormt". Andererseits hat auch die von Martin gewählte Form ihre Nachteile. Ist Ce = 0, so macht die Metrik keinen Unterschied mehr, ob eine oder 100 Klassen von dem Package abhängen: Das Package wird in beiden Fällen als maximal stabil (I = 0) gemessen (selbst dann, wenn der Änderungsdruck minimal ist).

Im folgenden Blogartikel werde ich auf einige differenziertere Aspekte der Instability-Metrik eingehen.