Métrique : Cyclomatic Complexity

Description de l’utilisateur

La métrique Cyclomatic Complexity est utilisée pour mesurer la complexité d'un programme en comptabilisant le nombre de chemins linéairement indépendants dans le code source.

Calcul de mesure

La métrique Cyclomatic Complexity est calculée à l'aide du graphique de contrôle de déroulement du programme. Cette mesure de complexité dépend des points de condition et de décision inclus dans ce graphique.

Par exemple :

oAucun point de condition ou de décision : complexité = 1 (un seul chemin à travers le code).

oUne instruction IF : complexité = 2 (deux chemins à travers le code).

oUne instruction IF avec deux conditions : complexité = 3 (trois chemins à travers le code).

o

En fonction de l'outil d'analyse utilisé, il existe plusieurs interprétations/implémentations de la métrique Cyclomatic Complexity. Certains outils ne tiennent pas compte des expressions AND/OR/... dans les instructions IF, REPEAT, WHILE, etc. La métrique McCabe Cyclomatic Complexity est toujours incrémentée de 1. D'autres outils prennent également en compte les expressions du flux de code (hors instruction IF, REPEAT, etc.) mais utilisées ultérieurement dans une instruction IF ou REPEAT, ce qui produit un résultat Cyclomatic Complexity plus élevé. L'implémentation de la métrique Cyclomatic Complexity pour le code IEC-61131-3 dans EcoStruxure Machine Expert tient compte des expressions contenant AND/OR/..., mais pas des expressions précalculées dans le flux du code ou indiquées à un appel de méthode.

Exemple

Exemple de calcul de la métrique Cyclomatic Complexity pour du code IEC-61131-3 :

// 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

Résultat de la métrique Cyclomatic Complexity

Cyclomatic Complexity (MCC) = 12