Metrik: Cyclomatic Complexity

Benutzerbeschreibung

Die Metrik Cyclomatic Complexity (Zyklomatische Komplexität) dient der Messung der Komplexität eines Programms durch Zählen der Anzahl linear unabhängiger Pfade im Quellcode.

Metrikberechnung

Cyclomatic Complexity wird mithilfe des Steuerungsflussgraphen des Programms verarbeitet. Die Komplexität ist von den Bedingungs- und Entscheidungspunkten im Steuerungsflussgraphen abhängig.

Beispiel:

  • Keine Bedingung oder kein Entscheidungspunkt: Komplexität = 1 (ein Pfad durch den Code).

  • Eine IF-Anweisung: Komplexität = 2 (zwei Pfade durch den Code).

  • Eine IF-Anweisung mit zwei Bedingungen: Komplexität = 3 (drei Pfade durch den Code).

Je nach Analysetool gibt es unterschiedliche Interpretationen/Implementierungen der Cyclomatic Complexity. Einige Tools berücksichtigen keine Ausdrücke mit AND/OR/usw. in IF-, REPEAT-, WHILE-Anweisungen usw. Die McCabe Cyclomatic Complexity wird stets um +1 erhöht. Andere Tools berücksichtigen auch die Ausdrücke im Codefluss (außerhalb einer IF-, REPEAT-Anweisung usw.), die später in einer IF- oder REPEAT-Anweisung verwendet werden, die zu einer höheren Cyclomatic Complexity führt. Die Implementierung der Cyclomatic Complexity in EcoStruxure Machine Expert berücksichtigt Ausdrücke mit AND/OR/usw. Sie berücksichtigt jedoch nicht vorberechnete Ausdrücke im Codefluss oder die in einem Methodenaufruf angegebenen Ausdrücke.

Beispiel

Beispiel für die Berechnung der zyklomatischen Komplexität:

// MCC +1 (Initial Value)

// MCC +0 (Pre calculation of condition not considered)
a := b OR c;

// MCC +0 (Method call with condition not considered in calling implementation)
METH4(a);

IF a AND b OR c XOR d AND NOT e THEN

   // MCC +5 (IF with 5 conditions)

    CASE i OF
       1..4:
           // MCC +1 (CASE range is considered as one condition)

           FOR i := 1 TO 10 DO               // MCC +1

               METH1();
           END_FOR

       10, 11, 12, 13:
           // MCC +1 (multiple CASE labels considered as one condition)

           REPEAT
               // MCC +1 (one condition in REPEAT)

               WHILE (a = TRUE AND b = FALSE) DO
                   // MCC +2 (two conditions in WHILE)

                   METH2();

               END_WHILE

           UNTIL (TRUE) END_REPEAT

        ELSE
            // MCC +0 (Default path through CASE statement)

            METH3();
    END_CASE
END_IF

Ergebnis für die Metrik „Cyclomatic Complexity“

Cyclomatic Complexity (MCC) = 12