it-swarm.dev

Was bedeutet die "zyklomatische Komplexität" meines Codes?

Ich bin neu in der statischen Analyse von Code. Meine Anwendung hat eine zyklomatische Komplexität von 17.754. Die Anwendung selbst besteht nur aus 37.672 Codezeilen. Ist es gültig zu sagen, dass die Komplexität basierend auf den Codezeilen hoch ist? Was genau sagt mir die zyklomatische Komplexität?

42
AngryBird

Was genau sagt mir die zyklomatische Komplexität?

Die zyklomatische Komplexität ist kein Maß für Codezeilen, sondern die Anzahl unabhängiger Pfade durch ein Modul. Ihre zyklomatische Komplexität von 17.754 bedeutet, dass Ihre Anwendung 17.754 eindeutige Pfade aufweist. Dies hat einige Auswirkungen, in der Regel in Bezug darauf, wie schwierig es ist, Ihre Anwendung zu verstehen und zu testen. Die zyklomatische Komplexität ist beispielsweise die Anzahl der Testfälle, die erforderlich sind, um eine 100% ige Verzweigungsabdeckung zu erreichen, vorausgesetzt, es handelt sich um gut geschriebene Tests.

Ein guter Ausgangspunkt könnte der Wikipedia-Artikel zur zyklomatischen Komplexität sein. Es enthält ein paar Pseudocode-Schnipsel und einige Grafiken, die zeigen, worum es bei der zyklomatischen Komplexität geht. Wenn Sie mehr wissen möchten, können Sie lesen Sie auch McCabes Artikel, in dem er die zyklomatische Komplexität definiert hat .

Meine Anwendung hat eine zyklomatische Komplexität von 17.754 Codezeilen. Die Anwendung selbst besteht nur aus 37.672 Codezeilen. Ist es gültig zu sagen, dass die Komplexität aufgrund der Codezeilen hoch ist?

Ganz und gar nicht. Eine Anwendung mit wenigen Codezeilen und einer hohen Anzahl von Bedingungen, die in Schleifen verschachtelt sind, kann eine extrem hohe zyklomatische Komplexität aufweisen. Andererseits kann eine Anwendung mit wenigen Bedingungen eine geringe zyklomatische Komplexität aufweisen. Das vereinfacht es zu sehr, aber ich denke, es bringt die Idee auf den Punkt.

Ohne mehr über die Funktionsweise Ihrer Anwendung zu wissen, kann eine höhere zyklomatische Komplexität normal sein. Ich würde jedoch vorschlagen, die zyklomatische Komplexität auf Klassen- oder Methodenebene anstatt nur auf Anwendungsebene zu messen. Ich denke, dies ist konzeptionell etwas einfacher zu handhaben - es ist einfacher, die Pfade durch eine Methode zu visualisieren oder zu konzipieren als Pfade durch eine große Anwendung.

48
Thomas Owens

Durch die zyklomatische Komplexität können Sie feststellen, ob Ihr Code überarbeitet werden muss. Der Code wird analysiert und eine Komplexitätszahl bestimmt. Die Komplexität wird durch Verzweigung (if-Anweisungen usw.) bestimmt. Die Komplexität kann auch die Verschachtelung von Schleifen usw. und andere Faktoren berücksichtigen, abhängig vom verwendeten Algorithmus.

Die Nummer ist auf Methodenebene nützlich. Auf höheren Ebenen ist es nur eine Zahl.

Eine Zahl von 17.754 gibt die Komplexität auf Projektebene (Gesamtcode) an, die nicht so viel Bedeutung hat.

Ein Drilldown in die Komplexität auf Klassen- und Methodenebene bestimmt Bereiche des Codes, die in kleinere Methoden umgestaltet oder neu gestaltet werden müssen, um die Komplexität zu verringern.

Betrachten Sie eine CASE -Anweisung mit 50 Fällen in einer Methode. Vielleicht hat jeder Staat eine andere Geschäftslogik. Dies führt zu einer zyklomatischen Komplexität von 50. Es gibt 50 Entscheidungspunkte. Die CASE-Anweisung muss möglicherweise mithilfe eines Factory-Musters neu gestaltet werden, um die Verzweigungslogik zu entfernen. Manchmal können Sie die Methode umgestalten (die Methode in kleinere Teile aufteilen), und in einigen Fällen wird nur eine Neugestaltung die Komplexität verringern.

Im Allgemeinen für die Komplexität auf Methodenebene:

  • <10 Pflegeleicht
  • 11-20 Schwieriger zu warten
  • 21+ Kandidaten für Refactoring/Redesign

Bedenken Sie auch, dass höhere Komplexitäten den Komponententest erschweren.

Die höchste Komplexität, die ich bei einer einzelnen Methode gesehen habe, war 560. Es waren ungefähr 2000 Zeilen if-Anweisungen in einer Methode. Grundsätzlich nicht wartbar, nicht testbar, voller potenzieller Fehler. Stellen Sie sich alle Unit-Testfälle vor, die für diese Verzweigungslogik benötigt werden! Nicht gut.

Versuchen Sie, alle Methoden unter 20 zu halten, und stellen Sie fest, dass die Umgestaltung einer Methode Kosten verursacht, um sie weniger komplex zu machen.

36
Jon Raynor

Dies ist die Anzahl der unterschiedlichen Pfade in Ihrer Anwendung. Lesen Sie diesen IBM Artikel über CC .

Es scheint hoch zu sein, aber in Ihrem Fall ist es die Hinzufügung des CC aller Ihrer Methoden aller Ihrer Klassen und Methoden. Meine Beispiele sind weit gespannt, da ich nicht weiß, wie Ihr Code aufgebaut ist, aber Sie können auch eine Monstermethode mit 37672 Codezeilen oder 3767 Methoden mit etwa 10 Codezeilen verwenden. Was ich damit meine ist, dass dieser Indikator auf Anwendungsebene nicht viel bedeutet, aber auf Methodenebene kann er Ihnen helfen, Ihren Code in kleinere Methoden zu optimieren/umzuschreiben, damit diese weniger fehleranfällig sind.

Was ich persönlich oft gelesen habe, ist, dass Methoden mit einem CC von mehr als 10 ein höheres Fehlerrisiko aufweisen.

Ich verwende Sonar , um die Codequalität meiner Anwendungen zu testen, und standardmäßig wird eine Warnung ausgegeben, wenn Sie Methoden mit +10 CC haben. Trotzdem kann das nichts bedeuten. Ein konkretes Beispiel: Wenn Sie Eclipse verwenden, um eine equals -Methode basierend auf den Eigenschaften Ihrer Bohne zu generieren, geht der CC sehr schnell über das Dach ...

1
Jalayn