Dienstag, 15. April 2014

Stabilität - Kritik der Instability-Metrik

Die im Blogartikel Stabilität - eine Metrik-Definition eingeführte Instability-Metrik hat den Vorteil, auf zwei sehr einfach verständlichen und ermittelbaren Größen zu beruhen. Mit dieser Einfachheit gehen aber auch eine Reihe von Nachteilen einher, die in den folgenden Abschnitten behandelt werden sollen:
  • Die Bezeichnung Instability ist auf irreführende Weise verallgemeinernd.
  • Die Art der Abhängigkeit bleibt unberücksichtigt.
  • Es findet keine Gewichtung der abhängigen Klassen statt.
  • Der Stand der empirischen Fundierung ist dürftig.

"Instability" ist irreführend

In den vorhergehenden Blogartikeln (eins, zwei und drei) wurde ausführlich dargelegt, wie der Stabilitäts-Begriff zu verstehen ist und wie Martin davon die Instability-Metrik abgeleitet hat. Bei dieser Ableitung ist ein so großer Anteil des ursprünglichen Stabilitäts-Begriffes verlorengegangen, dass es irreführend erscheint, die Metrik pauschal als Instability zu bezeichnen, suggeriert dies doch, dass die Metrik eine allgemeine Stabilitäts-Aussage macht, obwohl sie nur sehr ausgewählte strukturelle Aspekte betrachtet. Die folgende Grafik veranschaulicht das:


Martin selbst bezeichnet die Metrik in [MartinStability1996] als "positional stability", was sich am ehesten als "strukturelle Stabilität" übersetzen ließe. Ob die strukturelle Stabilität, wie hier dargestellt, im Mittel ein Viertel oder einen anderen Anteil an der Gesamtstabilität ausmacht, dürfte schwer zu bestimmen sein. Intuitiv scheinen jedoch die anderen Stabilitäts-Aspekte bedeutender zu sein. In jedem Fall wäre es hilfreich, im Sprachgebrauch immer klar zu machen, ob man sich auf Stabilität als Gesamtphänomen oder lediglich auf die strukturelle Stabilität bezieht. Martin selbst tendiert dazu, diese Bedeutungen zu vermischen.

Die Art der Abhängigkeit

Bei der Ermittlung der Instability-Metrik werden eingehende und ausgehende Abhängigkeiten pauschal gezählt, ohne die Art der Abhängigkeit zu berücksichtigen. Deklarationen, Methodenaufrufe, Feldzugriffe, Instantiierungen, Vererbungsbeziehungen usw. werden alle gleichwertig behandelt. Es wird auch nicht berücksichtigt, ob ein Zugriff über eine Abstraktion (z. B. einen Interface-Typ) erfolgt oder über eine konkrete Realisierung. Martin schreibt:
"In C++, these dependencies are typically represented by #include statements." [MartinStability1996]
Das bloße #include sagt freilich nichts über die eigentliche Art und Stärke der Abhängigkeit aus. In der Realität wird jedoch sowohl der Änderungswiderstand als auch der Änderungsdruck davon abhängen, welcher Art die konkrete Abhängigkeit ist. Dies sauber in eine Metrik zu überführen, wäre freilich weder konzeptionell noch in den umsetzenden Analysewerkzeugen trivial. Führt man sich vor Augen, dass Martin seine Metrik zunächst noch auf Basis von bash-Skripten realisiert hat, wird deutlich, dass er zum damaligen Zeitpunkt weit von einer solchen Differenzierung entfernt war. Es ist allerdings erstaunlich, dass sich die Metrik bis heute nicht in dieser Richtung weiterentwickelt hat.

Keine Gewichtung

Stellen wir uns z. B. eine Klasse vor, die umfangreich auf die Felder einer anderen Klasse zugreift. Dieser gravierende Verstoß gegen das Geheimnisprinzip geht ebenso nur als eine einzige Abhängigkeit in die Metrik ein wie der Aufruf einer einzigen Methode, die sinnvollerweise die Arbeit auf diesen Feldern verrichten sollte (um das Geheimnisprinzip zu wahren und die Abhängigkeit zu reduzieren). Offensichtlich wäre jedoch die Abhängigkeit im ersten Fall mit deutlich höhren Änderungsaufwänden verbunden, der Änderungswiderstand müsste also eigentlich größer sein. Die Metrik erfasst diesen Unterschied nicht.

Es wären verschiedene Gewichtungen vorstellbar:
  • Größe der Klassen
  • Anzahl der tatsächlichen Zugriffe auf die Klasse
  • im Falle von Methodenaufrufen: die Komplexität dieser Methoden
  • usw.

Schwache empirische Unterstützung

Die akademische Fachwelt ist in Bezug auf Martin's Prinzipien und Metriken allgemein zurückhaltend. Auch zu den Package-Prinzipien findet man nur wenige Fachartikel, die eine empirische Überprüfung anstreben. 

Eine solche Studie wird in "An Empirical Study of Software Packaging Stability" [Champaign2003] präsentiert. Dort wurde die Änderungshistorie zweier großer Open Source-Systeme (Linux und Eclipse) daraufhin untersucht, ob die Instability-Metrik eine gute Prognosekraft für die tatsächlich vorgefundene Änderungshäufigkeit (dort als Volatilität bezeichnet) aufweist. Die Ergebnisse sind hier negativ, d. h. Instability und Volatilität korrelieren in keiner erkennbaren Weise.

Einen anderen Ansatz verfolgte die Studie "A Validation of Martin's Metric" [Leppänen2009]. Dort sind fünf Open Source-Systeme hinsichtlich der Package-Metriken (darunter Instability) untersucht worden. Die Ergebnisse können hier allenfalls schwach als Bestätigung der Aussagekraft der Instability interpretiert werden, sind aber auch nicht als Falsifikation zu werten. Details zu dieser Untersuchung werde ich in einem späteren Blogartikel zum Stable Abstractions Prinzip behandeln. 

An dieser Stelle ist festzuhalten, dass die empirische Unterstützung von Matrin's Metriken als schwach zu bewerten ist.

Quellen

[Champaign2003] - An Empirical Study of Software Packaging Stability, Champaign, John C. (2003), http://web.mit.edu/~jchampai/www/MastersThesis.pdf 
[Leppänen2009] - A Validation of Martin's Metric, Sami Hyrynsalmi and Ville Leppänen,  Proceedings of 11th Symposium on Programming Languages and Software Tools and 7th Nordic Workshop on Model Driven Software Engineering, pages 87-101 (2009), http://tucs.fi/publications/attachment.php?fname=inpHyLe09a.full.pdf
[MartinStability1996] - Stability, Robert C. Martin (1996), http://www.objectmentor.com/resources/articles/stability.pdf