Mesure de métriques McCabe avec Testwell CMT++ et CMTJava (Outils de mesure de complexité)
But et origine
La complexité "Cyclomatic" (également référée comme complexité de programme ou complexité de McCabe) est le membre le plus largement répandu des métriques statiques. Il peut être considéré comme une large mesure de solidité et de confiance pour un programme.
La complexité "Cyclomatic" a été introduit par Thomas McCabe en 1976. Elle mesure le nombre de chemins linéaires-indépendants dans un module de programme.
La complexité McCabe est l'un des métriques de software les plus largement acceptées, elle est conçu pour être indépendante du langage et du format de langage.
Interprétation des métriques McCabe
Le nombre Cyclomatic de McCabe v(G) montre la complexité du flux de la commande par un morceau de code.
v(G) est le nombre de branches conditionnelles dans l'organigramme. v(G) = 1 pour un programme consistant en seulement des états séquentiels.
Pour une fonction seule; v(G) est un moins le nombre de points de branchements conditionnels dans la fonction.
Plus le nombre cyclomatic est grand, plus il y aura de chemins d'exécution dans la fonction, et plus elle sera difficile à comprendre. À noter que le nombre cyclomatic est insensible à la complexité des structures de données, flux de données et interface de module.
Lorsque le test est concerné, le nombre cyclomatic v(G) est l'une des plus importantes mesures de complexité.
Du fait que le nombre cyclomatic décrive la complexité du flux de contrôle, il est évident que les modules et les fonctions ayant un nombre cyclomatic élevé auront besoin de plus de cas de tests que les modules ayant un nombre cyclomatic plus bas. Comme principe de base, chaque fonction devrait avoir un nombre de cas de tests au moins égal au nombre cyclomatic.
Le nombre cyclomatic d'une fonction devrait être inférieur à 15. Si une fonction a un nombre cyclomatic de 15, il y a au moins 15 (mais probablement plus) chemins d'exécution dans son contenu.
Plus de 15 chemins sont difficiles à identifier et tester. Les fonctions contenant un état de sélection avec beaucoup de branches constituent une exception.
Un nombre Cyclomatic limite raisonnable maximum d'un fichier est de 100.
Comment les métriques McCabe sont calculés avec CMT++
Le nombre cyclomatic McCabe v(G) est calculé à partir des définitions de fonctions (ou membres) et des déclarations de classes/structures. Il est calculé sur le fichier source en entier.
Chaque "if-statement" introduit une nouvelle branche au programme et, par conséquent, incrémente v(G).
L'itération contruite, tel une boucle for ou while, introduit alors les branches. Chaque "switch-statement" du commutateur-rapport, incrémente v(G).
Une branche de cas n'augmente pas la valeur de v(G), car il ne doit pas augmenter le nombre de branches dans le flux de commande. S'il y a deux ou plus de cas... : morceaux qui n'ont pas de code entre eux, la mesure McCabe est augmenté uniquement une fois pour l'ensemble des cas ...: les morceaux.
Chaque morceau (...) attrapé dans un bloc d'essai ("try-block") incrémente v(G)
Construction exprl ? expr2 : expr3 incrémente v(G) .
Il faut noter que v(G) est insensible aux branches inconditionnelles comme goto-, return-, et les "break-statements" bien qu'ils augmentent sûrement la complexité.
Dans CMT++ les branches générées par les directives de compilation conditionnelles sont alors comptées à v(G). Même si les directives de compilation conditionnelles n'ajoutent pas des branches au flux de commandes du programme exécutable, ils augmentent la complexité du fichier programme que l'utilisateur voit et édite.
En résumé, les constructions de langage suivants incrémentent le nombre cyclomatic : if (...), for (...), while (...), case ...:, catch (...), &&, ||, ?, #if, #ifdef, #ifndef, #elif.
Testwell CMT++ et CMTJava montrent les métriques logicielles suivantes :
- Métriques des lignes de code (LOC)
- Métriques d´Halstead
- Nombre cyclomatique de McCabe v(G)
- Index de maintenabilité (Maintainability Index)