2013-03-18 1 views
3

동일한 기능을 수행하기 위해 서로 다른 코드를 사용하여 동일한 방식으로 동작하는 다음 세 가지 기능을 고려하십시오 (예제는 JavaScript로 작성되었으며 JavaScript에 적용된 답변에 특히 관심이 있습니다). 가을 한,논리적으로 비슷한 코드의 순환 적 복잡성

// Random number from 0-9 
var x = Math.floor(Math.random() * 10); 

// JSHint reports a cyclomatic complexity of 3 
function a() { 
    if (x === 0) { 
     return "First"; 
    } else if (x === 1 || x === 2) { 
     return "Second"; 
    } 
    return "Third"; 
} 

// JSHint reports a cyclomatic complexity of 4 
function b() { 
    switch (x) { 
    case 0: 
     return "First"; 
    case 1: 
    case 2: 
     return "Second"; 
    default: 
     return "Third"; 
    } 
} 

// JSHint reports a cyclomatic complexity of 1 
function c() { 
    return x === 0 ? "First" : x === 1 || x === 2 ? "Second" : "Third"; 
} 

// All three functions return the same value 
console.log(a(), b(), c()); 

JSComplexity 도구는 || 사업자가 독립적 인 지점으로 처리됩니다 수단 (4)의 복잡성을,이 모든 세 가지 기능을보고합니다,하지만이 질문은 정말 비슷한 구조를 가진 모든 언어)에 적용 할 수 -case 문. JSHint는 || 연산자에 대해 신경 쓰지 않는 것처럼 보이지만 동일한 방식으로 오류 메시지 case을 처리합니다. 조건부 연산자가 완전히 잘못된 것 같습니다.

순환 복잡성을 계산할 때 case 문과 논리적 "or"연산자가 독립 분기로 처리되어야합니까? 삼항 조건문은 어떻습니까 (이 경우는 더 간단하고 JSHint는 분명히 잘못되었다고 생각합니다)? 위의 세 가지 기능 모두 동일한 순환주기 복잡성을 가져야합니까?

+0

참고로, JSHint 지금 4 – JLRishe

답변

7

순환 적 복잡도는 코드를 통과하는 선형 적으로 독립적 인 경로의 수입니다. 내림차순으로 case이 빠르지 만 분명히 다른 경로라고 생각합니다. 따라서 질문은 ||이 새 분기를 도입하는지 여부입니다.

저는 소리내어 생각하고 있습니다 만, JavaScript가 조건문에 대한 단락 회로 평가를 수행하기 때문에 실제로 분리에서 두 개의 분기를 얻는다고 생각합니다. 그들 중 두 사람은 동일한 기능을 수행하더라도 4 가지가 있습니다

function a() { 
    if (x === 0) { 
     return "First"; 
    } else if (x === 1) { 
     return "Second"; 
    } else if (x === 2) { 
     return "Second"; 
    } else { 
     return "Third"; 
    } 
} 

..., : 예를 들어, a 기능은 동일합니다. (즉, 꼭지점이 아닌 모서리에 대한 선형 독립). 그러나 JS가 단락 평가를 수행하지 않으면 x === 1 || x === 2이 단지 하나의 분기를 호출하는 경향이 있습니다.

따라서, 귀하의 질문에 대답하기 위해, 나는 당신의 모든 기능 세 가지가 동일한 된 Cyclomatic 복잡성이해야한다고 생각 : 4.

+0

하나의 복잡성을 가지고 이러한 기능의 세 가지를 모두보고를 감사합니다. 나는 이것에 동의합니다. 세 함수 모두 4의 동일한 복잡성을 가져야합니다. JSHint에 필요한 버그 수정이 있습니다. 나는이 대답을 받아들이 기 전에 잠깐 기다려야 할 것이다. 거기에 다른 의견이 있으면 추가 답변을 장려하라. –