preferisco questo stile di scrittura con rendimenti prime:dichiarazioni rientro anticipato e la complessità ciclomatica
public static Type classify(int a, int b, int c) {
if (!isTriangle(a, b, c)) {
return Type.INVALID;
}
if (a == b && b == c) {
return Type.EQUILATERAL;
}
if (b == c || a == b || c == a) {
return Type.ISOSCELES;
}
return Type.SCALENE;
}
Purtroppo, ogni return
dichiarazione aumenta la metrica complessità ciclomatica calcolato da Sonar. Prendere in considerazione questa alternativa:
public static Type classify(int a, int b, int c) {
final Type result;
if (!isTriangle(a, b, c)) {
result = Type.INVALID;
} else if (a == b && b == c) {
result = Type.EQUILATERAL;
} else if (b == c || a == b || c == a) {
result = Type.ISOSCELES;
} else {
result = Type.SCALENE;
}
return result;
}
La complessità ciclomatica di questo secondo approccio riportato da Sonar è inferiore alla prima, per 3. Mi è stato detto che questo potrebbe essere il risultato di una errata applicazione delle metriche CC. O è corretto Sonar, e questo è davvero meglio? Queste domande relative sembrano essere d'accordo con quanto segue:
Se posso aggiungere il supporto per un paio di più tipi di triangolo, la return
dichiarazioni si sommano a fare una differenza significativa nella metrica e la causa una violazione del sonar. Non voglio incollare un // NOSONAR
al metodo, poiché questo potrebbe mascherare altri problemi con nuove funzionalità/bug aggiunti al metodo in futuro. Quindi uso la seconda versione, anche se non mi piace molto. C'è un modo migliore per gestire la situazione?
Secondo http://en.wikipedia.org/wiki/Cyclomatic_complexity, CC è il numero di percorsi linearmente indipendenti attraverso la funzione, che è in entrambi i casi 4. Sonar ti dice qualcosa di diverso? –
Yeap. Sonar aggiunge +1 per ogni istruzione return. È la regola "calam: MethodCyclomaticComplexity': https://dev.eclipse.org/sonar/rules/show/squid:MethodCyclomaticComplexity Una regola precedente (ma ora deprecata a favore di squid) non aveva questo vincolo: https: // dev.eclipse.org/sonar/rules/show/checkstyle:com.puppycrawl.tools.checkstyle.checks.metrics.CyclomaticComplexityCheck – janos
quindi questa domanda significa davvero "come impedire a Sonar di calcolare il CC sbagliato" - che non è un buon adatto per questo sito. Tali domande sono meglio posizionate su StackOverflow. Segnalo questa domanda per la migrazione. –