McCabe-Metrik
Die McCabe-Metrik (auch zyklomatische Komplexität – cyclomatic complexity) ist eine Software-Metrik, mit der die Komplexität eines Software-Moduls gemessen werden kann. Die zyklomatische Komplexität wurde 1976 durch Thomas J. McCabe eingeführt.
Hinter der Software-Metrik von McCabe steckt der Gedanke, dass ab einer bestimmten Komplexität das Modul für den Menschen nicht mehr begreifbar ist. Er definiert seine cyclomatic complexity auf dem Kontrollflussgraphen eines Moduls. Einfach ausgedrückt ist das Komplexitätsmaß nach McCabe gleich der Anzahl der binären Verzweigungen plus 1.
Die so ermittelte McCabe-Zahl ist ein Maß für die Komplexität des Kontrollflusses eines Programms (Funktion, Prozedur oder Stück Code). Betrachtet man den Kontrollflussgraphen, wobei die Anweisungen als Knoten und der Kontrollfluss zwischen den Anweisungen als Kanten dargestellt sind, dann ist die McCabe-Zahl M definiert als 
- e: Anzahl Kanten im Graphen
- n: Anzahl Knoten im Graphen
- p: Anzahl der einzelnen Kontrollflussgraphen (ein Graph pro Funktion/Prozedur)
Bei Betrachtung eines einzelnen Kontrollflussgraphen (also p=1) gilt
mit
- b: Anzahl Binärverzweigungen, also bedingte Anweisungen mit genau zwei Zweigen, z. B.
IF-Anweisungen.
M ist eine untere Schranke für die Anzahl der möglichen Wege durch ein Programm.
M ist außerdem eine obere Schranke für die Anzahl der Testfälle, die nötig sind, um eine vollständige Kantenabdeckung des Kontrollflussgraphen zu erreichen.
Laut McCabe sollte die zyklomatische Zahl eines in sich abgeschlossenen Teilprogramms nicht höher als 10 sein, da sonst das Programm zu komplex und zu schwer zu testen ist. Diese Regel ist allerdings umstritten, da sich die zyklomatische Zahl nur dann erhöht, wenn verzweigende Anweisungen wie IF eingefügt werden, aber nicht beim Einfügen sonstiger Anweisungen (zum Beispiel einer Bildschirmausgabe). Es kann also lediglich eine Aussage über den Testaufwand (Anzahl der zu testenden unabhängigen Programmpfade) getroffen werden.
Kritik [Bearbeiten]
Komplexitätsmaße sind für Menschen mitunter nicht intuitiv zu erfassen, insbesondere switch-Anweisungen werden häufig als weniger komplex angesehen, als ihre Komplexitätszahl vermuten lässt. So kann im folgenden Beispiel von Unübersichtlichkeit für Menschen keine Rede sein, jedoch erreicht sie mit einer Komplexitätszahl von 8 einen recht hohen Wert.
const String wochentagsName(const int nummer) { switch(nummer) { case 1: return "Montag"; case 2: return "Dienstag"; case 3: return "Mittwoch"; case 4: return "Donnerstag"; case 5: return "Freitag"; case 6: return "Samstag"; case 7: return "Sonntag"; } return "(unbekannter Wochentag)"; }
In der Praxis wird die switch-Konstruktion häufig für Nachschlageaufgaben dieser Art eingesetzt. Die Methode umfasst acht Kontrollflusspfade, hat entsprechend eine hohe Komplexitätszahl von 8 und ist trotzdem vom Menschen leicht zu überblicken. Dennoch birgt es Gefahren, nämlich die Möglichkeit in einzelne Case-Anweisungen Seiteneffekte einzubauen. Zurecht hat die folgende Umstrukturierung eine niedrigere Komplexität, weil man keine Nebenwirkung für einzelne Wochentage einbauen kann:
const String wochentagsName(const int nummer) { string[] tage = new string[] {"Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag"}; if ((nummer > 0) && (nummer < 8)) { return tage[nummer-1]; } return "(unbekannter Wochentag)"; }
Literatur [Bearbeiten]
- T. J. McCabe: A Complexity Measure. in: IEEE Transactions on Software Engineering, Band SE-2, 308-320. 1976.
- Helmut Balzert: Lehrbuch der Software-Technik; Software-Management, Software-Qualitätssicherung, Unternehmensmodellierung, Seiten 481-482.
Weblinks [Bearbeiten]
- A Complexity Measure – Thomas J. McCabe, 1976 (PDF-Datei; 1,68 MB)
- Berechnung der McCabe-Metrik (Beispielprojekt) – (PDF-Datei; 0,74 MB)
- Messung von McCabe-Metriken