Frage

Ich habe mit Messung der zyklomatische Komplexität einer großen Code-Basis herum spielen.

Zyklomatische Komplexität ist die Anzahl der linear unabhängigen Pfade durch einen Quellcode des Programms und es gibt viele kostenlose Tools für die Sprache Ihrer Wahl.

Die Ergebnisse sind interessant, aber nicht überraschend. Das heißt, die Teile, die ich weiß, dass die haarigste waren in der Tat zu sein, die komplexeste (mit einem Rating von> 50). Aber was ich finde nützlich ist, dass eine konkrete „Schlechtigkeit“ Nummer, die jedes Verfahren als etwas zugeordnet ich darauf hinweisen kann bei der Entscheidung, wo Refactoring zu starten.

Haben Sie zyklomatische Komplexität verwenden? Was ist das komplexeste Stück Code gefunden?

War es hilfreich?

Lösung

Refactoring Wir gnadenlos und Zyklomatische Komplexität als eine der Metriken verwenden, die Code auf unserer Hitliste wird. 1-6 wir nicht Flagge für Komplexität (auch wenn es aus anderen Gründen in Frage gestellt bekommen kann), 7-9 fraglich ist, und jedes Verfahren über 10 angenommen wird, schlecht sein, wenn nicht anders erwiesen.

Die schlechteste, das wir 87 gesehen haben, war von einer monströsen if-else-if-Kette in einigem Legacy-Code, den wir übernehmen mussten.

Andere Tipps

Eigentlich kann zyklomatische Komplexität über die reine Methode Pegelschwellen zu verwenden, wird gestellt. Für den Anfang, ein großes Verfahren mit hohen Komplexität kann mit geringerer Komplexität in mehrere kleinen Methoden gebrochen werden. Aber hat es wirklich die Code-Basis verbessert? Zugegeben, können Sie etwas bessere Lesbarkeit von all den Methodennamen erhalten. Aber die gesamte bedingte Logik hat sich nicht geändert. Und die gesamte bedingte Logik kann oft durch conditionals mit Polymorphismus ersetzen.

Wir brauchen eine Metrik, die durch bloße Methode Zersetzung nicht grün. Ich nenne diese CC100 .

CC100 = 100 * (Total zyklomatische Komplexität von Code-Basis) / (Gesamtcodezeilen)

Es ist nützlich, auf die gleiche Art und Weise mir, dass Big-O nützlich ist: Ich weiß, was es ist, und es verwenden, um einen gut für das Gefühl zu bekommen, ob eine Methode gut oder schlecht ist, aber ich brauche nicht zu berechnen es für jede Funktion habe ich geschrieben.

Ich denke, einfacher Metriken, wie LOC, ist mindestens so gut in den meisten Fällen. Wenn eine Funktion auf einem Bildschirm passt nicht, spielt es keine Rolle fast nicht, wie einfach es ist. Wenn eine Funktion 20 Parameter nimmt und 40 lokale Variablen, spielt es keine Rolle, ob seine zyklomatische Komplexität 1 ist.

Wir haben vor kurzem begonnen, es zu benutzen. Wir verwenden NDepend einige statische Code-Analyse zu tun, und es misst zyklomatische Komplexität. Ich bin damit einverstanden, es ist eine anständige Weise Methoden für Refactoring zu identifizieren.

Leider haben wir für einige Methoden, die von unseren Entwicklern erstellt gesehen # 's über 200 Offshore-Bereich.

Bis es ist ein Werkzeug, das gut mit C ++ Vorlagen arbeiten können, und Meta-Programmiertechniken, es ist nicht viel Hilfe in meiner Situation. Auch immer nur daran erinnern, dass

  

"nicht alle Dinge, die zählen können sein   gemessen, und nicht alle Dinge, die können   werden gemessen count“   Einstein

Also denken Sie daran zu keine Informationen dieser Art durch menschliche Filterung passieren.

Sie wissen, Komplexität, wenn Sie es sehen. Die Hauptsache ist diese Art von Werkzeug ist nützlich für ist es, die Teile des Codes des Markieren, die Ihre Aufmerksamkeit flüchten.

Ich messe häufig die zyklomatische Komplexität meines Codes. Ich habe festgestellt, es mir hilft, Bereiche des Codes zu erkennen, dass zu viel tun. Welche Methoden, um herauszufinden, ist nicht nach dem SRP ein Werkzeug mit den Hot-Spots in meinem Code darauf hin, ist viel weniger zeitaufwendig, als wenn man durch Tausende von Codezeilen zu lesen versuchen.

