IT

PHP에 의해 계산된 C.R.A.P 인덱스를 읽거나 개선하는 방법

itgroup 2022. 10. 30. 21:11
반응형

PHP에 의해 계산된 C.R.A.P 인덱스를 읽거나 개선하는 방법

저는 이제 막 PPUnit과 그 다채로운 코드 커버리지 리포트에 대한 작업을 시작했습니다.1을 제외한 모든 숫자와 퍼센티지를 이해합니다.C.R.A.P 지수그 의미, 분석 방법, 낮추기 방법에 대해 누가 확실한 설명을 해줄 수 있나요?

@Toader Mihai는 확실한 설명을 했다.(+1)

낮추는 방법:

덜 복잡한 코드를 쓰거나 더 잘 테스트된 코드를 쓰십시오.(아래 그래프 참조)

테스트 완료 코드

이 문맥에서 이것은 단지 다음을 의미합니다.코드 커버리지가 높으면 일반적으로 더 많은 테스트를 작성할 수 있습니다.

덜 복잡한 코드?

예: 메서드를 작은 메서드로 리팩터링합니다.

// Complex
function doSomething() {
    if($a) {
        if($b) {
        }
        if($c) {
        }
    } else {
        if($b) {
        }
        if($c) {
        }
    }
}

// 3 less complex functions
function doSomething() {
    if($a) {
        doA();
    } else {
        doNotA();
    }
}

function doA() {
    if($b) {
    }
    if($c) {
    }
}

function doNotA() {
    if($b) {
    }
    if($c) {
    }
}

(단순한 예에 불과합니다.더 많은 자원을 찾을 수 있을 것입니다.)

기타 자원:

먼저 몇 가지 추가 리소스를 제공합니다.

크리에이터들이 쓰레기 색인에 대해 블로그에 글을 올린다.

혹시 모르니까사이클로매틱 복잡성이 설명되었습니다.PHP_CodeSniffer 및 PHPMD와 같은 툴은 알고 싶은 경우에 대비하여 이 번호를 알려줍니다.

그리고 어떤 숫자가 "OK"인지 결정하는 동안 자주 제안하는 숫자 중 하나(약간 높은 imho)는 30의 쓰레기 지수이며, 그 결과 다음과 같은 그래프가 생성됩니다.

alt 텍스트(.ods 파일은 https://www.dropbox.com/s/3bihb9thlp2fyg8/crap.ods?dl=1 에서 구할 수 있습니다).

기본적으로 방법의 변경 위험을 예측하고자 합니다.

여기에는 다음 두 가지 요소가 있습니다.

  • 메서드의 코드 복잡도(cyclomatic complexity) 일명 상기 방식에는 몇 개의 결정 경로가 존재하는지:comp(m).
  • (코드 커버리지 툴에 의해 제공되는 자동 테스트를 통해) 그 방법이 얼마나 테스트 가능한가.기본적으로 이것은 해당 코드의 몇 가지 결정을 자동으로 테스트할 수 있는지를 측정합니다.

방법의 적용범위가 변경위험보다 100%인 경우 방법의 복잡성과만 동등한 것으로 간주한다.C.R.A.P.(m) = comp(m).

메서드의 커버리지가 0%인 경우, 복잡도 측정에서 변경 위험이 2차 폴리 다항식으로 간주됩니다(이유는 코드 경로 변경을 테스트할 수 없는 경우 중단 위험이 증가한다는 것입니다). C.R.A.P.(m) = comp(m)^2 + comp(m)

이게 도움이 됐으면 좋겠네요.

제가 반쪽만 답한 것을 방금 알았습니다.지수의 논리를 이해한다면 그것을 개선하는 방법은 꽤 명확할 것이다.하지만 훨씬 더 명확한 설명은 @edior의 대답이다.

요약하자면, 거의 100% 커버리지를 확보할 때까지 쓰기 테스트를 수행한 후 사이클로매틱 복잡성을 줄이는 방법을 다시 생각해 보십시오.테스트를 실시하기 전에 재계수를 시도할 수 있지만, 실제 방법의 복잡성에 따라서는 변경의 모든 결과를 추론할 수 없는 경우에는 파손이 발생할 위험이 있습니다.

언급URL : https://stackoverflow.com/questions/4731774/how-to-read-improve-c-r-a-p-index-calculated-by-php

반응형