Подтвердить что ты не робот

Как читать/улучшать индекс C.R.A.P, вычисленный PHP

Я только начал работать с PHPUnit и его красочными отчетами о покрытии кода. Я понимаю, что все цифры и проценты сохраняют один: индекс C.R.A.P. Может ли кто-нибудь предложить мне обоснованное объяснение того, что это значит, как его анализировать и как его снизить?

4b9b3361

Ответ 1

@Toader Михай предложил подробное объяснение. (+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, скажут вам номер, если вы хотите знать.

И хотя вам нужно решить, какой номер "хорошо", часто предлагаемый номер (то есть litte high imho) является индексом дерьма 30, что приводит к следующему графику:

alt text (Здесь вы можете получить файл .ods: http://dl.dropbox.com/u/3615626/stackoverflow/crap.ods)

Ответ 2

В принципе, он хочет быть предиктором риска изменения метода.

В нем есть два фактора:

  • сложность кода метода (cyclomatic complexity) aka, сколько путей решений существует в указанном методе: comp(m).
  • насколько тестируемым является этот метод (посредством автоматических тестов, предоставляемых средством покрытия кода). В основном это измеряет, сколько решений в указанном коде автоматически проверяются.

Если метод имеет 100% -ный охват, а риск изменения считается эквивалентным только со сложностью метода: C.R.A.P.(m) = comp(m).

Если метод имеет 0% -ный охват, а риск изменения считается степенью полиномии второй степени в измерении сложности (рассуждение состоит в том, что если вы не можете проверить изменение кода, это увеличивает риск поломки): C.R.A.P.(m) = comp(m)^2 + comp(m)

Надеюсь, это поможет вам.

Я только заметил, что я предоставляю только половину ответа (прочитанная часть). Как улучшить это должно быть довольно ясно, если вы понимаете аргументацию индекса. Но гораздо более ясное объяснение дается в @edorian answer.

Краткая история: писать тесты, пока у вас не будет покрытия около 100%, а после этого реорганизуйте методы уменьшения циклической сложности. Вы можете попробовать провести рефакторинг перед тестированием, но в зависимости от конкретной сложности метода вы рискуете ввести поломку, если не можете объяснить (из-за сложности) все последствия изменения, которое вы делаете.