Die IEC 62304 verlangt in Kapitel 5.5.3, Akzeptanzkriterien für Software-Einheiten festzulegen und deren Einhaltung zu prüfen. Eine Möglichkeit, solche Akzeptanzkriterien zu bestimmen, sind Software-Metriken. Eine meiner Lieblingsmetriken ist die zyklomatische Komplexität auch McCabe Maß genannt. Die zyklomatische Komplexität pro Komponente bzw. Methode bestimmt, sagt Ihnen genau, wo Ihre Hotspots sind, an denen ein Refactoring angesagt ist.
Bestimmung der zyklomatischen Komplexität
Diese Metrik gibt an, wie viele linear unabhängige Pfade es durch einen Programmgraf gibt. Einen Pfad definiert man dann als linear unabhängig, wenn er mindestens eine neue Kante enthält.
In diesem Beispiel gibt es vier linear unabhängige Pfade
- 2,7
- 1,4,6,9,10
- 1,4,6,9,8,9,10
- 1,3,5,9,10
Dabei geben die Zahlen die Kanten an, die jeweils durchlaufen werden.
Zielwerte für die zyklomatische Komplexität
In diesem Beispiel gibt es also vier unabhängige Pfade. Das wären eine niedrige Komplexität und damit eine niedrige Wahrscheinlichkeit eines Fehlers. Man unterscheidet oft folgende Bereiche:
- 1-10: Nicht komplex, geringes Fehlerrisiko
- 11-20: Mittlere Komplexität, moderates Fehlerrisiko
- 21-50: Hohe Komplexität, hone Wahrscheinlichkeit eines Fehlers
- > 50: Untestbares System, sehr hohe Wahrscheinlichkeit eines Fehlers
Werkzeugunterstützung
Natürlich würden Sie diese Metrik nicht von Hand sondern mit einem Werkzeug bestimmen. Zu diesen Werkzeugen zählen
- Eclipse for Java
- Visual Studio
- FXCop
- uvm.
Weitere Informationen
Die zyklomatische Komplexität ist nur eine von vielen Metriken. Aber alleine deren Aussage genügt mir, um über die Güte einer Softwareentwicklung Bescheid zu wissen. Wenn dieses Metrik nicht bestimmt wird, ist das übrigens auch eine Aussage.
Wie Sie Ihre Software-Einheiten schnell und normenkonform entwickeln und verifizieren, erfahren Sie übrigens im Kompaktseminar „medizinische Software“.
Hallo Herr Johner,
es gibt noch den weiteren Pfad 1 3 5 9 8 9 10!
Hallo Herr Johner,
ich frage mich, ob die zyklomatische Komplexität noch diese Aussagekraft besitzt um die Komplexität von Software zu messen. Die zyklomatische Komplexität basiert auf einem Kontrollfluss, der explizt durch Iterationsanweisungen und bedingte Anweisungen gesteuert wird. Dies Art zu Programmieren ist meiner Ansicht nach aber typisch für die strukturierte Programmierung, der zunehmende an Bedeutung verliert.
Schaue ich mir aber den statischen (Templates in C++) oder dynamischen (Objektorientierung) Polymorphismus an, so wird hier der Kontrollfluss implizit gesteuert. So steuert beim statischen Polymorphismus in C++ Patternmaching den Kontrollfluss, so steuert beim dynamischen Polymorphismus das Überschreiben einer Methode den Kontrollfluss des Programmes.
Es kann daher durchaus vorkommen, dass eine Funktion eine niedrige zyklomatische Komplexität besitzt, tatsächlich aber hochkomplex ist, da die sehr viele Entscheidungen erst zu Compilezeit oder Laufzeit des Programmes implizit aufgelöst werden.
Lieber Herr Grimm,
herzlichen Dank für diesen sehr wichtigen Gedanken!
Ich stimme Ihnen zu, und sehe auch keinen wirklichen Dissens.
Über die absolute Bedeutung der Metrik lässt sich sicher immer streiten. Für mich ist sie eine, vielleicht die aussagekräftigste, um die kritischen Stellen zu identifizieren. Denn dort, wo es „stinkt“, finden sich meist noch anderen „Sünden“.
Nochmals besten Dank für Ihre wichtige Ergänzung!
Viele Grüße
Christian Johner