【问题标题】:Why is the ternary operator more complex than if/else?为什么三元运算符比 if/else 更复杂?
【发布时间】:2014-06-13 13:40:33
【问题描述】:

我正在使用 pdepend 测试我的库,并且某些函数的复杂性非常高。我刚刚意识到它来自三元运算符,但我不确定为什么。

具有如下功能:

  function test($a) {
        return $a > 10 ? 5:20;
  }

pdepend 返回 5 的复杂度(npath)。为什么有 5 个不同的路径?我只看到了 2 个。

具有如下功能:

   function test($a) {
      if($a > 10)
         return 5;
      else
         return 20;
   }

npath 复杂度为 2。这是有道理的。


编辑:好的,我看了另一个问题:PMD - NPath complexity very high with ternary operator (?

它是算法的一部分。不过,该函数只有 2 条可能的路径。该算法对我没有意义。节点数不反映路径数,任意加2。

【问题讨论】:

标签: php pdepend


【解决方案1】:

pdepend 用于确定复杂性的算法为使用三元运算符添加了两个,即使它们应该相同,因为它与 if else 的工作原理相同,并且添加了相同数量的路径。根据我的经验,如果在实际应用中有任何实际差异,您应该不会看到太多实际差异。

【讨论】:

  • 虽然它确实报告了“更复杂”,但我不同意复杂性应该相同的断言。该算法是这样的,它通过设计选择更高,因此必须针对而不是可能预期(或如果你/我是期望的话)作者:)。
  • 我认为对于它实际增加或应该增加程序的复杂性存在一些争论。你的观点是有效的。最后,如何解释信息完全取决于程序员。
【解决方案2】:

三元运算符复制非对象值。这意味着,在您的第一个代码示例中,$a 被复制然后返回结果。 Source。在第二个代码示例中,没有制作这样的副本。

那么,我的假设是,所涉及的额外路径来自制作副本。

要查看的其他资源:

http://fabien.potencier.org/article/48/the-php-ternary-operator-fast-or-not

https://drupal.org/node/1838368

http://www.mail-archive.com/internals@lists.php.net/msg51926.html

【讨论】:

  • 但是 pdepend 在确定指标时是否考虑到这一点? (也就是说,它可能是真的,但完全不相关。)
  • @user2864740 我不知道,我对 pdepend 不是很熟悉,但我可以推断,是的,考虑到 OP 的问题。这两个语句是相同的 - 除了使用三元执行的幕后复制过程。
  • 谢谢,我不知道副本。但是,它不应被 pdepend 视为第三条路径。这就像添加“$b = $a;”在 if/else 语句之前。仍然只有 2 条可能的路径。
  • @leyou Ya,你可能是对的。不过,也许更高的 npath 复杂性来自于考虑 copy of $a $a - 因此,从某种意义上说,两个if-else 语句......不太清楚这将如何等同于5虽然...
猜你喜欢
  • 1970-01-01
  • 2022-01-25
  • 2015-06-05
  • 2014-06-16
  • 2010-12-12
  • 2021-01-03
  • 1970-01-01
  • 1970-01-01
  • 2021-03-31
相关资源
最近更新 更多