Почему тернарный оператор более сложный, чем if/else?
Я тестирую свои библиотеки с помощью pdepend, а некоторые функции имеют невероятно высокую сложность. Я просто понял, что это исходит от тройного оператора, но я не уверен, почему.
С такой функцией, как:
function test($a) {
return $a > 10 ? 5:20;
}
pdepend возвращает сложность (npath) 5. Почему 5 разных путей? Я вижу только 2.
С такой функцией, как:
function test($a) {
if($a > 10)
return 5;
else
return 20;
}
Сложность npath равна 2. Что имеет смысл.
Изменить: Хорошо, я посмотрел на другой вопрос: PMD - сложность NPath очень высока с помощью тернарного оператора (?
Это часть алгоритма. Тем не менее, функция имеет только 2 возможных пути. Алгоритм для меня не имеет смысла. Число узлов не отражает количество путей, и оно произвольно добавляет 2 к значению.
Ответы
Ответ 1
Алгоритм, который pdepend использует для определения сложности, добавляет два для использования тернарного оператора, даже если они должны быть одинаковыми, поскольку он работает так же, как и else, и добавляет одинаковое количество путей. По моему опыту вы не должны видеть большую часть фактической разницы, если таковая имеется в фактическом приложении.
Ответ 2
Тернарный оператор создает копию значений, отличных от объекта. Значение, в вашем первом примере кода, $a
копируется, тогда результат возвращается. Источник. Во втором примере кода такая копия не производится.
Мое предположение заключается в том, что дополнительные пути связаны с созданием копии.
Другие ресурсы для просмотра:
http://fabien.potencier.org/article/48/the-php-ternary-operator-fast-or-not
https://drupal.org/node/1838368
http://www.mail-archive.com/[email protected]/msg51926.html