IT이야기

순환 복잡성이 유용한 측정

cyworld 2021. 3. 25. 21:39
반응형

순환 복잡성이 유용한 측정이라고 생각합니까?


저는 큰 코드베이스의 순환 적 복잡성을 측정하면서 놀았습니다.

순환 복잡성은 프로그램의 소스 코드를 통한 선형 독립 경로의 수이며 선택한 언어에 대한 많은 무료 도구가 있습니다.

결과는 흥미롭지 만 놀라운 것은 아닙니다. 즉, 내가 가장 털이 많은 것으로 알고있는 부분은 실제로 가장 복잡했습니다 (평점> 50). 그러나 내가 유용하다고 생각하는 것은 리팩토링을 시작할 위치를 결정할 때 지적 할 수있는 구체적인 "불량"번호가 각 메소드에 할당된다는 것입니다.

순환 복잡도를 사용합니까? 가장 복잡한 코드는 무엇입니까?


우리는 무자비하게 리팩토링하고 '적중 목록'에 코드를 가져 오는 지표 중 하나로 Cyclomatic 복잡성을 사용합니다. 1-6 우리는 복잡성에 대해 플래그를 지정하지 않습니다 (다른 이유로 질문을받을 수 있음), 7-9는 의심스럽고 10 이상의 방법은 달리 입증되지 않는 한 나쁜 것으로 간주됩니다.

우리가 본 최악의 경우는 우리가 인수해야하는 일부 레거시 코드에서 괴물 if-else-if 체인의 87 개였습니다.


실제로 순환 적 복잡성은 단순한 방법 수준 임계 값 이상으로 사용될 수 있습니다. 우선, 복잡성이 높은 하나의 큰 방법을 복잡성이 낮은 여러 개의 작은 방법으로 나눌 수 있습니다. 하지만 실제로 코드베이스를 개선 했습니까? 물론 모든 메소드 이름으로 가독성이 다소 향상 될 수 있습니다. 그러나 전체 조건부 논리는 변경되지 않았습니다. 그리고 조건부 논리 를 다형성 으로 대체 하여 전체 조건부 논리를 줄일 수 있습니다 .

단순한 메서드 분해로 녹색으로 변하지 않는 메트릭이 필요합니다. 저는 이것을 CC100 이라고 부릅니다 .

CC100 = 100 * (코드베이스의 전체 순환 복잡도) / (전체 코드 라인)


big-O가 유용한 것과 같은 방식으로 나에게 유용합니다. 저는 그것이 무엇인지 알고 있으며, 방법이 좋은지 나쁜지에 대한 직감을 얻는 데 사용할 수 있지만 매번 계산할 필요는 없습니다. 내가 작성한 기능.

LOC와 같은 더 간단한 메트릭은 적어도 대부분의 경우에 적합하다고 생각합니다. 기능이 한 화면에 맞지 않으면 그것이 얼마나 단순한지는 거의 중요하지 않습니다. 함수가 20 개의 매개 변수를 취하고 40 개의 로컬 변수를 만드는 경우 순환 복잡성이 1인지는 중요하지 않습니다.


우리는 최근에 그것을 사용하기 시작했습니다. NDepend를 사용하여 정적 코드 분석을 수행하고 순환 복잡성을 측정합니다. 리팩토링 방법을 식별하는 적절한 방법이라는 데 동의합니다.

안타깝게도 해외 개발자가 만든 일부 메서드에 대해 #이 200 이상인 것을 보았습니다.


C ++ 템플릿과 메타 프로그래밍 기술과 잘 작동 할 수있는 도구가 있기 전까지는 제 상황에서별로 도움이되지 않습니다. 어쨌든 그냥 기억해

"모든 것을 측정 할 수있는 것은 아니며 측정 할 수있는 모든 것을 측정 할 수있는 것은 아닙니다."아인슈타인

따라서 이러한 유형의 정보는 사람 필터링을 통해서도 전달해야합니다.


당신이 그것을 볼 때 복잡성을 알게 될 것입니다. 이러한 종류의 도구가 유용한 가장 중요한 것은주의를 피하는 코드 부분에 플래그를 지정하는 것입니다.


나는 자주 내 코드의 순환 적 복잡성을 측정합니다. 너무 많은 작업을 수행하는 코드 영역을 찾는 데 도움이된다는 것을 알았습니다. 도구가 내 코드의 핫스팟을 지적하는 것은 SRP를 따르지 않는 메소드를 파악하기 위해 수천 줄의 코드를 읽어야하는 것보다 훨씬 적은 시간이 소요됩니다.

