2014-04-30 3 views
3

자바 프로젝트에 SonarQube를 사용하지만 복잡성 계산이 명확하지 않습니다. 다음과 같이 복잡성이 계산된다 User Guide 따르면return 문이 복잡성을 증가시키는 이유는 무엇입니까?

public boolean even(int i) { 
    if (i % 2 == 0) { 
    return true; 
    } 
    return false; 
} 

: 복잡도 값은 다음과 같은 예를 들어 3 '또한 맥케이브 메트릭으로 알려진 복잡성을한다. 함수의 제어 흐름이 분할 될 때마다 복잡도 카운터는 1 씩 증가합니다. 각 함수의 최소 복잡성은 1입니다. 자세한 설명에서 return 문은 복잡성 값을 1 씩 증가시킵니다 (메서드의 마지막 문이 아닌 경우). return 문이 제어 흐름을 분할하는 이유를 이해할 수 없습니다. 필자의 의견으로는, 제어 흐름의 모든 return 문 다음에 가능한 방법은 하나뿐입니다.

+0

'return (1 % 2) == 0;'은 위의 코드보다 훨씬 덜 복잡합니다. 그게 그걸 설명하니? – John3136

답변

3

예제의 제어 흐름 그래프는 5 개의 가장자리 (E), 5 개의 노드 (N) 및 하나의 연결된 구성 요소 (P)를 포함합니다.

복잡도 (M = E-N + 2P) 정확한 복잡도 값 그것이 유동을 제어 복귀하지만, 사후에, 제어 흐름은 둘 사이에 분할되었다없는 것 2.

+0

SonarQube가 계산하는 3과 왜 다른 점이 있습니까? –

+0

내가 아는 한, SonarQube는 반환 할 때마다 하나씩 추가하기 때문에. – titi

+0

@ titi 복잡성 방문자를보고 확인할 수 있습니다. https://github.com/SonarSource/sonar-java/blob/master/java-squid/src/main/java/org/sonar/java/ast/visitors /ComplexityVisitor.java – benzonico

0

이다의 (고화질)에 따르면 메소드 종료점. 순환 복잡한 계산이 isAdultComplex 방법의 조기 반환을 추가하지 않은 경우,이 두 가지 방법이 동일한 순환 복잡성을 것

public boolean isAdult(int age) { 
    boolean overEighteen = false; 
    if (i > 18) { 
    overEighteen = true; 
    } 
    return overEighteen; 
} 

public boolean isAdultComplex(int age) { 
    boolean overEighteen = false; // not used, but keeping methods identical 
    if (i > 18) { 
    return true; 
    } 
    return false; 
} 

:

는 이러한 두 가지 방법을 고려 . 그러나 두 번째 출구는 두 개의 출구 지점을 가짐으로써 확실히 더 복잡합니다.

이 문제는 이와 같은 짧은 방법에서 자주 발생하지 않지만 150 라인 방법으로 조기에 반환한다고 상상해보십시오. 정신적으로 따르기가 훨씬 더 어려워집니다.

+0

초기 리턴을 대체하지 않으면 추가 최종 변수가 될 수 있습니다. 150 줄의 몬스터는 더 심해질 수 있습니다. 그러나 40 개가 넘는 코드가 코드 검토를 통과하여 커밋 될 수는 없다고 상상해보십시오. 문제는 사라졌습니다. – maaartinus

0

참고로이 토론은 https://jira.codehaus.org/browse/SONARJAVA-75과 관련됩니다. 나는 당분간 SonarQube에 의해보고 된 복잡성이 "순환 복잡성"과 "필수 복잡성"을 혼합한다는 것을 확인합니다.

관련 문제