Как читать / улучшать CRAP-индекс, вычисляемый PHP

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

Related of "Как читать / улучшать CRAP-индекс, вычисляемый PHP"

@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 )

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

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

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

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

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

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

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

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