Cyclomatic Complexity은 주어진 함수가 얼마나 어려운지 또는 버그가있는 가능성을 대략적으로 보여줍니다. 내가 읽은 구현에서 보통 모든 기본적인 제어 흐름 구조 (if, case, while, for 등)는 함수의 복잡성을 1 씩 증가시킵니다. 순환 적 복잡성은 다음을 결정하기위한 것입니다. 가상 함수가 호출하는 "프로그램의 소스 코드를 통한 선형 적으로 독립적 인 경로의 수"는 런타임에 구현이 호출되는 모호성 때문에 함수의 순환 적 복잡성을 증가시켜야합니다 (호출은 경로의 다른 분기를 만듭니다). 실행).가상 함수 호출의 순환 복잡성은 무엇입니까?
그러나 동등한 switch 문 (각 'case'키워드마다 하나의 점, 문제의 가상 함수를 구현하는 계층의 모든 클래스에 대해 하나의 대소 문자가 포함 된 경우)와 동일한 양만큼 불이익을주는 경우, 가상 함수 호출이 일반적으로 더 나은 프로그래밍 실습으로 간주되기 때문에 지나치게 가혹합니다.
가상 함수 호출의 순환 복잡성의 비용은 어떻게해야합니까? 내 추론이 가상 함수의 사용 또는 다른 것에 대한 메트릭 또는 하나로서 순환 복잡성의 유용성에 대한 논쟁인지는 확실하지 않습니다.
편집 : 사람들의 반응 후에 대규모 스위치 문을 포함하는 전역 함수 호출과 동일한 가상 함수 호출을 고려할 수 있으므로 순환 적 복잡성을 추가해서는 안된다는 것을 깨달았습니다. 이 함수는 나쁜 점수를 얻지 만 프로그램에 한 번만 존재하지만 각 가상 함수 호출을 switch 문으로 직접 바꾸면 여러 번 비용이 발생합니다.
IMO는 기본적으로 프로그램이하는 일을 이해하는 것이 얼마나 어려운지를 측정하는 "글로벌 복잡성"과 기본적으로 테스트를 작성하는 것이 얼마나 어려운지를 측정하는 "로컬 복잡성"의 차이점에 대한 훌륭한 예를 지적합니다 모든 정의 된 방법에 대한 적용 범위.소프트웨어 프로젝트가 성장함에 따라 이러한 복잡성에 대한 개념이 수렴되는 경향이있을 것이라고 기대하지만, 소규모 코드베이스의 경우 순환 적 복잡성과 같은 메트릭에 기반한 모범 사례는 "글로벌 복잡성"(즉, 가상 기능)에 찬성하고 "로컬 복잡성"(즉, "스위치"). – Peter
이 질문에 대한 답은 switch 문보다는 좋지 않은 것으로 표시해야한다고 생각합니다. 격리 된 모듈에서 다형성 호출을 고려할 때 실제로 무한대의 스위치이기 때문입니다 (파생 클래스가 무엇인지 전혀 알지 못합니다. 실제로있을 수 있습니다). 전체 프로그램 지식의 관점에서 볼 때 스위치로 간주되어야합니다. 이 메트릭에서 *와 동등하다고 생각하기 때문에 다른 메트릭 (원하는 효과를 얻기 위해 변경해야하는 줄 수, 다형성이 이길 수 있음)와 함께 코드의 품질을 평가할 수 없다는 것을 의미하지는 않습니다. –