내가 쓴대로 이것에 대한 몇 가지 언급 ...
구체적으로, M = E-N + 2P의 Wikipedia 방정식에 대해
그 방정식은 매우 잘못되었습니다 .
어떤 이유로 McCabe는 실제로 자신의 논문 ( "복잡성 측정", IEEE 공학 소프트웨어 공학, Vo .. SE-2, No.4, 1976 년 12 월)에 그것을 사용하지만, 정당화하지 않고 실제로 올바른 인용을 한 후에 첫 번째 페이지의 수식
v (G) = e-v + p
(여기서 수식 요소의 레이블이 변경되었습니다)
특히 McCabe는 C.Berge, Graphs 및 Hypergraphs (아래에서 G & HG로 약칭) 라는 책을 참조합니다 . 그 책에서 직접 :
정의 (G & HG의 27 페이지 하단) :
(방향이 지정되지 않은) 그래프 G의 순환 수 v (G) (연결이 끊긴 구성 요소가 여러 개있을 수 있음)는 다음과 같이 정의됩니다.
v (G) = e-v + p
여기서 e = 모서리 수, v = 꼭지점 수, p = 연결된 구성 요소 수
정리 (29 페이지의 G & HG 상단) (McCave에서는 사용되지 않음) :
그래프 G의 순환 수 v (G)는 최대 독립 사이클 수와 같습니다.
사이클 시작 그래프에서 서로 인접한 시퀀스에서 각각 두 개의 연속 정점과 동일한 정점에서 종료 정점의 서열이다.
직관적으로, 보행을 중첩하여 다른 사이클에서 사이클을 구성 할 수없는 경우 사이클 세트 는 독립적 입니다.
정리 (G & HG의 29 페이지 중간) (Mcabe에서 사용) :
강하게 연결된 그래프 G에서 사이클로 매틱 수는 선형 독립 회로의 최대 수와 같습니다.
회로는 허용 정점과 가장자리없이 반복과 순환이다.
지정된 방향으로 가장자리를 통과하여 다른 모든 정점에서 모든 정점에 도달 할 수 있으면 방향 그래프가 강력하게 연결 된다고합니다 .
여기서 우리는 무 방향 그래프 에서 강하게 연결된 그래프 로 전달했습니다 (이것은 ... Berge가 이것을 완전히 명확하게하지는 않습니다)
McCabe는 이제 위 정리를 적용하여 "McCabe Cyclomatic Complexity Number"(CCN)를 계산하는 간단한 방법을 도출합니다.
프로 시저의 "점프 토폴로지"를 나타내는 지시 그래프 (명령 흐름 그래프)가 주어지면, 고유 한 진입 점 을 나타내는 지정된 정점과 고유 한 종료점을 나타내는 지정된 정점이 있습니다 (출구 점 정점은 "구성되어야"할 수 있습니다. 여러 반환의 경우 추가)) 종료점 정점에서 시작점 정점으로 향한 가장자리를 추가하여 다른 정점에서 진입 점 정점에 도달 할 수 있도록하여 강하게 연결된 그래프를 만듭니다.
McCabe는 수정 된 명령 흐름 그래프의 순환적인 숫자가 "최소한의 경로 수"라는 직관적 인 개념에 부합한다는 점을 혼란스럽게 생각합니다. 따라서 우리는 그 숫자를 복잡성 척도로 사용해야합니다.
멋지다.
수정 된 명령 흐름 그래프의 순환 복잡도 수는 무 방향 그래프에서 "가장 작은"회로를 계산하여 확인할 수 있습니다. 이것은 사람이나 기계에 의해 특히 어렵지 않지만 위의 정리를 적용하면 더 쉽게 결정할 수 있습니다.
v (G) = e-v + p
가장자리의 방향성을 무시하는 경우
모든 경우에 우리는 단일 절차 만 고려하므로 전체 그래프에는 연결된 구성 요소가 하나뿐입니다.
v (G) = e-v + 1.
"exit-to-entry"edge가 추가되지 않은 원래 그래프 를 고려 하면 다음과 같이 간단하게 얻을 수 있습니다.
ṽ (G) = ẽ-v + 2
ẽ = e-1로
그의 논문에서 McCabe의 예를 사용하여 설명해 보겠습니다.
여기에 우리가 있습니다 :
- e = 10
- v = 6
- p = 1 (하나의 구성 요소)
- v (G) = 5 (5 사이클을 명확하게 세고 있음)
순환 수에 대한 공식은 다음과 같습니다.
v (G) = e-v + p
이것은 5 = 10-6 + 1을 산출하므로 정확합니다!
그의 논문에 주어진 "McCabe 순환 복잡도 수"는
5 = 9-6 + 2 (어떻게 논문에 대한 자세한 설명은 없습니다)
이것은 정확하지만 (v (G)를 산출합니다) 잘못된 이유로 인해 사용됩니다.
ṽ (G) = ẽ-v + 2
따라서 ṽ (G) = v (G) ... 휴!
하지만이 방법이 좋은가요?
두 단어로 :별로
- 특히 예외 처리 및 재귀가 그림에 들어간 경우 절차의 "명령 흐름 그래프"를 설정하는 방법이 완전히 명확하지 않습니다. McCabe는 그의 아이디어를 재귀, 예외 및 간단한 실행 구조가없는 언어 인 FORTRAN 66으로 작성된 코드에 적용했습니다 .
- 결정이있는 절차와 루프가있는 절차가 동일한 CCN을 생성한다는 사실은 좋은 신호가 아닙니다.