2

Cyclomatic Complexity은 주어진 함수가 얼마나 어려운지 또는 버그가있는 가능성을 대략적으로 보여줍니다. 내가 읽은 구현에서 보통 모든 기본적인 제어 흐름 구조 (if, case, while, for 등)는 함수의 복잡성을 1 씩 증가시킵니다. 순환 적 복잡성은 다음을 결정하기위한 것입니다. 가상 함수가 호출하는 "프로그램의 소스 코드를 통한 선형 적으로 독립적 인 경로의 수"는 런타임에 구현이 호출되는 모호성 때문에 함수의 순환 적 복잡성을 증가시켜야합니다 (호출은 경로의 다른 분기를 만듭니다). 실행).가상 함수 호출의 순환 복잡성은 무엇입니까?

그러나 동등한 switch 문 (각 'case'키워드마다 하나의 점, 문제의 가상 함수를 구현하는 계층의 모든 클래스에 대해 하나의 대소 문자가 포함 된 경우)와 동일한 양만큼 불이익을주는 경우, 가상 함수 호출이 일반적으로 더 나은 프로그래밍 실습으로 간주되기 때문에 지나치게 가혹합니다.

가상 함수 호출의 순환 복잡성의 비용은 어떻게해야합니까? 내 추론이 가상 함수의 사용 또는 다른 것에 대한 메트릭 또는 하나로서 순환 복잡성의 유용성에 대한 논쟁인지는 확실하지 않습니다.

편집 : 사람들의 반응 후에 대규모 스위치 문을 포함하는 전역 함수 호출과 동일한 가상 함수 호출을 고려할 수 있으므로 순환 적 복잡성을 추가해서는 안된다는 것을 깨달았습니다. 이 함수는 나쁜 점수를 얻지 만 프로그램에 한 번만 존재하지만 각 가상 함수 호출을 switch 문으로 직접 바꾸면 여러 번 비용이 발생합니다.

+1

IMO는 기본적으로 프로그램이하는 일을 이해하는 것이 얼마나 어려운지를 측정하는 "글로벌 복잡성"과 기본적으로 테스트를 작성하는 것이 얼마나 어려운지를 측정하는 "로컬 복잡성"의 차이점에 대한 훌륭한 예를 지적합니다 모든 정의 된 방법에 대한 적용 범위.소프트웨어 프로젝트가 성장함에 따라 이러한 복잡성에 대한 개념이 수렴되는 경향이있을 것이라고 기대하지만, 소규모 코드베이스의 경우 순환 적 복잡성과 같은 메트릭에 기반한 모범 사례는 "글로벌 복잡성"(즉, 가상 기능)에 찬성하고 "로컬 복잡성"(즉, "스위치"). – Peter

+0

이 질문에 대한 답은 switch 문보다는 좋지 않은 것으로 표시해야한다고 생각합니다. 격리 된 모듈에서 다형성 호출을 고려할 때 실제로 무한대의 스위치이기 때문입니다 (파생 클래스가 무엇인지 전혀 알지 못합니다. 실제로있을 수 있습니다). 전체 프로그램 지식의 관점에서 볼 때 스위치로 간주되어야합니다. 이 메트릭에서 *와 동등하다고 생각하기 때문에 다른 메트릭 (원하는 효과를 얻기 위해 변경해야하는 줄 수, 다형성이 이길 수 있음)와 함께 코드의 품질을 평가할 수 없다는 것을 의미하지는 않습니다. –

답변

5

일반적으로 순환 적 복잡성은 함수 호출 경계에 적용되지 않지만 함수 내부 메트릭입니다. 따라서 가상 호출은 가상이 아닌 정적 함수 호출 이상을 계산하지 않습니다.

2

가상 함수 호출은 함수 호출의 외부에 "구현이 불명확 함"이 있기 때문에 순환 복잡성을 증가시키지 않습니다. 객체 값이 설정되면 모호성이 없습니다. 우리는 정확히 어떤 방법이 호출 될지 안다.

BaseClass baseObj = null; 
// this part has multiple paths & add to CC 
if (x == y) 
    baseObj = new Derived1(); 
else 
    baseObj = new Derived2(); 

// this part has one path and does not add to the CC 
baseObj.virtualMethod1(); 
baseObj.virtualMethod2(); 
baseObj.virtualMethod3(); 
0

저는 순환 적 복잡성의 큰 팬이 아니지만,이 경우 함수를 호출하고 있습니다. 클래스 계층 디자인이 실제로 망가지기 전까지는 거의 동일한 작업을 수행하며, 호출에 따라 약간의 차이가 있습니다. 어떤 함수를 호출하면 전달하는 인수에 따라 다양한 동작을 얻을 수 있으며 이는 CC에서 계산되지 않습니다.

따라서 나는 그 비용을 완전히 무시했습니다.

+0

"클래스 계층 구조 디자인이 정말로 엉망이되지 않는 한 거의 비슷한 일을 할 것입니다. 호출에 따라 약간의 차이가 있습니다."- Barbara Liskov, 1987. –

1

가상 함수 때문에 구현이 런타임

아에 호출 될의 모호성,뿐만 아니라 기능의 복잡성을 증가해야 호출하지만, 모호하지 런타임에 (메타 프로그래밍/원숭이 패칭을하지 않는 한); 이것은 수신기의 유형/등급에 의해 완전히 결정됩니다.

관련 문제