Allerdings habe ich festgestellt, dass, wenn ich auf anderen Leuten Code eine zyklomatische Komplexität Analyse tue es in der Regel zu einem Gefühl der Frustration führt, Angst und allgemeiner Wut, wenn ich Code mit zyklomatische Komplexität in den 100 finden. Was die Menschen zwingt, Methoden zu schreiben, die in ihnen mehrere tausend Zeilen Code haben?!

Es ist toll für die Hilfe Kandidaten für Refactoring zu identifizieren, aber es ist wichtig, dass Ihre Entscheidung um zu halten. Ich würde kenj0418 die Bereiche für die Beschneidung Führungen unterstützen.

Es gibt eine namens Java metric CRAP4J die zyklomatische Komplexität kombiniert empirisch und JUnit-Testabdeckung zu kommen mit einer einzigen metrisch. Er hat zu forschen, um zu versuchen und zu verbessern seine empirische Formel. Ich bin nicht sicher, wie weit verbreitet ist.

Ich habe es nicht in eine Weile benutzt, aber auf einem früheren Projekt, es half wirklich potenzielle Problemstellen in jemand anderem Code zu identifizieren (würde meins natürlich nicht sein!)

Auf der Gegend zu finden, zu überprüfen, fand ich schnell numerious Probleme (auch viele GOTOS würden Sie glauben!) Mit Logik und einigen wirklich seltsamen WTF-Code.

Zyklomatische Komplexität ist für die Bereiche zeigen, die wahrscheinlich zu viel tun und damit die einzelne responsibilty prinicpal zu brechen. Diese ist idealerweise sollte in mulitple Funktionen aufgebrochen

ich Angst habe, dass für die Sprache des Projekts, für die ich am liebsten Metriken wie diese, LPC gibt es nicht, in der Tat, viele kostenlose Tools, zu dessen Herstellung zur Verfügung. Also nein, nicht so nützlich für mich.

1 für kenj0418 der Hitliste Werte.

Das Schlimmste, was ich gesehen habe war ein 275. Es gibt ein paar andere mehr als 200 waren, die wir in der Lage waren zu viel kleine CCs Refactoring nach unten; sie waren immer noch hoch, aber es hat sie in Linie weiter nach hinten geschoben. Wir haben nicht viel Glück mit dem 275 Tier - es war (wahrscheinlich immer noch) ein Netz aus wenn- und switch-Anweisungen, die einfach viel zu komplex war. Es ist nur realer Wert ist als gestuft durch, wenn sie sich entscheiden, das System neu zu erstellen.

Die Ausnahmen von hohen CC, die ich war komfortabel und mit Fabriken waren; IMO, sollen sie eine hohe CC haben, aber nur, wenn sie nur einfache Objekterstellung und die Rückkehr tun.

Nach dem Verständnis , was es bedeutet, ich habe jetzt begonnen, es auf einem „Versuch“ -Basis zu verwenden. Bisher habe ich es für sinnvoll zu sein, denn in der Regel hohe CC Hand in Hand mit dem geht Pfeil Anti-Pattern , der Code schwerer zu lesen und verstehen macht. Ich habe keine feste Zahl noch, aber NDepend ist für alles, was über 5 alarmieren, die wie einen guten Start sehen Methoden zu untersuchen.

Ja, wir benutzen es und ich habe es nützlich zu finden. Wir haben eine große Vermächtnis Code-Basis zu zähmen und wir fanden hohe zyklomatische Komplexität alaraming. (387 in einem Verfahren!). CC Punkte, die Sie direkt zu den Bereichen, die es wert Refactoring sind. Wir verwenden CCCC auf C ++ Code.

zyklomatische Komplexität ist nur eine composant von dem, was Fabricated Komplexität bezeichnen könnte. Vor einiger Zeit schrieb ich einen Artikel mehrere Dimensionen der Komplexität des Codes zusammenfassen: Kampf Fabricated Komplexität

Tooling benötigt wird, um im Umgang mit Komplexität des Codes effizient zu sein. Das Tool NDepend für .NET-Code wird Ihnen wie vielen Dimensionen der Komplexität des Codes einschließlich Code-Metriken analysieren: Zyklomatische Komplexität, Schachtelungstiefe, Mangel an Zusammenhalt von Methoden, Coverage durch Tests ...

gewidmet Abhängigkeiten Analyse und mit einer Sprache (-Code Query Language ) einschließlich fragen , was in meinem Code ist komplex, und Regel zu schreiben?

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