Почему тернарный оператор более сложный, чем 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