Quelques remarques à ce sujet que j'écris paresseusement ...
Plus précisément, pour l'équation de Wikipedia de M = E - N + 2P
Cette équation est très fausse .
Pour une raison quelconque, McCabe l'utilise en effet dans son article original ("A Complexity Measure", IEEE Transactions on Software Engineering, Vo .. SE-2, n ° 4, décembre 1976), mais sans le justifier et après avoir cité la bonne formule sur la première page, qui est
v (G) = e - v + p
(Ici, les éléments de formule ont été renommés)
Plus précisément, McCabe fait référence au livre C.Berge, Graphs and Hypergraphs (abrégé ci-dessous pour G&HG). Directement à partir de ce livre :
Définition (page 27 en bas de G&HG):
Le nombre cyclomatique v (G) d'un graphe G (non orienté) (qui peut avoir plusieurs composantes déconnectées) est défini comme:
v (G) = e - v + p
où e = nombre d'arêtes, v = nombre de sommets, p = nombre de composants connectés
Théorème (page 29 en haut de G&HG) (non utilisé par McCabe):
Le nombre cyclomatique v (G) d'un graphe G est égal au nombre maximum de cycles indépendants
Un cycle est une séquence de sommets commençant et se terminant au même sommet, chacun des deux sommets consécutifs de la séquence étant adjacents l'un à l'autre dans le graphique.
Intuitivement, un ensemble de cycles est indépendant si aucun des cycles ne peut être construit à partir des autres en superposant les marches.
Théorème (page 29 au milieu de G&HG) (tel qu'utilisé par McCabe):
Dans un graphe G fortement connecté, le nombre cyclomatique est égal au nombre maximum de circuits linéairement indépendants.
Un circuit est un cycle sans répétition de sommets et d'arêtes autorisée.
Un graphe orienté est dit fortement connecté si chaque sommet est accessible à partir de chaque autre sommet en passant par les bords dans leur direction désignée.
Notez qu'ici nous sommes passés de graphes non orientés à des graphes fortement connectés (qui sont dirigés ... Berge ne le rend pas tout à fait clair)
McCabe applique maintenant le théorème ci-dessus pour dériver un moyen simple de calculer un «nombre de complexité cyclomatique McCabe» (CCN) ainsi:
Étant donné un graphique dirigé représentant la «topologie de saut» d'une procédure (le graphique de flux d'instructions), avec un sommet désigné représentant le point d'entrée unique et un sommet désigné représentant le point de sortie unique (le sommet du point de sortie peut devoir être «construit» en l'ajoutant en cas de retours multiples), créez un graphe fortement connecté en ajoutant une arête dirigée du sommet du point de sortie au sommet du point d'entrée, rendant ainsi le sommet du point d'entrée accessible à partir de tout autre sommet.
McCabe postule maintenant (je dirais plutôt confus) que le nombre cyclomatique du graphe d'instructions modifié "est conforme à notre notion intuitive de" nombre minimum de chemins "", et nous utiliserons donc ce nombre comme mesure de complexité.
Cool, donc:
Le nombre de complexité cyclomatique du graphe de flux d'instructions modifié peut être déterminé en comptant les "plus petits" circuits dans le graphe non orienté. Ce n'est pas particulièrement difficile à faire par l'homme ou la machine, mais l'application du théorème ci-dessus nous permet de le déterminer encore plus facilement:
v (G) = e - v + p
si l'on ne tient pas compte de la directionnalité des bords.
Dans tous les cas, nous considérons une seule procédure, il n'y a donc qu'un seul composant connecté dans tout le graphe, et donc:
v (G) = e - v + 1.
Dans le cas où l'on considère le graphe d'origine sans le bord "sortie-entrée" ajouté , on obtient simplement:
ṽ (G) = ẽ - v + 2
comme ẽ = e - 1
Illustrons en utilisant l'exemple de McCabe tiré de son article:
Ici nous avons:
- e = 10
- v = 6
- p = 1 (un composant)
- v (G) = 5 (nous comptons clairement 5 cycles)
La formule du nombre cyclomatique dit:
v (G) = e - v + p
ce qui donne 5 = 10 - 6 + 1 et donc correct!
Le "nombre de complexité cyclomatique McCabe" tel qu'il est donné dans son article est
5 = 9 - 6 + 2 (aucune autre explication n'est donnée dans le document sur la façon dont)
qui se trouve être correct (il donne v (G)) mais pour les mauvaises raisons, c'est à dire que nous utilisons:
ṽ (G) = ẽ - v + 2
et donc ṽ (G) = v (G) ... ouf!
Mais cette mesure est-elle bonne?
En deux mots: pas très
- Il n'est pas entièrement clair comment établir le "graphe de flux d'instructions" d'une procédure, en particulier si la gestion des exceptions et la récursivité entrent dans l'image. Notez que McCabe a appliqué son idée au code écrit en FORTRAN 66 , un langage sans récursivité, sans exception et une structure d'exécution simple.
- Le fait qu'une procédure avec décision et une procédure avec boucle produisent le même CCN n'est pas bon signe.