【问题标题】:Nested versus composite conditions嵌套与复合条件
【发布时间】:2010-07-31 14:57:58
【问题描述】:

这两个例子中哪一个表现更好:

示例 1:

if($condition_1)
{
 if($condition_2)
 {
  // do something
 }
}

示例 2:

if($condition_1 and $condition_2)
{
 // do something
}

【问题讨论】:

    标签: php performance


    【解决方案1】:

    差异(如果有的话)可以忽略不计。由于short-circuit evaluation

    ,您不必担心第二个评估这两个条件

    IMO 第二种形式使代码更具可读性。我讨厌看到一百万个缩进。

    【讨论】:

    • 在什么情况下第二个例子只计算$condition_1,而例子1两个都计算?
    • 它们发生了,该死的短路。 :)
    【解决方案2】:

    这是过早进行微优化的严重案例。即使存在差异,它也是微不足道的,甚至不存在——这不是哪个性能更好的问题,而是哪个更易读的问题。这将取决于具体情况。但是,脱离上下文,我会说第二种选择更可取:“if”语句意味着“else”,即使它不存在,并且两个“ifs”会误导读者。

    【讨论】:

      【解决方案3】:

      如果有的话,差别可以忽略不计。我在后面的方法中看到简洁

      【讨论】:

        【解决方案4】:

        嵌套控制结构将有更多Cyclomatic Complexity。比较嵌套的 if 块构造

        Lines of Code (LOC):                                  6
          Cyclomatic Complexity / Lines of Code:           0.40
        Comment Lines of Code (CLOC):                         1
        Non-Comment Lines of Code (NCLOC):                    5
        

        与复合 if 块结构

        Lines of Code (LOC):                                  9
          Cyclomatic Complexity / Lines of Code:           0.25
        Comment Lines of Code (CLOC):                         1
        Non-Comment Lines of Code (NCLOC):                    8
        

        请注意,数字因代码布局方式而异。将嵌套结构写在一行上会使 CC 增加到 0.67。一般来说,您要避免将控制流嵌套得太深,因为它会变得更难维护。

        因此,如果它不利于可读性,请使用组合比较。

        编辑:如果您想知道为什么它是 9 个和 6 个 LOC:因为我在用于分析的文件中添加了 <?php 和空行

        【讨论】:

          【解决方案5】:

          我找到了以下here

          一旦知道结果,逻辑表达式的计算就会停止。

          所以,如果你写cond1 and cond2,如果cond1 评估为假,它就会停止。所以速度上甚至没有区别。

          【讨论】:

            【解决方案6】:

            如果它只是一个块,请使用后一个选项,因为它需要更少的缩进,更短,并且可以说更具可读性。

            但是,请注意,从那时起,您将使用第一个的变体,因为您将添加 elses。这些显然不一样:

            if ($condition_1) {
                if ($condition_2) {
                    // do something
                }
                else {
                    //do something else
                }
            }
            
            if ($condition_1) {
                if ($condition_2) {
                    // do something
                }
            }
            else {
                //do something else
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2016-11-01
              • 2011-03-21
              • 1970-01-01
              • 2014-03-07
              • 1970-01-01
              • 1970-01-01
              • 2012-11-18
              • 1970-01-01
              相关资源
              最近更新 更多