嵌套与复合条件

时间:2010-07-31 14:57:58

标签: php performance

这两个示例中的哪一个会表现得更好:

示例1:

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

示例2:

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

6 个答案:

答案 0 :(得分:6)

这是过早微优化的严重情况。即使存在差异,对于不存在也是微不足道的 - 这不是哪一个表现更好的问题,哪一个更具可读性。这取决于具体情况。但是,除了上下文之外,我会说第二种选择更可取:“if”语句意味着“else”,即使它不存在,并且两个“ifs”误导了读者。

答案 1 :(得分:6)

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

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

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

答案 2 :(得分:2)

如果有一个,那将是微不足道的差异。我稍后会看到简洁

答案 3 :(得分:2)

嵌套控件结构将有更多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和空行

答案 4 :(得分:1)

我找到了以下here

  

一旦结果已知,就会停止对逻辑表达式的评估。

因此,如果您编写cond1 and cond2,则会在cond1评估为false时停止。所以速度甚至没有差别。

答案 5 :(得分:0)

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

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

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

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