16 개가 넘는 팔각형의 NPath 복잡성이 현실적입니까? 아니면 도구를 깨뜨 렸습니까?


13

방금 PHPMD ( http://phpmd.org/ )를 사용하여 큰 PHP 코드 (1153 줄)를 측정 했으며 코드의 NPath 복잡도가 16244818757303403077832757824라고 알려줍니다.

그것은 나에게 엄청나게 큰 숫자처럼 보이며, 아마도 PHPMD가 어떤 식 으로든 고장 났음을 암시합니다. 인간이 작성한 코드 조각으로 인해 NPath 복잡성이 높아질 수 있습니까? 순환 복잡도는 351입니다.

두 가지 중요한 세부 정보-

  1. 이것은 절차 코드이며 HTML과 혼합되어 있으며 PHPMD는 객체 지향 코드 만 측정합니다. 이 문제를 해결하기 위해 전체 파일을 단일 함수로 클래스에 래핑했습니다. 이것은 사용 방법을 나타냅니다.

  2. 이 파일은 일련의 중첩 된 switch 문으로 구성되며 많은 if..else 문이 포함되어 있으므로 상당히 복잡합니다.

편집하다

PHPMD가 나에게 거짓말하고 있는지에 대해 의문의 여지가 없음을 분명히하고 싶습니다. 코드가 엉망이라는 것을 알고 있습니다. 코드가 실제로 그렇게 나쁠 수 있는지 궁금합니다. 대답은 '예'인 것처럼 보입니다. 매우 가능합니다.


2
도구를 깨뜨 렸는지 모르겠지만 # 2는 코드가 약간 리팩터링 될 수 있음을 나타냅니다.
LindaJeanne

1
@LindaJeanne 동의합니다. 나는 그것이 얼마나 엉망 인지 정확히 궁금하다 .
Jez

2
워드 프레스는 ' WP_Query::get_posts()했다 1.435 Quindecillion의 NPath 복잡성을 ... 그것은 더 악화 요즘 2013 년
FUXIA

@toscho 그것이 제가 가장 좋아하는 정보입니다. 감사!
Jez

답변:


24

이것은 전적으로 가능합니다. 각각 10 개의 케이스로 구성된 35 개의 스위치 케이스 구성이 있다고 가정 해 봅시다. 각 스위치가 차례로 발생할 때 350의 대략적인 순환 복잡도를 제공합니다. 첫 번째 스위치는 10 개의 경로를 제공합니다. 두 번째 스위치는 또 다른 독립적 인 10 개의 경로를 제공하므로 여기까지 10 · 10 개의 경로가 있습니다. 세 번째 스위치를 사용하면 10 · 10 · 10 = 10³ 경로를 얻을 수 있으며 총 10 35 개의 경로를 얻을 수 있습니다 . 이것은 1.6 · 10 28 경로 의 결과보다 훨씬 높으며 , 이는 아마도 다른 분기 요인과 코드를 통한 경로 수를 줄이는 중첩 된 제어 흐름 문 때문일 수 있습니다.

주어진 순환 복잡성 c에 대한 최악의 시나리오로서, 우리는 코드를 통해 최대 2 개의 c 순환 경로를 가질 수 있습니다 (여기서는 2 351 = 4.6 · 10 105 ).

이 툴의 판단은 명확합니다. 다루고있는 코드는 복잡하고 테스트 할 수없고 유지 관리 할 수없는 혼란입니다. 더 작고 독립적 인 기능으로 나누고 반복을 추상화하는 것을 고려하십시오. 예를 들어 HTML 생성을 PHP 스크립트의 주요 논리와 분리 할 수 ​​있습니다.


14
분석해 주셔서 감사합니다. 나는 그것이 코드 가 아니라는 것을 지적 할 필요가 있다고 생각 하지만, 종종 그렇듯이 내 문제가 나타납니다.
Jez

1
@Jez, 그것이 위안이라면 당신은 독특한 위치에 있지 않습니다.
Daniel Hollinrake

5

이 설명 에 따르면 , NPath 복잡성은 순환 복잡성에서 지수 적입니다.

간단한 if 문을 사용하면 이러한 문 중 두 개가있는 경우 두 문 조건에 대해 가능한 네 가지 가능한 true / false 조합에 해당하는 코드를 통해 기본적으로 4 개의 경로입니다. 다른 if 문을 추가하면 8이됩니다.

다시 말해, 모든 순환 및 NPath 복잡성이 긴 if 문 목록에서 나온 경우에는 등식이됩니다 NPath = 2^cyclomatic. 이 수치를 2 ^ 351 = 4.6 * 10 ^ 105와 비교하면보고 한 NPath 복잡성보다 훨씬 높습니다.

실제로 불가능한 경로 계산을 피하기 위해 PHPMD가 얼마나 많은지 모르겠습니다 (예 : 두 개의 상호 배타적 인 조건은 모두 true로 평가). 아마도 수동 분석은 많은 경로가 실제로 불가능하다는 것을 보여 주므로 코드는 NPath 메트릭을 팽창시키는 방식으로 작성됩니다. 위의 내용을 계속하려면 if 문 목록이 351 개인데 실제로 입력 된 항목이 하나만 있는지 확인할 수 있으면 if ... else 문으로 변경하여 NPath 복잡성을 4.6 * 10에서 낮출 수 있습니다. ^ 105에서 353.

그러나 귀하의 질문에있는 정보만으로, 그러한 종류의 단순화가 PHPMD에 의해 수행 될 수 있거나 이미 수행되고 있는지 알지 못하면 숫자는 현실적으로 보입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.