wolę ten styl pisania z pierwszych zwrotów:stwierdzenia wcześniejszego powrotu i Złożoność cykliczna
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;
}
Niestety, każdy return
oświadczenie zwiększa złożoność cyclomatic metrykę obliczoną przez sonar. Rozważmy taką alternatywę:
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;
}
cyklomatyczna złożoność tego ostatniego podejścia zgłoszonych przez Sonar jest niższa niż pierwsza, przez 3. Powiedziano mi, że może to być wynikiem niewłaściwej implementacji metryki CC. Czy też Sonar jest poprawny, a to jest naprawdę lepsze? Te pytania związane wydają się nie zgodzić z tym:
Jeśli dodać wsparcie dla kilku więcej rodzajów trójkątów, oświadczenia return
doda się do znaczącej różnicy w metrykę i przyczyny naruszenie sonaru. Nie chcę przyklejać metody do metody // NOSONAR
, ponieważ może to maskować inne problemy poprzez dodanie nowych funkcji/błędów do metody w przyszłości. Używam więc drugiej wersji, mimo że jej nie lubię. Czy istnieje lepszy sposób poradzenia sobie z sytuacją?
Według http://en.wikipedia.org/wiki/Cyclomatic_complexity, CC jest liczba liniowo niezależnych ścieżek poprzez funkcję, która jest w obu przypadkach 4. Czy Sonar mówi ci coś innego? –
Yeap. Sonar dodaje +1 dla każdej instrukcji 'return'. Jest to zasada 'squid: MethodCyclomaticComplexity': https://dev.eclipse.org/sonar/rules/show/squid:MethodCyclomaticComplexity Wcześniejsza reguła (ale teraz przestarzała na rzecz squid) nie miała tego ograniczenia: https: // dev.eclipse.org/sonar/rules/show/checkstyle:com.puppycrawl.tools.checkstyle.checks.metrics.CyclomaticComplexityCheck – janos
, więc to pytanie naprawdę oznacza "jak zapobiec Sonarowi od obliczenia CC źle" - co nie jest dobre pasuje do tej witryny. Takie pytania są lepiej umieszczone na stackoverflow. Zgłaszam to pytanie do migracji. –