그러나 다른 사람들의 코드에 대해 순환 복잡도 분석을 할 때 일반적으로 100 년대 순환 복잡도를 가진 코드를 발견하면 좌절감, 불안감, 일반 분노를 느끼게됩니다. 사람들이 수천 줄의 코드가있는 메서드를 작성하도록하는 이유는 무엇입니까?!


리팩토링 후보를 식별하는 데 도움이되지만 판단을 계속 유지하는 것이 중요합니다. 나는 가지 치기 가이드를 위해 kenj0418의 범위를 지원할 것입니다.


순환 적 복잡성과 JUnit 테스트 범위를 경험적으로 결합하여 단일 메트릭을 만드는 CRAP4J 라는 Java 메트릭이 있습니다 . 그는 경험적 공식을 개선하기 위해 연구를하고 있습니다. 얼마나 널리 퍼져 있는지 잘 모르겠습니다.


나는 한동안 그것을 사용하지 않았지만 이전 프로젝트에서는 다른 사람의 코드에서 잠재적 인 문제 지점을 식별하는 데 정말로 도움이되었습니다 (물론 내 것이 아닙니다!)

체크 아웃 할 지역을 찾았을 때, 나는 논리와 정말 이상한 WTF 코드로 수많은 문제 (또한 많은 GOTOS를 믿으 실 것입니다!)를 빠르게 발견했습니다.

순환 적 복잡성은 아마도 많은 일을하고있는 영역을 보여 주므로 단일 책임 원칙을 깨뜨릴 수 있습니다. 이상적으로는 여러 기능으로 분리되어야합니다.


나는 이와 같은 측정 항목을 가장 선호하는 프로젝트의 언어 인 LPC 에 대해 실제로 사용할 수있는 무료 도구가 많지 않은 것이 두렵 습니다. 그래서 아니, 나에게 그렇게 유용하지 않습니다.


kenj0418의 적중 목록 값에 +1.

내가 본 최악의 것은 275였다. 200 개가 넘는 다른 두 개가 우리가 훨씬 더 작은 CC로 리팩토링 할 수 있었다. 그들은 여전히 ​​높았지만 그로 인해 더 뒤로 밀려났습니다. 우리는 275 야수에 대해 많은 운이 없었습니다. 그것은 너무 복잡한 if- 및 switch- 문의 웹이었습니다. 실제 가치는 그들이 시스템을 재 구축하기로 결정했을 때 단계적으로 수행하는 것입니다.

내가 편한 높은 CC에 대한 예외는 공장이었다. IMO, 그들은 높은 CC를 가져야하지만 단순한 객체 생성과 반환을하는 경우에만 가능합니다.


그것이 의미 하는 바를 이해 한 후에 나는 이제 "시험"기반으로 사용하기 시작했습니다. 일반적으로 높은 CC는 Arrow Anti-Pattern 과 함께 사용되어 코드를 읽고 이해하기 어렵 기 때문에 지금까지 유용하다고 생각했습니다 . 아직 고정 된 숫자는 없지만 NDepend는 5 이상의 모든 항목에 대해 경고하므로 방법을 조사하기 좋은 시작 인 것 같습니다.


예, 우리는 그것을 사용하고 나도 유용하다는 것을 알았습니다. 우리는 길들일 큰 레거시 코드 기반을 가지고 있으며 높은 순환 복잡성을 알 수 있습니다. (한 가지 방법으로 387!). CC는 리팩토링 할 가치가있는 영역을 직접 가리 킵니다. 우리는 C ++ 코드에서 CCCC를 사용합니다.


Cyclomatic Complexity는 Fabricated Complexity라고 할 수있는 구성 요소 중 하나 일뿐입니다. : 얼마 뒤로, 나는 코드의 복잡성의 여러 차원을 요약하는 기사를 썼다 날조 된 복잡성 싸움을

코드 복잡성을 효율적으로 처리하려면 도구가 필요합니다. .NET 코드 용 NDepend 도구 를 사용하면 순환 복잡성, 중첩 깊이, 메서드 응집력 부족, 테스트 별 범위 등과 같은 코드 메트릭을 포함하여 코드 복잡성의 여러 차원을 분석 할 수 있습니다.

종속성 분석을 포함하고 질문 전용 언어 ( Code Query Language )를 포함하여 내 코드에서 복잡한 것은 무엇이며 규칙을 작성합니까?

참조 URL : https://stackoverflow.com/questions/745857/do-you-find-cyclomatic-complexity-a-useful-measure

반응형