gwift-book/source/part-1-workspace/maintainable-applications/mccabe.adoc

2.7 KiB
Raw Blame History

Complexité de McCabe

La complexité cyclomatique (ou complexité de McCabe) peut sapparenter à mesure de difficulté de compréhension du code, en fonction du nombre dembranchements trouvés dans une même section. Quand le cycle dexécution du code rencontre une condition, il peut soit rentrer dedans, soit passer directement à la suite.

Par exemple:

if True == False:
    pass # never happens

# continue ...

TODO: faut vraiment reprendre un cas un peu plus lisible. Là, cest naze.

La condition existe, mais nous ne passerons jamais dedans. A linverse, le code suivant aura une complexité moisie à cause du nombre de conditions imbriquées:

def compare(a, b, c, d, e):
    if a == b:
        if b == c:
            if c == d:
                if d == e:
                    print('Yeah!')
                    return 1

Potentiellement, les tests unitaires qui seront nécessaires à couvrir tous les cas de figure seront au nombre de cinq:

  1. le cas par défaut (a est différent de b, rien ne se passe),

  2. le cas où a est égal à b, mais où b est différent de c

  3. le cas où a est égal à b, b est égal à c, mais c est différent de d

  4. le cas où a est égal à b, b est égal à c, c est égal à d, mais d est différent de e

  5. le cas où a est égal à b, b est égal à c, c est égal à d et d est égal à e

La complexité cyclomatique dun bloc est évaluée sur base du nombre dembranchements possibles; par défaut, sa valeur est de 1. Si nous rencontrons une condition, elle passera à 2, etc.

Pour lexemple ci-dessous, nous allons devoir vérifier au moins chacun des cas pour nous assurer que la couverture est complète. Nous devrions donc trouver:

  1. Un test où rien de se passe (a != b)

  2. Un test pour entrer dans la condition a == b

  3. Un test pour entrer dans la condition b == c

  4. Un test pour entrer dans la condition c == d

  5. Un test pour entrer dans la condition d == e

Nous avons donc bien besoin de minimum cinq tests pour couvrir lentièreté des cas présentés.

Le nombre de tests unitaires nécessaires à la couverture dun bloc fonctionnel est au minimum égal à la complexité cyclomatique de ce bloc. Une possibilité pour améliorer la maintenance du code est de faire baisser ce nombre, et de le conserver sous un certain seuil. Certains recommandent de le garder sous une complexité de 10; dautres de 5.

Note
A noter que refactoriser un bloc pour en extraire une méthode naméliorera pas la complexité cyclomatique globale de lapplication. Mais nous visons ici une amélioration locale.