Я только начал работать с PHPUnit и его красочными отчетами о покрытии кода. Я понимаю, что все цифры и проценты сохраняют один: индекс CRAP. Может ли кто-нибудь предложить мне обоснованное объяснение того, что это значит, как его анализировать и как его снизить?
@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, в результате чего получается такой график:
(Вы можете получить файл .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%, а после этого реорганизуйте методы уменьшения циклической сложности. Вы можете попробовать провести рефакторинг перед тестированием, но в зависимости от конкретной сложности метода вы рискуете ввести поломку, если не можете объяснить (из-за сложности) все последствия изменения, которое вы делаете.