Chidamber und Kemerer (CK) haben 1991 einen Satz von Maßen zur Beurteilung objektorientierter Entwürfe vorgeschlagen. In [CK94] werden diese Maße ausführlich beschrieben und anhand empirischer Daten diskutiert. Die Daten entstammen zwei großen industriellen Klassensammlungen (eine in C++ und eine in Smalltalk) von zwei verschiedenen Firmen und umfassen hunderte von Klassen.
Basili, Briand und Melo (BBM) haben 1995 die gleichen Maße im Hinblick auf ihre Eignung zur Vorhersage der Fehleranfälligkeit von Klassenimplementationen validiert. Datenquelle hier waren 8 Implementationen eines Softwaresystems für eine hypothetische Videothek, die von Studenten in einem Praktikum über 4 Monate entwickelt wurden. Die Systeme wurden dabei mit OMT modelliert und mit C++ und verschiedenen Bibliotheken implementiert.
Die Analyse zur Validation bestimmte die Signifikanz , mit der jedes
Maß zur Vorhersage verwendet werden kann, ob mindestens ein Fehler in
der Testphase gefunden werden wird oder nicht (binäre Antwort). Diese
Vorhersage wird mit einem logistischen Regressionsmodell gemacht, das
die Form
BBM unterschieden drei Teilsysteme ihrer Anwendung: GUI (graphische Benutzerschnittstelle), TUI (textuelle Benutzerschnittstelle) und DB (Datenbankoperationen). Ferner wurde bei Klassen, die auf Basis einer existierenden Klasse der Bibliothek entwickelt wurden, zwischen unverändert, leicht verändert (bis 25% Änderung) und stark verändert unterschieden.
Alle folgenden Maße werden auf jeweils eine Klasse angewendet.
,,Weighted Methods per Class``: WMC = wobei ci die Komplexität der Methode i ist, die aufgrund irgendeines beliebigen Komplexitätsmaßes berechnet werden kann. Sowohl bei CK als auch bei BBM wird hierfür immer die Konstante 1 eingesetzt.
Bedeutungen und Beobachtungen laut CK:
BBM fanden eine Signifikanz von , was auf eine mäßige Brauchbarkeit von WMC zur Vorhersage von Fehlern hindeutet, 0.7% der Varianz des Fehlerauftretens können mittels WMC erklärt werden; hoher WMC bedeutet höhere Wahrscheinlichkeit eines Fehlers. Für bestimmte Klassenarten waren die Ergebnisse besser: Bei neuen und stark veränderten Klassen ist die Signifikanz 0.0003 und 2.4% der Varianz werden erklärt. Bei GUI- und TUI-Klassen ist die Signifikanz 0.001 und 4.7% der Varianz werden erklärt.
,,Depth of Inheritance Tree``: DIT = Länge des längsten Pfades von der Klasse zur Wurzel ihres Vererbungsbaums. Bei Einfachvererbung gibt es nur einen Pfad, bei Klassen ohne Oberklasse ist das Ergebnis 0.
Bedeutungen laut CK:
BBM fanden mit einer Signifikanz von , daß hohe DIT Fehler vorhersagt, DIT erklärt 6.5% der Varianz. Dieses Ergebnis bedeutet, daß zumindest im Hinblick auf Fehler, kopflastige Entwürfe klar besser sind -- jedenfalls im Experiment von BBM.
,,Number of Children``: NOC = Zahl direkter Unterklassen der Klasse.
Bedeutungen laut CK:
BBM fanden mit Signifikanz von , daß Klassen mit hoher NOC eine geringere(!) Fehlerwahrscheinlichkeit aufweisen, wobei 14% der Varianz erklärt werden. Sie erklären das damit, daß die meisten Klassen höchstens eine Unterklasse haben und eine hohe Zahl von Unterklassen bei unverändert wiederverwendeten Klassen auftritt. Allerdings ist die Signifikanz für nur neue oder geändert wiederverwendete Klassen immer noch 0.0011, so daß diese Erklärung nicht recht überzeugt. Vielleicht ist der relevante Effekt der, daß eine Klasse, von der weitere Klassen abgeleitet werden, sorgfältiger entworfen und implementiert und besser verstanden wird. Inwieweit dieser Effekt auf andere Projekte und Teams zu übertragen ist, läßt sich nicht sagen.
,,Coupling Between Object Classes``: CBO = Anzahl von anderen Klassen, aus denen Methoden dieser Klasse Methoden oder Instanzvariablen verwenden.
Bedeutungen laut CK:
BBM fanden eine Signifikanz von für hohe Fehlerwahrscheinlichkeit bei hoher CBO, welche im logistischen Regressionsmodell 6.8% der Varianz erklären kann.
,,Response for a Class``: RFC = Gesamtanzahl verschiedener Methoden, die von irgendeiner Methode der Klasse direkt aufgerufen werden.
Bedeutungen laut CK:
BBM fanden eine Signifikanz von für hohe Fehlerwahrscheinlichkeit bei hoher RFC, die 6.5% der Varianz erklärt. Die Vorhersageeignung war am höchsten für die neuen oder stark geänderten Klassen (25% der Varianz erklärt) und für die UI-Klassen (36% der Varianz erklärt).
,,Lack of Cohesion in Methods``: LCOM = max (|N| - |S|, 0), wobei N die Menge von Methodenpaaren ist, bei der die zwei Methoden eines Paares keine Instanzvariable gemeinsam benutzen (no sharing) und S die Menge von Methodenpaaren mit gemeinsamer Nutzung von mindestens einer Instanzvariablen (sharing). Eine solche gemeinsame Benutzung erzeugt einen Zusammenhang zwischen zwei Methoden. Das Maß gibt also an, wieviel mehr unzusammenhängende Paare von Methoden es gibt als zusammenhängende, wobei ein Überwiegen von zusammenhängenden abgeschnitten wird (also negative Werte nicht zugelassen sind, sondern auf Null abgebildet werden).
Bedeutungen laut CK:
BBM fanden für keine ihrer Teilmengen, daß LCOM signifikant die Vorhersage von Fehlern erlaubt. Sie führen das darauf zurück, daß das künstliche Abschneiden negativer Werte die meisten ihrer Klassen mit dem Wert 0 versieht und deshalb Klassen mit sehr unterschiedlich gutem Zusammenhang gleich bewertet werden. Diese künstliche Modifikation erscheint in diesem Licht also als glatter Entwurfsfehler bei der Definition des Maßes.
Es handelt sich bei den vorgelegten Maßen um insgesamt durchaus nützliche Grundlagen für Vorhersagesysteme, wobei die Nützlichkeit und Aussagekraft zwischen den einzelnen Maßen doch erheblich schwankt.
Bemerkenswert ist die unterschiedliche Sichtweise der beiden angeführten Arbeiten: CK benutzen den Satz von Maßen als Ideenlieferant für die Bewertung von Entwürfen. Zu jedem Maß gibt es mehrere Überlegungen zu möglichen Bedeutungen gewisser Meßwerte, wobei sich diese Überlegungen zum Teil sogar widersprechen. Die Betrachtung des Histogramms der Meßwertverteilung wird als Mittel zur qualitativen Beurteilung gewisser Entwurfseigenschaften von Klassenmengen angesehen. Der ganze Ansatz dokumentiert eine Einstellung der Art ,,wir haben da so einen Satz netter Maße, jetzt laßt uns doch mal schauen, was man damit vielleicht anfangen kann``. Zwar treffen CK mehrere Aussagen der Art ,,mit dem Maß XY läßt sich dieses oder jenes beurteilen``, aber nachgewiesen sind diese Behauptungen noch nicht, es handelt sich lediglich um Vermutungen.
Demgegenüber haben BBM ein klares Ziel: Sie wollen vorhersagen, welche Klassen voraussichtlich Fehler haben werden. Mit einer solchen Vorhersage kann man den Entwicklungsprozeß so steuern, daß kritische Klassen besonders sorgfältig implementiert und getestet werden, um die Qualität der Software insgesamt zu optimieren. Mit diesem klaren Ziel können BBM eine erheblich strukturiertere Vorgehensweise in der empirischen Untersuchung verwenden, die tatsächlich den Namen Validierung im oben eingeführten Sinne verdient. Sie haben eine Hypothese, die klar genug ist, um mit statistischen Methoden getestet werden zu können, nämlich daß ein Maß die Vorhersage von Fehlern besser erlaubt als eine optimale Zufallsentscheidung. Durch die Erklärung der Varianz kann die Nützlichkeit jedes Maßes zur Vorhersage bei Zutreffen der Hypothese auch quantitativ beschrieben werden.
Bei BBM ergibt sich als klare Aussage, daß RFC, DIT und eventuell auch NOC brauchbare Hinweisgeber auf fehleranfällige Klassen darstellen und das LCOM anders definiert werden sollte. Bei CK bleiben hingegen die Erkenntnisse vage und allgemein. Dies verdeutlicht, wie wichtig ein erkenntnisorientiertes Vorgehen bei der Validierung von Maßen ist. Optimal wäre es, den zielorientierten Ansatz von BBM mit den industriellen Daten von CK auszuführen. Solche Vorhaben scheitern leider meistens daran, daß im industriellen Kontext nicht alle benötigten Daten (hier: wo sind denn nun Fehler aufgetreten?) mit der nötigen Gleichförmigkeit gesammelt werden.