Retour aux articles
  • 21.10.2021

Qu’est ce que la complexité cyclomatique ?

Qu’est ce que la complexité cyclomatique ?

Pour améliorer la qualité du code et des logiciels, nous devons mesurer différents aspects :

  • Taille
  • Complexité
  • La maintenabilité du logiciel, entre autres.

Le choix des bonnes métriques peut faire la différence entre le succès et l'échec d'un projet.

 

 

Complexité

Le terme complexité désigne l'état d'événements ou de choses qui présentent de nombreuses liaisons interconnectées et des structures excessivement compliquées.

La complexité peut être interprétée de différentes manières :

  • La complexité de la question (également appelée complexité informatique) mesure la complexité de la question de base.
  • La complexité algorithmique reflète la complexité du calcul exécuté pour éclairer la question.
  • La complexité auxiliaire mesure la structure du programme utilisé pour actualiser le calcul.

Complexité cyclomatique

Elle se compose essentiellement d'instructions. Elle est calculée en créant un organigramme de contrôle du code qui estime le nombre de chemins ou de voies linéairement indépendantes à travers un module de programme et elle mesure le nombre d'autoroutes rectilignes à travers un programme.

Il a été développé par McCabe en 1976. Si la complexité cyclomatique d'un programme est plus faible, le risque qu'il soit soumis à des modifications à l'avenir est moindre et il est également plus facile à comprendre.

La complexité cyclomatique est une métrique importante des logiciels. Elle fait référence au nombre de chemins d'exécution possibles dans un morceau de code donné, par exemple une fonction. Plus on utilise de structures de décision, plus il y a de branches possibles pour votre code.

La complexité cyclomatique est particulièrement importante lorsqu'il s'agit de tester. En calculant la complexité cyclomatique d'une fonction, par exemple, on connaît le nombre minimum de cas de test dont on aura besoin pour obtenir une couverture complète des branches de cette fonction. On peut donc dire que la complexité cyclomatique peut être un indicateur de la difficulté à tester un morceau de code donné.

Quels sont les avantages de la mesure de la complexité cyclomatique ?

  • Elle peut être utilisée comme une mesure de qualité, elle donne la complexité relative de diverses conceptions.
  • Elle est capable de calculer plus rapidement que la métrique d'Halstead.
  • Elle est utilisée pour mesurer l'effort minimum et les meilleurs domaines de concentration pour les tests.
  • Elle est capable de guider le processus de test.
  • Elle est facile à appliquer.

Quels sont les inconvénients de la mesure de la complexité cyclomatique ?

  • La mesure de la complexité de contrôle des programmes et non de la complexité des données.
  • Les structures conditionnelles imbriquées sont plus difficiles à comprendre que les structures non imbriquées.
  • Dans le cas de comparaisons et de structures de décision simples, elle peut donner un chiffre trompeur.

Comment réduire la complexité cyclomatique ?

Préférer des fonctions plus petites

Les petites fonctions sont plus faciles à lire et à comprendre. Elles sont également moins susceptibles de contenir des bogues en raison de leur longueur. Dans le cas où il n’y a pas beaucoup de code, on n’a pas beaucoup d'opportunités de code bogué. Le même raisonnement s'applique à la complexité cyclomatique : on est moins susceptible d'avoir un code complexe si on a moins de période de code. Le conseil est donc de préférer les petites fonctions.

Comment procéder ?

Pour chaque fonction, il faut identifier sa responsabilité principale. Extraire ce qui reste vers leurs propres fonctions et modules. Cela facilite également la réutilisation du code.

Éviter les arguments de type drapeau dans les fonctions

Les arguments drapeau sont des paramètres booléens qu’on ajoute à une fonction. On les utilise généralement lorsqu'on a besoin de modifier le fonctionnement d'une fonction tout en préservant l'ancien comportement.

Comment faire ?

Que peut-on utiliser à la place des paramètres booléens ? On peut utiliser des stratégies qui permettent d'obtenir le même résultat sans être trop complexes. Par exemple, on peut créer une nouvelle fonction, en conservant l'ancienne telle quelle et en extrayant les parties communes dans sa propre fonction privée.

Si le paramètre de drapeau est utilisé pour renforcer ou améliorer le comportement de la fonction d'origine d'une manière ou d'une autre, on peut tirer parti du modèle de décorateur pour atteindre le même objectif.

Réduire le nombre de structures de décision

Si les structures de décision - en particulier les cas if-else et switch - sont à l'origine d'un plus grand nombre de branches dans le code, il va de soi qu’on devrait les réduire si on veut garder la complexité cyclomatique à distance.

Comment faire ?

Certaines des tactiques que nous venons de voir peuvent contribuer à réduire le nombre d'instructions if dans le code. Par exemple, au lieu d'utiliser des arguments de drapeaux et d'utiliser ensuite une instruction if pour vérifier, on peut utiliser le modèle de décorateur. Au lieu d'utiliser un switch case pour passer en revue plusieurs possibilités et décider de celle que le code va exécuter, on peut exploiter le pattern strategy. Bien sûr, à un moment donné dans le code, on aura toujours besoin d'un switch case. Après tout, quelqu'un doit décider de l'implémentation réelle à utiliser. Cependant, ce point devient le seul point du code qui nécessite cette structure de décision.