Qualité de code – Complexité Cyclomatique

Il est bon de chercher à améliorer la qualité de son code. Surtout lorsque l’on en écrit beaucoup et lorsque l’on travail en équipe. C’est également un avantage pour des projets personnels. Cela permet d’avoir des systèmes plus fiables et surtout cela permet d’adopter de bons réflexes.
Les avantages sont nombreux : amélioration de la maintenabilité, de la testabilité …
La complexité cyclomatique correspond au nombre déroulement différents qu’il est possible d’emprunter dans une méthode ou une fonction. Le résultat augmente proportionnellement au nombre de points de décision (if, case, while …).
Lorsque la complexité cyclomatique est élevée, la fonction devient difficile à tester. Le risque d’ajouter des erreurs au programme est plus grand.
C’est un outil simple et très utile. Il est un bon indicateur pour améliorer la qualité de codage.

La qualité de code est liée à la Complexité Cyclomatique.

Complexité
cyclomatique
Risque sur la fiabilitéRisque d'injection de bug
lors d'une modification
1 - 10Fonction simple
Risque faible
5%
11 - 20Fonction intermédiaire
Risque modéré
20%
21 - 50Fonction complexe
Risque élevé
40%
> 51Fonction intestable
Risque très élevé.
60%

Dans l’idéal, pour obtenir une couverture de test à 100%, le nombre de tests unitaires devrait être égale à la complexité cyclomatique de la fonction testée.
Néanmoins, il est bon de prendre pour habitude de maintenir une complexité cyclomatique la plus faible possible lorsque cela est possible. Même pour des programmes avec des objectifs de tests inexistant.

Il existe de nombreux outils pour calculer la complexité cyclomatique. Parmi les gratuits j’utilise Lizard qui me donne entière satisfaction.

Installation de Lizard

Lizard est en codé en Python et va fonctionner avec beaucoup de systèmes d’exploitations différents. Mais vous devez avoir Python installé sur votre machine. Il permet d’analyser beaucoup de langages comme par exemple : C/C++, Java, C#, JavaScript, Objective-C, Swift, Python, Ruby, PHP …

Installation de Python

  • Windows : Télécharger et installer Python.
    N’oubliez pas d’ajouter le chemin des exécutables Python à la variable d’environnement PATH.
  • Linux : Installez Python à l’aide du gestionnaire de package de votre distribution.
    Sur Debian :
sudo apt-get install python3
  • MacOS : Installez Python à l’aide du gestionnaire de packet brew.
brew install python

Mise à jour de pip

python -m pip install -U pip

Installation de Lizard

python -m pip install lizard

Utilisation

Par défaut, Lizard analyse tout les fichier source avec un langage connu. Il est possible de sélectionner uniquement un langage avec l’option « -l ».

L’outil renvoi les paramètres suivants après analyse :
– nloc : Nombre de ligne de code
– CCN : complexité cyclomatique
– Compteur d’occurrence des fonctions
– Compteur de paramètres des fonctions

Pour analyser les fichiers sources dans le répertoire actuel :

python -m lizard

Il est possible de paramétrer la limite acceptable du nombre de complexité cyclomatique avec l’option « -C » (par défaut la limite est fixée à 15)

python -m lizard -C 50

Pour exclure un répertoire de l’analyse :

python -m lizard -x"./exclude/*"

Intégration dans MPLAB

Pour exécuter l’analyse du code avec Lizard dans MPLAB. Il faut ajouter la commande d’exécution de Lizard dans les propriétés du projet MPLAB comme indiqué :

MPLAB project configuration pour l'outil Lizard

Dans cet exemple, les fichiers présent dans le répertoire « mcc_generated_files » ne sont pas analysés.

Ainsi, lors de la compilation, la console de MPLAB affiche les résultats de l’analyse de Lizard. Il est à noter que la compilation échoue si une limite est dépassée.

MPLAB résultat d'analyse de l'outil Lizard

Intégration dans PlatformIO

PlatformIO s’intègre dans Visual Studio Code et permet d’utiliser cet IDE moderne pour programmer des microcontrôleurs (Arduino, STM32, ESP …).
PlatformIO utilise un environnement Python virtuel propre à lui même. Il faut donc installer le module lizard dans l’environnement Python virtuel.

Installation de lizard

A l’aide d’un terminal, aller dans le répertoire « C:\Users\<username>\.platformio\penv\Scripts » (Windows) ou le répertoire « /Users/<username>/.platformio/penv » (Linux et MacOS).

Procéder à la mise à jour de pip et l’installation de lizard :

python -m pip install -U pip
python -m pip install lizard

Intégration de lizard dans un projet

Pour exécuter une commande avant compilation, il faut créer un script personnalisé python (voir documentation PlatformIO).

Création du script python

Créer un fichier python dans votre projet. ex: « extra_script.py ».

# Import global construction environment and isolated construction environment
Import("env")
# import module
import os

print("Code analysing ...")
os.system("python -m lizard")

Ajouter la ligne suivante dans le fichier de configuration du projet :

extra_script = pre:extra_script.py

Exemple de fichier « platformio.ini » :

Exemple de fichier platformio.ini

Ainsi, lors de la compilation, le terminal de VSCode affiche les résultats de l’analyse de Lizard.

PlatformIO résultat d'analyse de l'outil Lizard

Conclusion

L’analyse de qualité de code avec un calcul de la Complexité Cyclomatique est un bon début. L’outils « Lizard » en Python est facilement intégrable dans beaucoup d’environnements de développement. Mais c’est seulement un indicateur. D’autres outils et bonnes pratiques sont également nécessaires pour améliorer la qualité de codage (convention de code, test unitaire, documentation …)