문제

나는 큰 코드 기반의 순환적 복잡성을 측정하면서 놀았습니다.

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

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

순환복잡도를 사용하시나요?당신이 찾은 가장 복잡한 코드는 무엇입니까?

도움이 되었습니까?

해결책

우리는 무자비하게 리팩터링하고 '적중 목록'에서 코드를 얻는 메트릭 중 하나로 사이클 성 복잡성을 사용합니다. 1-6 우리는 복잡성을 위해 깃발을 내지 않습니다 (다른 이유로 의문을 제기 할 수는 있지만) 7-9는 의문의 여지가 있으며, 10을 초과하는 방법은 달리 입증되지 않으면 나쁘다고 가정합니다.

우리가 본 최악의 것은 우리가 인수해야 할 일부 레거시 코드에서 괴물 같은 if-else-IF 체인에서 87이었습니다.

다른 팁

실제로, 순환 복잡성은 단지 방법 수준 임계 값을 넘어 사용할 수 있습니다. 우선, 복잡성이 높은 하나의 큰 방법은 복잡성이 낮은 몇 가지 작은 방법으로 나눌 수 있습니다. 그러나 코드베이스를 실제로 개선 했습니까? 물론, 당신은 모든 메소드 이름으로 다소 더 나은 가독성을 얻을 수 있습니다. 그러나 총 조건부 논리는 변경되지 않았습니다. 그리고 총 조건부 논리는 종종 조건부를 다형성으로 대체합니다.

단순한 방법 분해로 녹색으로 변하지 않는 메트릭이 필요합니다. 나는 이것을 부른다 CC100.

CC100 = 100 * (코드베이스의 총 사이클로 더 복잡성) / (총 코드 라인)

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

LOC와 같은 단순한 측정 항목은 적어도 대부분의 경우에 좋다고 생각합니다. 함수가 한 화면에 맞지 않으면 거의 간단한 점이 중요하지 않습니다. 함수가 20 개의 매개 변수를 사용하고 40 개의 로컬 변수를 만드는 경우, 사이클로틱 복잡성이 1인지는 중요하지 않습니다.

우리는 최근에 그것을 사용하기 시작했습니다. 우리는 ndepend를 사용하여 일부 정적 코드 분석을 수행하며 사이클로 더 복잡성을 측정합니다. 나는 리팩토링을위한 방법을 식별하는 괜찮은 방법이라는 데 동의합니다.

안타깝게도, 우리는 개발자들이 해외에서 만든 일부 방법에 대해 #의 200 이상을 보았습니다.

C ++ 템플릿 및 메타 프로그래밍 기술과 잘 어울릴 수있는 도구가있을 때까지 내 상황에 큰 도움이되지 않습니다. 어쨌든 기억하십시오

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

따라서 인간 필터링을 통해이 유형의 정보를 전달해야합니다.

당신은 그것을 볼 때 복잡성을 알게 될 것입니다. 이런 종류의 도구가 유용한 주요 사항은주의를 피한 코드의 일부를 표시하는 것입니다.

나는 종종 내 코드의 순환 복잡성을 측정합니다. 너무 많은 일을하는 코드 영역을 발견하는 데 도움이된다는 것을 알았습니다. 도구를 사용하면 내 코드의 핫스팟을 지적하는 것은 SRP를 따르지 않는 메소드를 알아 내려고 수천 개의 코드 라인을 읽는 것보다 시간이 훨씬 적습니다.

그러나 나는 다른 사람들의 코드에 대해 사이클로 더 복잡성 분석을 할 때 100 년대에 사이클로틱 한 복잡성을 가진 코드를 찾을 때 일반적으로 좌절감, 분노 및 일반적인 분노로 이어진다는 것을 발견했습니다. 사람들이 수천 줄의 코드가있는 방법을 작성하도록 강요하는 것은 무엇입니까?!

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

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

나는 한동안 그것을 사용하지 않았지만 이전 프로젝트에서는 누군가 Elses 코드에서 잠재적 인 문제 지점을 식별하는 데 실제로 도움이되었습니다 (물론 내 것이 아닐 것입니다!)

체크 아웃해야 할 지역을 찾았을 때, 나는 논리와 정말 이상한 WTF 코드로 수치적인 문제 (많은 Gotos가 믿을 것입니다!)를 빨리 발견했습니다.

순환 복잡성은 아마도 많은 일을하는 영역을 보여주기 때문에 단일 책임이있는 프린 니 칼을 깨뜨리는 데 좋습니다. 이상적으로는 뮬리플 기능으로 나뉩니다.

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

kenj0418의 히트 목록 값은 +1입니다.

제가 본 것 중 최악은 275였습니다.훨씬 더 작은 CC로 리팩터링할 수 있었던 200개가 넘는 다른 CC도 몇 개 있었습니다.그들은 여전히 ​​​​높았지만 줄을 더 뒤로 밀었습니다.우리는 275라는 짐승에 대해 별로 운이 없었습니다. 그것은 (아마도 여전히 그렇습니다) 너무 복잡한 if 문과 스위치 문으로 구성된 웹이었습니다.실제 가치는 시스템을 재구축하기로 결정할 때 단계별로 수행하는 것입니다.

내가 편안하게 생각하는 높은 CC의 예외는 공장이었습니다.IMO에서는 CC가 높아야 하지만 간단한 객체 생성 및 반환만 수행하는 경우에만 해당됩니다.

후에 이해 그 의미는 이제 "시험"기준으로 사용하기 시작했습니다. 지금까지 나는 보통 높은 CC가 화살표 안티 패턴, 코드를 읽고 이해하기가 더 어려워집니다. 아직 고정 된 숫자는 없지만 NDEPENT는 5 이상의 모든 것에 대해 경고하고 있으며, 이는 방법을 조사하기에 좋은 시작처럼 보입니다.

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

사이클로틱 복잡성은 제작 된 복잡성이라고 할 수있는 것 중 하나 일뿐입니다. 얼마 전, 나는 몇 가지 차원의 코드 복잡성을 요약하기 위해 기사를 썼습니다.제작 된 복잡성과 싸우고 있습니다

코드 복잡성을 처리하는 데 효율적이어야합니다. 도구 ndepend .NET 코드의 경우 Cyclomatic Complexity, Nesting Depth, 메서드 응집력 부족, 테스트에 의한 적용 범위와 같은 코드 메트릭을 포함하여 코드 복잡성의 많은 차원을 분석 할 수 있습니다.

의존성 분석 및 언어 포함 (코드 쿼리 언어) 내 코드의 복잡한 것은 무엇입니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top