2014-06-12 4 views
7

Je trouve le paragraphe suivant en ce qui concerne la complexité cyclomatique on Wikipedia:complexité cyclomatique = 1 + déclarations #if?

On peut montrer que la complexité cyclomatique de tout programme structuré avec un seul point d'entrée et un point de sortie est égal au nombre de points de décision (c.-à- "si" des déclarations ou des boucles conditionnelles) contenues dans ce programme plus un.

Cela impliquerait une complexité cyclomatique de 3 pour deux imbriqué arbitraires si des déclarations:

if (a) 
{ 
    if (b) 
    { 
     foo(); 
    } 
    else 
    { 
     bar(); 
    } 
} 
else 
{ 
    baz(); 
} 

Depuis exactement l'une des trois fonctions va être appelé, mon tube digestif est d'accord avec 3.

Cependant, deux déclarations arbitraires si peut également être écrit en séquence au lieu de les nicher:

if (a) 
{ 
    foo(); 
} 
else 
{ 
    bar(); 
} 

if (b) 
{ 
    baz(); 
} 
else 
{ 
    qux(); 
} 

Maintenant, il y a quatre chemins à travers le code:

  • foo, baz
  • foo, qux
  • bar, baz
  • bar, qux

Si pas la complexité cyclomatique de cette fragment donc être 4 au lieu de 3? Suis-je en train de mal comprendre le paragraphe cité?

+0

Cet exemple exact est discuté dans l'article que vous avez lié: http://en.wikipedia.org/wiki/Complexity_Cyclomatic#Implications_for_software_testing –

Répondre

7

La complexité cyclomatique est définie comme le nombre de chemins linéairement indépendants à travers le code.

Dans votre deuxième exemple, nous avons les chemins suivants qui fonctionne ...

| # | A | B | Nodes hit | 
| 1 | true | true | foo() baz() | 
| 2 | true | false | foo() qux() | 
| 3 | false | true | bar() baz() | 
| 4 | false | false | bar() qux() | 

Vous êtes tout à fait exact que le nombre de chemins d'exécution ici est 4. Et pourtant, la complexité cyclomatique est 3.

La clé est de comprendre quelles sont les mesures de complexité cyclomatiques:

Définition:

Un chemin linéairement indépendant est un chemin passant par le programme qui introduit au moins un nouveau tronçon qui n'est pas inclus dans les autres chemins linéairement indépendants .

de http://www.ironiacorp.com/

Le 4ème chemin n'est pas linéairement indépendant des trois premiers chemins, car il ne présente pas de nouvelles déclarations noeuds/programme qui ne sont pas inclus dans les trois premiers chemins. Comme mentionné sur the wikipedia article, la complexité cyclomatique est toujours inférieure ou égale au nombre de chemins de flux de contrôle uniques théoriques, et est toujours supérieure ou égale au nombre minimum de chemins d'exécution réellement réalisables.

(pour vérifier la deuxième instruction, imaginez si b == a était toujours vrai lors de la saisie du bloc de code que vous avez décrit).

+0

Merci pour votre réponse! Il semble que j'étais simplement induit en erreur en pensant que la complexité cyclomatique == nombre de chemins à travers le code. – fredoverflow

+0

Et si vous avez le chemin vrai-vrai et faux-faux, cela ferait deux et vous auriez visité tous les 4 nœuds? Qu'est-ce que je rate? –

+0

@fredoverflow pouvez-vous répondre s'il vous plaît? –

0

Je suis d'accord avec l'explication du perfectionniste. Voici une explication plus informelle dans le cas du langage Java:

La complexité cyclomatique de McCabe (McCC) pour une méthode est exprimée comme le nombre de chemins de flux de contrôle indépendants dans celle-ci. Il représente une limite inférieure pour le nombre de chemins d'exécution possibles dans le code source et, en même temps, il constitue une limite supérieure pour le nombre minimum de cas de test requis pour obtenir une couverture de test de branche complète. La valeur de la métrique est calculée comme le nombre d'instructions suivantes plus 1: si, pour, foreach, while, do-while, étiquette de cas (qui appartient à une instruction de commutation), catch, instruction conditionnelle (? :). De plus, les expressions logiques "et" (& &) et logique "ou" (||) ajoutent également 1 à la valeur car leur évaluation de court-circuit peut provoquer une dérivation en fonction du premier opérande. Les instructions suivantes ne sont pas incluses: else, switch, label par défaut (qui appartient à une instruction switch), try, enfin.

Questions connexes