结束if ... else语句的最佳做法,不带条件

时间:2011-03-15 15:06:59

标签: php coding-style if-statement

在没有else条件的情况下结束if ... else语句的最佳做法是什么?请考虑以下代码:

$direction = $_POST['direction']; //Up or down

if ($direction == "up") {
  code goes here...
}

elseif ($direction == "down") {
  code goes here...
}

else {
  //do nothing?
}

正如你所看到的,只有两个条件;无论是向上还是向下,else语句实际上没有用处,除非您希望它显示错误消息。

大多数时候,我看到程序员只是将else条件放在那里但插入注释而不是像这样的任何工作代码。

else {
      //error messages goes here...
}

或者只是假设它不是“向上”,那么其他一切都应该“向下”,因为只有2个条件。如果用户输入“左”或“右”,它仍将被视为“向下”。我认为这有点不合适。

if ($direction == 'up') {
  code goes here...
}

else {
  code goes here...
}

我知道如果我们在没有其他条件的情况下放置PHP,PHP仍然可以工作。但是如果有一个elseif条件怎么办?在这样的情况下,如果我们想要保留严格的if ... else语句,如果我们不想包含任何错误消息或有任何其他条件,那么最佳做法是什么?

提前致谢。

6 个答案:

答案 0 :(得分:20)

没有if...else声明 可以使用ifelse运算符扩展elseif语句。

因此,没有if条件的else语句的最佳做法是if语句没有else条件:

if (condition) {
  //some code
}

坦率地说,没有best practice。最佳实践只是遵循程序逻辑的实践 这就是全部

答案 1 :(得分:7)

不要写空else。这只会使代码混乱,而且你的意思非常明显。

在许多情况下,您实际上可以使用switch statement

switch ($_POST['direction') {
case 'up':
     // code ...
     break;
case 'down':
     // code ...
     break;
default: // else
     throw new Exception('Invalid direction value');
}

答案 2 :(得分:1)

这不是一个可以得到明确答案的东西。这是我的看法,看看还有其他意见会很有趣。

场景1:测试布尔条件

这是最简单的情况:

if (condition) {}
else {}

将条件指定为else if将是多余的,并且读者对代码的作用非常明显。在这种情况下,没有理由使用else if

场景2:测试无限状态的子集

这里我们感兴趣的是测试条件A和B(等等),如果它们都不成立,我们可能会或可能不会对会发生什么感兴趣:

if (conditionA) {}
else if (conditionB) {}
else {} // this might be missing

这里重点是没有有限数量的互斥状态,例如:conditionA可能是$num % 2 == 0conditionB可能是$num % 3 == 0

我认为在这里使用合理数量的分支是自然而可取的;如果分支变得太多,这可能表明一些明智地使用OO设计将导致可维护性的极大改进。

场景3:测试有限状态的子集

这是前两种情况之间的中间地带:状态数量有限但超过两种。测试类似枚举类型的值是原型示例:

if ($var == CONSTANT_FOO) {}
else if ($var == CONSTANT_BAR) {} // either this,
else {} // or this might be missing

在这种情况下使用switch可能更好,因为它会立即向读者传达状态数是有限的,并给出了一个强有力的提示,指出可能找到所有可能状态列表的位置(在此例如,以CONSTANT_开头的常量。我的个人标准是我正在测试的州的数量:如果它只有一个(没有else if)我将使用if;否则,switch。无论如何,在这种情况下我不会写else if

else添加为空的catch-errors块

这与上面的场景#2直接相关。除非可能的状态是有限的并且在编译时已知,否则您不能说“在任何其他情况下”意味着发生了错误。在方案#2中看到switch感觉更自然,我觉得以这种方式使用else会产生很难的代码味道。

使用switch代替default分支。它会更清楚地传达你的意图:

switch($direction) {
    case 'up': break;
    case 'down': break;
    default: // put error handling here if you want
}

这可能有点冗长,但读者可以清楚地知道代码是如何运作的。在我看来,一个空的else块看起来不自然,令人费解。

答案 3 :(得分:0)

我认为如果else上没有任何关系,那么代码中就不需要else块。如果包含else块,则意味着它有一个目的,所以代码是不完整的,如果它是空的。

答案 4 :(得分:0)

我有时会这样做。我并不担心"left"  被解释为"down"因为我总是验证我的输入,在这种情况下是preg_match('{^up|down$}', $direction)。无可争议的是switch更合适......但我不喜欢冗长的语法。

if ($direction == "up")
    {
    // code goes here...
    }
else //if ($direction == "down")
    {
    // code goes here...
    }

答案 5 :(得分:-1)

我尽量不写else。永远。根据我的经验,使用else会导致逻辑不太可读,尤其是当if / elses被嵌套时。

要将var分配给truefalse(或任何其他简单的这个或那个值),我总是使用:

$varx = false;
if ($my_codition_here === true) {
   $varx = true; 
}

当我有更大的逻辑块时,你可能会考虑"属于"在if / else中,我确保构造我的代码,以便在满足条件时,函数终止,通常返回:

if ($my_codition_here === true) {
    // A reasonable amount of logic goes here
    return $the_result_up_untill_here;
}

// All logic that would have been "else" goes here.
return $the_result_up_untill_here;

正如phihag所说;在考虑switch时使用elseif语句。

正如你的常识已经说过,没有最好的做法,但有好的做法,我认为这是一个。