Ein Begriff, den ich hin und wieder sehe, ist "Cyclomatic Complexity". Hier auf SO habe ich einige Fragen zu "Wie berechnet man den CC von Sprache X?" Oder "Wie mache ich Y mit der Mindestmenge an CC?" Gesehen, aber ich bin mir nicht sicher, ob ich wirklich verstehe, was es ist.
Auf der NDepend-Website habe ich eine Erklärung gesehen, die im Wesentlichen lautet: "Die Anzahl der Entscheidungen in einer Methode. Jedes Wenn, Für, && usw. erhöht die CC-Punktzahl um +1.) Ist das wirklich so? Wenn ja, warum?" Ich kann sehen, dass man die Anzahl der if-Anweisungen ziemlich niedrig halten möchte, um den Code leicht verständlich zu halten, aber ist das wirklich alles?
Oder gibt es ein tieferes Konzept?
quelle
'The more branches there are within a particular method'
... damit meinen Sie mehr IF-Else-Aussagen?Die zyklomatische Komplexität misst, wie oft Sie einen Codeblock mit unterschiedlichen Parametern ausführen müssen, um jeden Pfad durch diesen Block auszuführen. Eine höhere Anzahl ist schlecht, da dies die Wahrscheinlichkeit erhöht, dass logische Fehler Ihrer Teststrategie entgehen.
quelle
Die Entscheidungspunkte können Ihre bedingten Anweisungen sein, wie z. B. if, if… else, switch, for loop, while loop usw.
Die folgende Tabelle beschreibt den Typ der Anwendung.
Die zyklomatische Komplexität liegt zwischen 1 und 10 Als normale Anwendung zu betrachten
Die zyklomatische Komplexität liegt zwischen 11 und 20 bei mäßiger Anwendung
Zyklomatische Komplexität liegt 21 - 50 Riskante Anwendung
Die zyklomatische Komplexität liegt bei mehr als 50 ° C. Instabile Anwendung
quelle
decision_points+1
brauchen wir nur? (Auf jeden Fall danke für diese extrem einfache Methode!)Wikipedia ist vielleicht Ihr Freund in diesem Punkt : Definition der zyklomatischen Komplexität
Grundsätzlich müssen Sie sich Ihr Programm als Kontrollflussdiagramm vorstellen und dann
CC ist ein Konzept, das versucht zu erfassen, wie komplex Ihr Programm ist und wie schwierig es ist, es in einer einzelnen Ganzzahl zu testen.
quelle
Ja, das ist es wirklich. Je mehr Ausführungspfade Ihr Code einschlagen kann, desto mehr Dinge müssen getestet werden und desto höher ist die Fehlerwahrscheinlichkeit.
quelle
Ein weiterer interessanter Punkt, den ich gehört habe:
Die Stellen in Ihrem Code mit den größten Einrückungen sollten den höchsten CC haben. Dies sind im Allgemeinen die wichtigsten Bereiche, um die Testabdeckung sicherzustellen, da erwartet wird, dass sie schwerer zu lesen / zu warten sind. Wie andere Antworten bemerken, sind dies auch die schwierigeren Codebereiche, um die Abdeckung sicherzustellen.
quelle
Zyklomatische Komplexität ist wirklich nur ein gruseliges Schlagwort. Tatsächlich ist es ein Maß für die Codekomplexität, die in der Softwareentwicklung verwendet wird, um auf komplexere Teile des Codes hinzuweisen (die eher fehlerhaft sind und daher sehr sorgfältig und gründlich getestet werden müssen). Sie können es mit der E-N + 2P-Formel berechnen, aber ich würde vorschlagen, dass Sie dies automatisch von einem Plugin berechnen lassen. Ich habe von einer Faustregel gehört, dass Sie sich bemühen sollten, den CC unter 5 zu halten, um eine gute Lesbarkeit und Wartbarkeit Ihres Codes zu gewährleisten.
Ich habe kürzlich mit dem Eclipse Metrics Plugin in meinen Java-Projekten experimentiert. Es enthält eine sehr schöne und übersichtliche Hilfedatei, die sich natürlich in Ihre reguläre Eclipse-Hilfe integrieren lässt. Sie können weitere Definitionen verschiedener Komplexitätsmaße sowie Tipps und Tricks lesen zur Verbesserung Ihres Codes.
quelle
Die Idee ist, dass eine Methode mit einem niedrigen CC weniger Gabeln, Schleifen usw. hat, was eine Methode komplexer macht. Stellen Sie sich vor, Sie überprüfen 500.000 Codezeilen mit einem Analysegerät und sehen einige Methoden, deren CC um eine Größenordnung höher ist. Auf diese Weise können Sie sich darauf konzentrieren, diese Methoden zum besseren Verständnis umzugestalten (es ist auch üblich, dass ein hoher CC eine hohe Fehlerrate aufweist).
quelle
Jeder Entscheidungspunkt in einer Routine (Schleife, Schalter, if usw.) läuft im Wesentlichen auf ein if-Anweisungsäquivalent hinaus. Für jeden haben
if
Sie 2 Codepfade, die genommen werden können. Mit dem ersten Zweig gibt es also 2 Codepfade, mit dem zweiten gibt es 4 mögliche Pfade, mit dem dritten gibt es 8 und so weiter. Es gibt mindestens 2 ** N Codepfade, wobei N die Anzahl der Zweige ist.Dies macht es schwierig, das Verhalten von Code zu verstehen und zu testen, wenn N über eine kleine Zahl hinaus wächst.
quelle
Die bisher gegebenen Antworten erwähnen nicht die Korrelation der Softwarequalität mit der zyklomatischen Komplexität. Untersuchungen haben gezeigt, dass eine Metrik mit geringerer zyklomatischer Komplexität dazu beitragen sollte, Software von höherer Qualität zu entwickeln. Es kann bei Softwarequalitätsattributen wie Lesbarkeit, Wartbarkeit und Portabilität helfen. Im Allgemeinen sollte versucht werden, eine zyklomatische Komplexitätsmetrik zwischen 5 und 10 zu erhalten.
Einer der Gründe für die Verwendung von Metriken wie zyklomatischer Komplexität ist, dass ein Mensch im Allgemeinen nur etwa 7 (plus oder minus 2) Informationen gleichzeitig in Ihrem Gehirn verfolgen kann. Wenn Ihre Software mit mehreren Entscheidungspfaden zu komplex ist, ist es daher unwahrscheinlich, dass Sie sich das Verhalten Ihrer Software vorstellen können (dh sie weist eine Metrik mit hoher zyklomatischer Komplexität auf). Dies würde höchstwahrscheinlich zur Entwicklung fehlerhafter oder fehlerhafter Software führen. Weitere Informationen hierzu finden Sie hier und auch auf Wikipedia .
quelle
Die zyklomatische Komplexität wird unter Verwendung des Kontrollflussdiagramms berechnet. Die Anzahl der quantitativen Messungen linear unabhängiger Pfade durch den Quellcode eines Programms wird als zyklomatische Komplexität bezeichnet (if / if else / for / while).
quelle
Die zyklomatische Komplexität ist im Grunde eine Metrik, um Codebereiche herauszufinden, die für die Wartbarkeit mehr Aufmerksamkeit benötigen. Es wäre im Grunde eine Eingabe für das Refactoring. Es gibt definitiv einen Hinweis auf den Codeverbesserungsbereich in Bezug auf das Vermeiden von tief verschachtelten Schleifen, Bedingungen usw.
quelle
Das ist so ähnlich. Jeder Zweig einer "case" - oder "switch" -Anweisung zählt jedoch tendenziell als 1. In der Tat bedeutet dies, dass CC case-Anweisungen und jeden Code, der sie erfordert (Befehlsprozessoren, Zustandsautomaten usw.), hasst .
quelle
Betrachten Sie das Kontrollflussdiagramm Ihrer Funktion, wobei eine zusätzliche Kante vom Ausgang zum Eingang verläuft. Die zyklomatische Komplexität ist die maximale Anzahl von Schnitten, die wir ausführen können, ohne das Diagramm in zwei Teile zu trennen.
Zum Beispiel:
Kontrollflussdiagramm
Sie können wahrscheinlich intuitiv erkennen, warum der verknüpfte Graph eine zyklomatische Komplexität von 3 aufweist.
quelle
Die zyklomatrische Komplexität ist ein Maß dafür, wie komplex eine Softwareeinheit ist. Sie misst die Anzahl der verschiedenen Pfade, denen ein Programm mit bedingten Logikkonstrukten folgen kann (If, while, for, switch & case etc ....). Wenn Sie mehr über die Berechnung erfahren möchten, finden Sie hier ein wunderbares Youtube-Video, das Sie unter https://www.youtube.com/watch?v=PlCGomvu-NM ansehen können
Dies ist beim Entwerfen von Testfällen wichtig, da es die verschiedenen Pfade oder Szenarien aufzeigt, die ein Programm einschlagen kann. "Um eine gute Testbarkeit und Wartbarkeit zu gewährleisten, empfiehlt McCabe, dass kein Programmmodul eine zyklomatische Komplexität von 10 überschreitet" (Marsic, 2012, S. 232).
Referenz: Marsic., I. (2012, September). Softwareentwicklung . Rutgers Universität. Abgerufen von www.ece.rutgers.edu/~marsic/books/SE/book-SE_marsic.pdf
quelle