Was ist zyklomatische Komplexität?

74

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?

Michael Stum
quelle

Antworten:

55

Mir ist kein tieferes Konzept bekannt. Ich glaube, es wird allgemein im Zusammenhang mit einem Wartbarkeitsindex betrachtet. Je mehr Zweige sich innerhalb einer bestimmten Methode befinden, desto schwieriger ist es, ein mentales Modell der Funktionsweise dieser Methode (im Allgemeinen) aufrechtzuerhalten.

Bei Methoden mit höherer zyklomatischer Komplexität ist es auch schwieriger, in Komponententests eine vollständige Codeabdeckung zu erhalten. (Danke Mark W !)

Das bringt natürlich alle anderen Aspekte der Wartbarkeit mit sich. Wahrscheinlichkeit von Fehlern / Regressionen usw. Das Kernkonzept ist jedoch ziemlich einfach.

Greg D.
quelle
10
Je schwieriger es ist, einen Unit-Test durchzuführen und eine vollständige Codeabdeckung zu erzielen.
Marc W
1
Richtig, weil sie sagen, dass Sie zu einem bestimmten Zeitpunkt nur eine Handvoll Dinge in Ihrem Gewissen behalten können.
Dampfer25
4
Die zyklomatische Komplexität eines Verfahrens gibt auch die Anzahl der Unit-Testfälle an, die erforderlich sind, um die 100% ige Codeabdeckung für dieses Verfahren zu erreichen.
Anand Patel
'The more branches there are within a particular method'... damit meinen Sie mehr IF-Else-Aussagen?
user20358
40

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.

Tetsujin no Oni
quelle
12
Cyclocmatic complexity = Number of decision points + 1

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

Nirali
quelle
4
"Zyklokmatische Komplexität = Anzahl der Entscheidungspunkte + 1" In allen Fällen, die ich versucht habe, scheint dies zuzutreffen . Ich habe nur eine Frage: Warum beschäftigen wir uns mit Flussdiagrammen und Formeln, wann decision_points+1brauchen wir nur? (Auf jeden Fall danke für diese extrem einfache Methode!)
Luc
11

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

Die Komplexität ist definiert als:

M = E − N + 2P

wo

  • M = zyklomatische Komplexität,
  • E = Anzahl der Kanten des Diagramms
  • N = die Anzahl der Knoten des Graphen
  • P = Anzahl der angeschlossenen Komponenten

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.

Azheglov
quelle
7

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
5

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.

Dampfer25
quelle
3

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.

Peter Perháč
quelle
2

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).

JoshBerke
quelle
2

Jeder Entscheidungspunkt in einer Routine (Schleife, Schalter, if usw.) läuft im Wesentlichen auf ein if-Anweisungsäquivalent hinaus. Für jeden haben ifSie 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.

Michael Burr
quelle
2

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 .

Jay Abraham
quelle
2

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).

Asiri Harisandu
quelle
1

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.

aJ.
quelle
1

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 .

TED
quelle
@TetsujinnoOni - Mai ja. Das Problem ist, dass mein typischer Befehlsprozessor Befehle von einer externen Quelle liest. Daher kann ich den Compiler nicht einfach Datenelemente dort ablegen lassen, wo er möchte, wie es für eine dynamische polymorphe Klasse erforderlich ist.
TED
1

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:

function F:
    if condition1:
       ...
    else:
       ...
    if condition2:
       ...
    else:
       ...

Kontrollflussdiagramm

Kontrollflussdiagramm

Sie können wahrscheinlich intuitiv erkennen, warum der verknüpfte Graph eine zyklomatische Komplexität von 3 aufweist.

Craig Gidney
quelle
1
Können Sie erklären, wie und wo Sie die Schnitte im obigen Diagramm vornehmen?
Shashi Kumar Raja
0

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

perfo
quelle