Qu'est-ce que la complexité cyclomatique?
un terme que je vois de temps en temps est"complexité cyclomatique". Ici donc j'ai vu quelques Questions sur "comment calculer le CC de la langue X" ou "comment faire Y avec le montant minimum de CC", mais je ne suis pas sûr de comprendre vraiment ce que c'est.
sur le site NDepend , j'ai vu une explication qui dit essentiellement " le nombre de décisions dans une méthode. Chaque if, for, &&, etc. ajoute +1 au "score"CC). Est-ce vraiment elle? Si oui, pourquoi ce mauvais? Je peux voir que l'on pourrait vouloir garder le nombre de si-déclarations assez faible pour garder le code facile à comprendre, mais est-ce vraiment tout à elle?
ou y a-t-il un concept plus profond?
14 réponses
Je ne suis pas conscient d'un concept plus profond. Je crois qu'il est généralement considéré dans le contexte d'un indice de maintenabilité. Plus il y a de branches à l'intérieur d'une méthode particulière, plus il est difficile de maintenir un modèle mental du fonctionnement de cette méthode (généralement).
Les méthodesavec une complexité cyclomatique plus élevée sont également plus difficiles à obtenir une couverture complète du code dans les essais unitaires. (Merci Mark W !)
That apporte tous les autres aspects de la maintenabilité, bien sûr. Probabilité d'erreurs/régressions / etc. Le concept de base est assez simple, cependant.
la complexité cyclomatique mesure le nombre de fois où vous devez exécuter un bloc de code avec des paramètres variables afin d'exécuter chaque chemin à travers ce bloc. Un nombre plus élevé est mauvais parce qu'il augmente les chances pour les erreurs logiques échapper à votre stratégie de test.
Wikipedia peut être votre ami sur celui-ci: définition de la complexité cyclomatique
en gros, vous devez imaginer votre programme comme un graphique et puis
la complexité est (...) défini comme:
M = E − N + 2P
où
- m = complexité cyclomatique,
- E = le nombre de bords du graphique
- N = Le nombre de noeuds du graphe
- P = le nombre de composants connectés
CC est un concept qui tente de capturer la complexité de votre programme et comment il est difficile de le tester dans un seul nombre entier.
Cyclocmatic complexity = Number of decision points + 1
les points de décision peuvent être vos énoncés conditionnels comme si, SI ... AUTREMENT, basculer, pour boucle, pendant que boucle etc.
le tableau suivant décrit le type de demande.
-
la complexité cyclomatique se situe entre 1 et 10 pour être considéré comme Normal application
151990920" -
la complexité cyclomatique réside 11 – 20 application modérée
-
la complexité cyclomatique réside 21 – 50 application risquée
-
la complexité cyclomatique est supérieure à 50."
un autre point intéressant que j'ai entendu:
les endroits dans votre code avec les plus grands tirets devraient avoir le CC le plus élevé. Il s'agit généralement des domaines les plus importants pour assurer la couverture des tests, car on s'attend à ce qu'ils soient plus difficiles à lire et à maintenir. Comme l'indiquent d'autres réponses, il s'agit également des régions du code les plus difficiles à couvrir.
C'est tout, l'idée est qu'une méthode qui a un CC bas a moins de fourches, boucle etc qui tous rendent une méthode plus complexe. Imaginez examiner 500.000 lignes de code, avec un analyseur et de voir un couple de méthodes qui ont oder de magnitude supérieure CC. Cela vous permet ensuite de vous concentrer sur le remaniement de ces méthodes pour une meilleure compréhension (Il est également commun qu'un CC élevé a un taux de bug élevé)
complexité cyclomatique est vraiment juste un mot à la mode effrayant. En fait, il s'agit d'une mesure de la complexité du code utilisé dans le développement de logiciels pour mettre en évidence les parties plus complexes du code (plus susceptibles d'être buggy, et doit donc être très soigneusement et minutieusement testé). Vous pouvez le calculer en utilisant la Formule E-N+2P, mais je vous suggérerais de le faire calculer automatiquement par un plugin. J'ai entendu parler d'une règle empirique que vous devriez vous efforcer de garder le CC ci-dessous 5 pour maintenir une bonne lisibilité et maintenabilité de votre code.
je viens juste d'expérimenter avec le Eclipse Metrics Plugin sur mes projets Java, et il a un fichier D'aide vraiment agréable et concis qui sera bien sûr intégrer avec votre aide régulière Eclipse et vous pouvez lire plus de définitions de diverses mesures de complexité et des trucs et astuces pour améliorer votre code.
la complexité cyclomatique est calculée en utilisant le graphique d'écoulement de contrôle. Le nombre de mesure quantitative de chemins linéairement indépendants à travers le code source d'un programme est appelé complexité cyclomatique ( if/ if else / for / while )
chaque point de décision d'une routine (boucle, interrupteur, if, etc...) se résume essentiellement à une instruction if équivalent. Pour chaque if
vous avez 2 codepaths qui peuvent être prises. Donc avec la 1ère branche il y a 2 chemins de code, avec la seconde il y a 4 chemins possibles, avec la 3ème il y en a 8 et ainsi de suite. Il y a au moins 2**n chemins de code où N est le nombre de branches.
cela rend difficile de comprendre le comportement du code et de le tester quand N pousse au-delà d'un petit nombre.
complexité Cyclomatrique est essentiellement une métrique pour comprendre les zones de code qui a besoin de plus d'atténuation pour la maintenabilité. Ce serait essentiellement une entrée dans le remaniement. Il donne certainement une indication de la zone d'amélioration du code en termes d'éviter boucle imbriquée profonde, les conditions, etc.
c'est un peu ça. Toutefois, chaque branche d'un énoncé "case" ou "switch" a tendance à compter pour 1. En effet, cela signifie CC hates case statements, et tout code qui les Nécessite (processeurs de commande, machines d'état, etc).
les réponses fournies jusqu'à présent ne mentionnent pas la corrélation entre la qualité du logiciel et la complexité cyclomatique. La recherche a montré que le fait d'avoir une métrique de complexité cyclomatique plus faible devrait aider à développer des logiciels de meilleure qualité. Il peut aider avec les attributs de qualité de logiciel de lisibilité, maintenabilité, et la portabilité. En général on devrait tenter d'obtenir une métrique de complexité cyclomatique entre 5-10.
L'une des raisons d'utiliser des mesures comme la complexité cyclomatique est qu'en général un être humain ne peut garder la trace d'environ 7 (plus ou moins 2) pièces d'information simultanément dans votre cerveau. Par conséquent, si votre logiciel est trop complexe avec des chemins de décision multiples, il est peu probable que vous serez en mesure de visualiser comment votre logiciel se comportera (c.-à-d. il aura une métrique de haute complexité cyclomatique). Cela conduirait très probablement au développement de logiciels erronés ou saturés de bogues. Plus d'informations à ce sujet peuvent être trouvées ici et aussi sur Wikipedia .
considérez le graphique de flux de contrôle de votre fonction, avec un bord supplémentaire allant de la sortie à l'entrée. La complexité cyclomatique est le nombre maximal de coupures, nous pouvons faire sans séparer le graphique en deux morceaux.
par exemple:
function F:
if condition1:
...
else:
...
if condition2:
...
else:
...
vous pouvez probablement intuitivement voir pourquoi liés graphique a une complexité cyclomatique de 3.