Ich vermute, dass die Diskrepanz möglicherweise auf eine verzögerte Ausführung zurückzuführen ist. Wenn Sie LINQ mit Lambda-Ausdrücken verwenden, geben Sie Code an, der ausgeführt wird wenn Sie dann über die Sammlung iterieren.
Ich persönlich bin nicht so besorgt um die zyklomatische Komplexität, aber ich bin mir absolut sicher, dass LINQ (wenn es richtig verwendet wird) die Lesbarkeit verbessert. Das ist, was ich wirklich interessiere:)
Ich kam gerade mit der gleichen Frage und in der Tat kann Lambda die zyklomatische Komplexität erhöhen. Ich habe den Test gemacht und Where () -Klauseln können es sinnvoll erhöhen.
Lesbarkeit ist in der Tat eine Ihrer obersten Prioritäten.
Aber ich brauchte nicht zu lange, um einige LinQ-Abfragen durch Get () -Methoden zu ersetzen, die mir dieselben Daten und zusätzliche Vorteile verschafften.
Ich halte mein Fxcop in meinem Build / Publish Skript, damit ich nie etwas bereitstellen kann, ohne das Ziel von 25 für zyklomatische Komplexität zu erreichen.
Es ist hart, aber ich denke, es ist die Mühe wert.
Das gibt mir einige Punkte in Diskussionen, wenn meine Kollegen mit einem sehr schlechten Code kommen, der sagt: das funktioniert, darauf kommt es an.
Mein Tipp ist: Halten Sie Ihre zyklomatische Komplexität unter 25. Dies kann Ihnen helfen, jede Methode für eine gute Wartung einfach genug zu halten.
Jon Skeet hat die Frage ziemlich genau beantwortet. Ich möchte hinzufügen, dass nach meiner Erfahrung mit Hochsprachen wie C # der Wert der Messung der zyklomatischen Komplexität aufgrund des Werts, den syntaktische Zuckerpakete wie LINQ der Entwicklung hinzufügen, reduziert wird.
In den letzten zehn Jahren haben sich viele Sprachen im Netz durch die Entwicklung der Sprachen eine starke Korrelation zwischen der zyklomatischen Komplexität und den Codezeilen aufgezeigt, was viele von ihnen in Frage stellt, wie viel eine solche Maßnahme tatsächlich bringt. Eine andere Möglichkeit, dies zu betrachten, wäre, dass die Abwertung von CC als Maß für die Qualität eines Codes tatsächlich eine Aussage über die Wichtigkeit der Lesbarkeit ist, da man oft das Gegenteil des anderen ist.
Wenn ich beispielsweise eine Bedingung in eine foreach-Schleife setze, wird die Bedingung als mein Code ausgewertet, und die entsprechende Anzahl von Codepfaden wird gezählt. Auf der anderen Seite, wenn ich einen Funktionsbaum auf die Sammlung anwende, die ich übergebe (z. B. Where (evalStr = & gt; evalStr == origStr), bewege ich die Bedingung nach außerhalb der Schleife und in Compiler-generierten Code sind immer noch die gleiche Anzahl von Zweigen, aber die Bedingungen sind nicht Teil der Schleife, aber die CC steigt über die der foreach-Schleife, mit "Strafen" für die Verwendung anonymer Methoden (lambdas und Delegaten) über die tatsächliche Anzahl der Verzweigungen. Mit der Where-Funktion kann ich die iterierte Sammlung vorkonditionieren, so dass die Schleife nur bei Bedarf iteriert.
Der Code ist jedoch weit mehr lesbar.
Wenn schließlich entschieden wird, dass ein boolescher Ausdruck, der in einer LINQ IQueryable-Funktion verwendet wird, nicht Unit-getestet werden muss, wird eine Exception höherer Ordnung (auch Business-Level genannt) angezeigt (falscher Wert) getestet werden, falscher Operator, falscher Operand, etc.), im Gegensatz zu einer weniger als idealen Verwendung der Sprache (mit Schalter statt wenn, wenn statt ternär usw.), dann sollte die Messung der zyklomatischen Komplexität dies berücksichtigen: Eine Where () Funktion sollte meinen CC nicht erhöhen. Die Messung der zyklomatischen Komplexität trägt nicht zu besserem Code bei; Wenn überhaupt, wird es die Tendenz eines Entwicklers künstlich verstärken, wo keine Vereinfachung erforderlich oder gewünscht ist.
Tags und Links linq lambda cyclomatic-complexity