Sonar-zyklomatische Komplexität-Regel-Problem - rät, mehrere return-Anweisungen
Für das folgende Stück code, sonarqube berechnet die Methode die zyklomatische Komplexität als 9
String foo() {
if (cond1) return a;
if (cond2) return b;
if (cond3) return c;
if (cond4) return d;
return e;
}
Verstehe ich als pro die Regeln für die Berechnung http://docs.sonarqube.org/display/SONAR/Metrics+-+ - Komplexität die Komplexität von 9 richtig ist.
So dass die Komplexität der Methode ist = 4 (if) + 4 (return) + 1 (Methode) = 9
Diese Komplexität kann reduziert werden, wenn ich einen einzigen Punkt beenden.
String foo() {
String temp;
if (cond1) {
temp = a;
} else if (cond2) {
temp = b;
} else if (cond3) {
temp = c;
} else if (cond4) {
temp = d;
} else {
temp = e;
}
return temp;
}
Ich glaube, dieser code ist unübersichtlich und nicht mehr lesbar ist als die Vorherige version und ich habe das Gefühl dass Methoden mit return-on-guard-Bedingungen ist ein besserer Programmierstil. So ist es ein guter Grund, warum der return-Anweisung gilt für die Berechnung der zyklomatischen Komplexität? Kann die Logik für die Berechnung geändert werden, so dass es nicht zu fördern einzigen Punkt beenden.
- Ich würde Ihnen Zustimmen. Es gibt wirklich nichts falsch mit mehrere gibt. Wie Sie sehen können heregibt es historische Gründe, die hinter der Idee, aber es sollte nicht sein, nichts falsch mit Ihrem Gebrauch in eine moderne Sprache. Allerdings, ich weiß nicht, wie zu ändern, die Methode der Berechnung, so wird dies bleiben, ein Kommentar.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin damit einverstanden, sollten Sie verwenden Sie gesunden Menschenverstand und gehen Sie mit dem code, die Sie glauben, ist am einfachsten.
BTW kann Man vereinfachen Sie den code und haben nur eine Rendite, wenn Sie
? :
Anderen Antworten habe gute Punkte über die Berechnung einbezogen.
Möchte ich darauf hinweisen, dass Ihre Behauptung, dass der code weniger lesbar ist, ist falsch, weil in einem Fall haben Sie die Klammern, und in der anderen nicht.
Dies ist so gut lesbar wie das Beispiel, das Sie Gaben mit return-Anweisungen.
Ob oder nicht Sie erlauben, braceless if-Anweisungen ist eine Frage von Stil, dass Sie sollten wahrscheinlich im Einklang mit all Ihren code.
Die weitere wichtige Frage, die zyklomatische Komplexität hat - Adresse ist, dass, wenn der Berechnung der Wert von cond1, cond2 etc Nebenwirkungen haben, d.h. wenn Sie eine stateful-Methode, anstatt ein Feld, in diesem Fall, dann ist die konzeptionelle Komplexität des Codes ist viel höher, wenn Sie zurückkehren könnte früh im Vergleich zu, wenn Sie es nicht können.
In Ihrem Beispiel mehrere gibt nicht hinzufügen, um die Komplexität und wie @Peter Lawrey sagt, Sie sollten beschäftigen der gesunde Menschenverstand.
Bedeutet dies, dass alle Beispiele für mehrere return-Anweisungen machen nicht an Komplexität und sollten gelöscht werden? Ich denke nicht so. Wenn wäre sehr einfach zu kommen mit einem Beispiel für eine Methode, die ist schwer zu Lesen, weil mehrere return-Anweisungen. Stell dir vor, ein 100 line-Methode mit 4 verschiedenen return-Anweisung bestreut im gesamten. Das ist die Art von Problem, das Regeln versucht zu fangen.
Dies ist ein bekanntes problem mit zyklomatische Komplexität.
Außerdem gibt es guten Grund zu glauben, dass die zyklomatische Komplexität ist nutzlos. Es korreliert stark mit SLOC und nur schwach mit dem tatsächlichen Fehler. In der Tat SLOC ist genauso gut ein Indikator für Mängel, die zyklomatische Komplexität. Das gleiche gilt für die meisten anderen Komplexität Metriken.
Sehen http://www.leshatton.org/Documents/TAIC2008-29-08-2008.pdf, beginnend um Folie 16.