Frage

Ein Begriff, den ich immer mal sehen und dann ist „zyklomatische Komplexität“. Hier auf SO sah ich einige Fragen über „wie die CC von Sprache X berechnen“ oder „Wie kann ich tun, Y mit der minimalen Menge von CC“, aber ich bin nicht sicher, ob ich wirklich verstehen, was es ist.

Auf der NDepend Webseite , sah ich eine Erklärung, die im Grunde sagt: „Die Zahl der Entscheidungen in einem Verfahren. Jeder wenn, für, && usw. fügen +1 an dem CC „score“). ist das wirklich wahr? wenn ja, warum dies schlecht ist? kann ich sehen, dass man die Anzahl der halten möchte, wenn -Aussagen ziemlich niedrig, um den Code zu halten, leicht zu verstehen, aber das ist wirklich alles, um es?

Oder gibt es eine tiefere Konzept dahinter?

War es hilfreich?

Lösung

Ich bin mir nicht bewusst ein tieferes Konzept. Ich glaube, dass es in der Regel im Rahmen eines Wartbarkeitsindex betrachtet wird. Je mehr Verzweigungen es gibt innerhalb einer bestimmten Methode ist, desto schwieriger es ist, ein gedankliches Modell dieses Verfahrens Operation (im allgemeinen) zu halten.

Methoden mit höherer zyklomatische Komplexität sind auch schwieriger zu in Unit-Tests vollständige Codeabdeckung zu erhalten. (Danke Mark W !)

Das bringt alle anderen Aspekte der Wartbarkeit in, natürlich. Wahrscheinlichkeit von Fehlern / Regressionen / so weiter. Das Kernkonzept ist ziemlich geradlinig, aber.

Andere Tipps

Zyklomatische Komplexität misst die Anzahl der Sie einen Codeblock mit unterschiedlichen Parametern ausführen, um müssen jeden Pfad durch diesen Block auszuführen. Eine höhere Anzahl ist schlecht, weil es die Chancen auf logische Fehler erhöht Ihre Teststrategie zu entkommen.

Cyclocmatic complexity = Number of decision points + 1

Die Entscheidungspunkte können Ihre bedingten Anweisungen wie, wenn, wenn ... sonst, Schalter, für Schleife, while-Schleife etc.

Die folgende Tabelle beschreibt die Art der Anwendung.

  • zyklomatische Komplexität liegt 1 - 10  als normal angesehen applicatinon

  • zyklomatische Komplexität liegt 11 - 20  Moderate Anwendung

  • zyklomatische Komplexität liegt 21-50  Risky Anwendung

  • zyklomatische Komplexität liegt mehr als 50  Unstable Anwendung

Wikipedia kann deinen Freund auf diese ein: Definition von zyklomatische Komplexität

Im Grunde müssen Sie Ihr Programm vorstellen, wie ein Kontrollflussgraphen rel="nofollow und dann

  

Die Komplexität ist (...) wie folgt definiert:

M = E − N + 2P
     

Dabei steht

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

CC ist ein Konzept, das zu erfassen versucht, wie komplex Ihr Programm ist und wie schwer es ist, sie in einer einzigen Integer-Zahl zu testen.

Ja, das ist es wirklich. Je mehr Ausführungspfade Code nehmen kann, desto mehr Dinge, die getestet werden müssen, und die höhere Fehlerwahrscheinlichkeit.

Ein weiterer interessanter Punkt, den ich gehört habe:

Die Stellen im Code mit den größten Einzügen sollten die höchste CC haben. Diese sind im Allgemeinen die wichtigsten Bereiche Testabdeckung zu gewährleisten, da es erwartet wird, dass sie härter sein zu lesen / aufrechtzuerhalten. Wie andere Antworten beachten Sie, das sind auch die schwierigeren Regionen Code Abdeckung zu gewährleisten.

zyklomatische Komplexität ist wirklich nur ein unheimlich Schlagwort. In der Tat ist es ein Maß für die Komplexität des Codes in der Software-Entwicklung komplexe Teile des Codes hinzuweisen (eher buggy sein, und deshalb sein muss sehr sorgfältig und gründlich getestet). Sie können es berechnen Sie die E-N + 2P Formel, aber ich würde vorschlagen, Sie automatisch von einem Plugin errechnet haben. Ich habe von Faustregel gehört, dass Sie sollte sich bemühen, die CC unter 5 zu halten gute Lesbarkeit und Wartbarkeit des Codes zu erhalten.

Ich habe gerade vor kurzem experimentiert mit der Eclipse-Plugin Metrics auf meine Java-Projekte, und es hat eine wirklich schöne und prägnante Hilfedatei, die mit Ihrer normalen Eclipse-Hilfe wird natürlich integrieren und Sie können einige weiteren Definitionen verschiedener Komplexität Maßnahmen und Tipps und Tricks zur Verbesserung Ihres Code lesen.

