【问题标题】:Best practice on ending if...else statement without else condition在没有其他条件的情况下结束 if...else 语句的最佳实践
【发布时间】:2011-07-15 21:11:48
【问题描述】:

在没有 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...
}

我知道如果我们在没有 else 条件的情况下加上 if,PHP 仍然可以工作。但是如果有 elseif 条件呢?在这样的情况下,如果我们不想包含任何错误消息或有任何 else 条件,并且想要保持严格的 if...else 语句,那么最佳做法是什么?

提前致谢。

【问题讨论】:

  • 据我所知,以任何方式不包括 else 条件都不是“坏习惯”。您只需按照脚本的要求执行操作,如果对某事不应该有默认响应,那么就没有。

标签: php coding-style if-statement


【解决方案1】:

没有if...else 声明。
只有if 语句可以使用elseelseif 运算符进行扩展。

因此,不带else 条件的if 语句的最佳实践是不带else 条件的if 语句:

if (condition) {
  //some code
}

坦率地说,没有最佳实践。最佳实践只是遵循程序逻辑。
就是这样

【讨论】:

  • 我认为这是一个通用的答案,没有抓住重点。
  • @Core 我认为这是一个没有抓住重点的问题;)问我某个问题,你会得到肯定的答案
  • 我同意,这个问题还不够清楚,在这方面你的回答是准确的;但我宁愿解决问题也不愿对错误答案投赞成票。
【解决方案2】:

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

在很多情况下,你实际上可以使用switch statement

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

【讨论】:

  • 但是,在这种情况下,default 不会充当 else 语句吗? :) 要根据 OP 的喜好回答问题,您需要删除默认语句。因为不需要在交换机中。但是,您也不必写空的else。你只需要省略它们。
  • 我认为在这种情况下开关是最好的选择。
  • 如果"up""down" 是唯一允许的值,我会在default throw new Exception()
  • @Core Xii 好主意!已更新。
  • 不过,这不能归功于它,D does it 就是这样。我更喜欢这样。如果你想要一个什么都不做的default,你应该明确地说出来。
【解决方案3】:

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

场景 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 会产生不好的代码气味。

使用 switchdefault 分支代替。它将更清楚地传达您的意图:

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

这可能有点冗长,但读者很清楚代码的预期功能。在我看来,一个空的 else 块在这里看起来不自然且令人费解。

【讨论】:

    【解决方案4】:

    我认为如果else 上无事可做,那么代码中就没有必要存在else 块。如果包含else 块,则意味着它有存在的目的,因此如果它为空,则代码还不完整。

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

        我尽量不写else。曾经。根据我的经验,使用 else 会导致逻辑可读性降低,尤其是在嵌套 if/else 时。

        为了将 var 分配给 truefalse(或任何其他简单的 this-or-that 值),我总是使用:

        $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 所说;考虑 elseif 时使用 switch 语句。

        正如你的常识已经说过的那样,没有最佳实践,但有很好的实践,我认为这是一个。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-10-25
          • 1970-01-01
          • 1970-01-01
          • 2013-03-27
          • 1970-01-01
          • 2021-11-30
          • 1970-01-01
          相关资源
          最近更新 更多