Definition „McCabe-Metrik“ Was ist zyklomatische Komplexität?

Autor / Redakteur: Gedeon Rauch / Stephan Augsten

Die zyklomatische Komplexität, nach ihrem Vordenker auch McCabe-Metrik genannt, soll dabei helfen, Software-Module begreifbar zu halten. Die Messgröße zollt damit dem Umstand Tribut, dass Quellcode vom Menschen geschrieben und von diesen gewartet wird.

Firmen zum Thema

Die McCabe-Metrik bemisst anhand der Knotenpunkte und Kanten im Kontrollflussgraphen die Komplexität eines Software-Moduls.
Die McCabe-Metrik bemisst anhand der Knotenpunkte und Kanten im Kontrollflussgraphen die Komplexität eines Software-Moduls.
(Bild: geralt / Pixabay )

Komplexität bedeutet für Software nicht zwangsläufig Qualität, denn gerade einfache Software ist einfacher zu warten und weniger fehleranfällig. In der faktischen Messung der Komplexität kann mit der McCabe-Metrik, auch zyklomatische Komplexität, eine vergleichbare Messgröße zu Rate gezogen werden, die den Quellcode auf seine Komplexität hin untersucht.

Als quantifizierbarer Wert wird hierfür die Anzahl linear unabhängiger Pfade genutzt. Die zyklomatische Komplexität lässt sich zudem durch ein Knotendiagramm visualisieren, wobei jeder Knoten eine unteilbare Gruppe von Befehlen repräsentiert. Diese Visualisierung dient nicht nur als Indikator dafür, wie komplex eine Software ist, sondern auch an welchen Programmstellen sich die Komplexität bündelt.

Als Metrik kann die zyklomatische Komplexität nicht nur auf Programmebene angewandt werden. sie lässt sich auch auf Klassen, Funktionen, Methoden und Module herunterbrechen.

Die McCabe-Metrik verstehen

Eingeführt von Thomas J. McCabe hilft die zyklomatische Komplexität dabei, übermäßige Komplexität zu vermeiden. Angewendet wird die Metrik in der Regel auf einen bestimmten Abschnitt des Quellcodes.

Die zyklomatische Komplexität wird in der Regel als Anzahl der Kanten abzüglich der Anzahl der Knoten +1 angegeben. Ein Knoten ist hierbei ein Logic-Branch-Punkt, eine Kante die Verbindung zwischen den Knoten. Es kann auch gemessen werden als Anzahl von Branches in verzweigenden Anweisungen (IF, WHILE, DO) oder als Anzahl von CASE-Anweisungen innerhalb eines SWITCH.

Ein Abschnitt ohne Entscheidungspunkte und Bedingungen (Kontrollflussanweisungen) gilt als linear unabhängiger Pfad mit der niedrigstmöglichen Komplexität von 1. Ohne Kontrollflussanweisungen gibt es lediglich einen einzigen Weg durch den Pfad. Eine einfache Kontrollflussanweisung wie eine IF-Bedingung öffnet zwei verschiedene Pfade über TRUE und FALSE und erhöht die Komplexität des Quellcode-Abschnitts somit auf 2.

Zyklomatische Komplexität in der Praxis – anhand des Basis-Pfadtests

Mit einem Basis-Pfadtest können Sie über eine Ermittlung der Anzahl von Testfällen feststellen, wie viele linear unabhängige Pfade es in einer Software gibt. Für jeden linear unabhängigen Pfad wird in dieser Methode ein Testfall erstellt, was sämtliche Verzweigungen innerhalb einer Software abdeckt, ohne alle Pfade des Kontrollflussdiagramms abdecken zu müssen.

Der Vorteil hierin liegt in der einfacheren Ermittlung der Kanten den Kontrollflussdiagramms bei gleichzeitiger Zeit- und Ressourcenersparnis. Weil für jeden linear unabhängigen Pfad ein Testfall erstellt wird, entspricht die zyklomatische Komplexität hier der Anzahl der Testfälle.

Zyklomatische Komplexität in der Praxis

Die Zahl linear unabhängiger Pfade widergespiegelt als zyklomatische Zahl ist ein Wert, der 1 nicht unterschreiten kann, da jedes noch so einfache Programm mindestens einen linear unabhängigen Pfad benötigt.

In der Praxis gibt es viele Tools, die Entwicklerinnen und Entwickler bei der Messung der zyklomatischen Komplexität helfen und die die McCabe-Metrik zu jeder Entwicklungsphase für einen bestimmten Code-Abschnitt anzeigen können. Zu den wichtigsten Tools zählen beispielsweise Visual Studio, FXCop oder Eclipse for Java.

Grundsätzlich gilt, dass Developer mit niedrigerer Komplexität eine geringere Fehlerwahrscheinlichkeit schaffen können. Konkret lassen sich die zyklomatischen Zahlen wie folgt einordnen:

1 bis 10: wenig komplexe Software mit geringem Fehlerrisiko

11 bis 20: mittelmäßig komplexe Software mit bescheidenem Fehlerrisiko

21 bis 50: hohe Komplexität bei hoher (und steigender) Wahrscheinlichkeit eines Fehlers

51 und mehr: zu hohe Komplexität in einem untestbaren System mot sehr hohem Fehlerrisiko

Warum zyklomatische Komplexität eine relevante Messgröße ist

Die McCabe-Metrik dient unter anderem als Richtwert dafür, welche Module oder Methoden innerhalb einer Software weiter vereinfacht werden können. Ebenso liefert sie Hinweise darauf, wenn die Komplexität einer Software vom Development-Team kaum noch überblickt werden kann.

Wird die zyklomatische Komplexität ermittelt, so lässt sich das Programm so wenig komplex wie möglich halten und dadurch für Erweiterungen öffnen und die Zahl potentieller Fehler reduzieren. Die Ermittlung der zyklomatischen Komplexität spiegelt sich also direkt in geringeren Wartungskosten wider und lohnt alleine deshalb den wirtschaftlichen und zeitlichen Aufwand.

Eine kritische Auseinandersetzung mit der zyklomatischen Komplexität ist vor allem in Bezug auf McCabes eigene Forderung zur maximalen Komplexität von Teilprogrammen angebracht. Diese solle laut McCabe einen Wert von 10 nicht überschreiten, was aus mehreren Gründen strittig ist. Während beispielsweise verzweigende Anweisungen die Komplexität erhöhen, gilt gleiches nicht für sonstige Anweisungen (wie bspw. Ausgaben).

In diesem Fall würde die McCabe-Metrik aufgrund ihrer eigenen Beschränkungen eher den Testaufwand als die tatsächliche Komplexität messen. Die zyklomatische Zahl bedarf somit der Interpretation der Developer, um die tatsächliche Komplexität adäquat abschätzen zu können.

(ID:47596180)