在没有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语句,如果我们不想包含任何错误消息或有任何其他条件,那么最佳做法是什么?
提前致谢。
答案 0 :(得分:20)
没有if...else
声明
可以使用if
和else
运算符扩展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 == 0
而conditionB
可能是$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分配给true
或false
(或任何其他简单的这个或那个值),我总是使用:
$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
语句。
正如你的常识已经说过,没有最好的做法,但有好的做法,我认为这是一个。