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