Das ist es, die Idee ist, dass ein Verfahren, das eine niedrige CC hat weniger Gabeln hat, Schleifen usw., die alle ein Verfahren komplizierter zu machen. Stellen Sie sich vor 500.000 Codezeilen der Überprüfung mit einem Analysator und zu sehen, ein paar Methoden, die oder eine Größenordnung höher CC haben. Auf diese Weise können Sie dann konzentrieren sich auf die Methoden für ein besseres Verständnis Refactoring (Es ist auch üblich, dass ein hoher CC eine hohe Fehler-Rate hat)

Jeder Entscheidungspunkt in einer Routine (loop, Schalter, wenn, etc ...) siedet im wesentlichen auf eine Anweisung if äquivalent unten. Für jede if haben Sie 2 codepaths die ergriffen werden können. Also mit dem ersten Zweig gibt es zwei Codepfade, mit dem zweiten gibt es 4 mögliche Wege, mit dem 3. gibt es 8 und so weiter. Es gibt mindestens 2 ** N Codepfade, wobei N die Anzahl von Verzweigungen ist.

Das macht es schwierig, das Verhalten von Code zu verstehen und sie zu testen, wenn N über einige kleine Zahl wächst.

Die bisher gegebenen Antworten die Korrelation von Software-Qualität zu zyklomatische Komplexität nicht erwähnt. Die Forschung hat gezeigt, dass eine geringere zyklomatische Komplexität Metrik hilft Software entwickeln sollte, die von höherer Qualität ist. Es kann mit der Software-Qualitätsattribute der Lesbarkeit, Wartbarkeit und Portabilität helfen. Im Allgemeinen sollte man versuchen, eine zyklomatische Komplexität Metrik zwischen 5-10 zu erhalten.

Einer der Gründe für Metriken wie zyklomatische Komplexität ist, dass ein Mensch in der Regel nur Spur von etwa 7 (plus oder minus 2) Stücke von Informationen gleichzeitig in Ihrem Gehirn halten. Deshalb, wenn Sie Ihre Software zu komplex mit mehreren Entscheidungswege ist, ist es unwahrscheinlich, dass Sie in der Lage sein wird, sich vorzustellen, wie die Software verhalten (das heißt, es wird eine hohe zyklomatische Komplexität Metrik haben). Dies würde höchstwahrscheinlich zu einem fehlerhaften oder Bug geritten Software zu entwickeln. Weitere Informationen dazu finden Sie hier und auch auf Wikipedia .

Zyklomatische Komplexität berechnet, um das Kontrollflussgraphen verwendet. Die Anzahl des quantitativen Maßes der linear unabhängiger Pfade durch ein Quellcode des Programms wird als zyklomatische Komplexität (if / else if / for / while)

genannt

Cyclomatric Komplexität ist im Grunde ein metrischen Bereich des Codes, um herauszufinden, die mehr attension für die Wartbarkeit muss. Es würde den Refactoring im Grunde ein Eingang sein. Es gibt auf jeden Fall einen Hinweis auf Code Verbesserung Bereich in Bezug auf die tief verschachtelte Schleife zu vermeiden, Bedingungen etc.

Das ist eine Art davon. Jedoch kann jeder Zweig eines „Fall“ oder „switch“ Anweisung als 1. In der Tat zu zählen dazu neigt, bedeutet dies CC Hasse case-Anweisungen, und jeden Code, den sie (Befehl Prozessoren, Zustandsmaschinen erfordert, etc).

Betrachten Sie die Kontrollflussgraphen Ihrer Funktion rel="nofollow, mit einem zusätzlichen Rand von der Ausfahrt Lauf zum Eingang. Die zyklomatische Komplexität ist die maximale Anzahl von Schnitten wir ohne Trennung des Graphen in zwei Stücke machen.

Zum Beispiel:

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

Kontrollflussgraphen

Kontrollflussgraphen

Sie können sich wahrscheinlich intuitiv erkennen, warum die verknüpfte Grafik, die eine zyklomatische Komplexität von 3 hat.

Cyclomatric Komplexität ist ein Maß dafür, wie komplex eine Einheit der Software is.It die Anzahl der verschiedenen Pfade misst ein Programm folgen könnte mit bedingten Logik-Konstrukten (Wenn, während für, Schalter & Koffer, etc ....). Wenn Sie mehr erfahren möchten über sie hier die Berechnung ist eine wunderbare youtube Video, das Sie sehen können https : //www.youtube.com/watch v = PlCGomvu-NM

Es ist wichtig, Testfälle bei der Gestaltung, weil sie die verschiedenen Pfade oder Szenarien ein Programm zeigt nehmen. „Um eine gute Testbarkeit und Wartbarkeit, McCabe empfiehlt dass kein Programmmodul eine zyklomatische Komplexität von 10" (Marsic 2012, Seite 232).

überschreiten

Referenz: Marsic., I. (2012, September). Software Engineering . Rutgers University. Von www.ece.rutgers.edu/~marsic/books/SE/book-SE_marsic.pdf

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top