【问题标题】:Are singleline if statements or if statements without braces bad practice?单行 if 语句或不带大括号的 if 语句是不好的做法吗?
【发布时间】:2009-03-27 21:16:28
【问题描述】:
if (condition) { /* do something */ }
else { /* do something */ }

if (condition)
    /* do something */
else
    /* do something */

有人告诉我,第一个实例不是一个好主意。我不知道这是否真的是这种情况(或者第二种情况);它不会缩短键入的数量吗?还是因为它只会弄得一团糟?

【问题讨论】:

    标签: php c coding-style


    【解决方案1】:

    最佳做法是编写其他人可以轻松阅读和更新的代码。

    您的第一个表单是有问题的,因为它不遵循大多数 PHP 开发人员习惯的表单:

    if (condition) {
      // code
    } else {
      // code
    }
    
    // ... or ...
    
    if (condition)
    {
      // code
    }
    else
    {
      // code
    }
    
    // ... or ...
    
    if (condition) { /* short code */ } else { /* short code */ }
    
    // ... or ...
    
    condition ? /* short code */ : /* short code */;
    

    请注意,这完全是关于标准实践,不一定有意义——它只是关于其他开发人员习惯看到的内容。

    更重要的是,您的第二种形式不太好,因为它使其他程序员很容易犯这个错误:

    if (condition)
      // code A
    else
      // code B
      // code C (added by another programmer)
    

    在这个例子中,另一个程序员添加了code C,但忘记将整个else 块括在大括号中。这会导致问题。您可以通过简单地将 ifelse 块包裹在大括号中来防御这种情况。

    【讨论】:

    • 其实我已经习惯把大括号放在不同的行上。
    • 这是第二个最佳实践 - 最好的写作风格与原作者相同 - 虽然我想这也是真的:)
    • 我不同意第 2 点。只有真正糟糕的程序员才会做一些不带花括号的添加代码 C 之类的事情。
    • @rlbond:或者是一个会犯错误的优秀程序员。众所周知。
    • @Beska 或者只是一个非常糟糕的程序员,因为一个好的程序员会在找不到右括号时接受它。
    【解决方案2】:

    如果为了一致性,我更喜欢......所以:

    if(...)
    {
       statement 1;
       statement 2;
    }
    else
    {
       statement 1;
       statement 2;
    }
    

    与以下没有什么不同:

    if(...)
    {
       statement 1;
    }
    else
    {
       statement 1;
    }
    

    所以我总是使用它们,因为它是一致的,并且避免了以后忘记添加它们的问题。

    但是其他人会看到我的代码并认为放入 { 和 } 是愚蠢的。他们有他们的理由,我有我的……我碰巧喜欢我的理由胜过喜欢他们的理由:-)

    【讨论】:

    • 干杯 :) 我也这样做,并且出于同样的原因:不要忘记稍后添加大括号。我也喜欢 { on new line 而不是 if(contidion){ 因为它并不总是可见的。
    【解决方案3】:

    通常不可读的代码是一种不好的做法。单行在您的输入和保存行号时效率更高,但一年后或在您扫描错误时再使用它会增加难度。

    在我看来,是的,单行 if 语句是不好的做法。

    计算机并不真正关心(据我所知),但您应该始终编写代码,就像它将由知道您住在哪里的连环杀手维护一样。

    可读!很容易自我辨别。

    【讨论】:

    • @jerebear 这看起来更像是评论而不是答案:)
    【解决方案4】:

    我看到的问题是开发人员在将代码添加到其中一个条件时无法识别 {}-less-if。示例:

    //before
    if(something)
        statement;
    
    //after
    if(something)
        statement;
        addedstatement;
    

    显然,这不会达到他们的预期。

    【讨论】:

    • 我将此归因于他们不懂语言。我通常不会尝试为不懂我所写语言的人定制我的代码。也就是说,如果在特定情况下它变得不那么可读,那些专家可能仍然有困难。
    【解决方案5】:

    你见过这样的 C 或 C++ 代码吗?

        /*  Warning:  bogus C code!  */
    
    if (some condition)
            if (another condition)
                    do_something(fancy);
    else
            this_sucks(badluck);
    

    要么缩进错误,要么程序有问题,因为“else”总是适用于最近的“if”,除非你使用大括号。

    (让我们只使用 python。没有括号,只是纯干净的空格。:P)

    【讨论】:

      【解决方案6】:

      对于除最短语句之外的所有语句,请使用大括号并相应地间隔它们。您想要这样做有几个原因:

      • 很难弄错某事的去向。

      • 更容易阅读。

      • 在具有宏扩展功能的语言(例如 C、C++)中,当包含多个语句的宏在无括号 if-else 中扩展时,如果不包含大括号会导致混乱的逻辑错误。

      【讨论】:

        【解决方案7】:

        使用多行的一个主要好处是易于调试。如果你在一行上有一个 if else 语句,并且调试器告诉你第 x 行爆炸了,那么确定语句的哪一部分失败就更困难了。多行代码还可以让您更轻松地使用调试器单步执行代码。

        【讨论】:

          【解决方案8】:

          这两行长,所以不是一行。

          单行ifs 没有任何问题,因为它使代码更容易阅读。

          例如,像这样的:

          if (last_item) print ", and " else print ", "
          

          好很多
          if (last_iem)
          {
              print ", and "
          }
          else
          {
              print ", "
          }
          

          【讨论】:

          • 两者都不好。最好的是echo (last_item) ? ",and" : ", ";。顺便说一下,尝试使用 echo。
          【解决方案9】:

          这比其他任何东西都更具编码风格。也就是说,我个人认为你的第二个例子可能非常有害。在大括号是创建块的唯一方法的语言中,很容易意外地“向块中添加第二行”。但是在存在替代语法的 PHP 中,这更不可能引发必要的警告:

          if ($_GET["asdf"]==1):
              /* do something */
          else:
              /* do something */
          endif;
          

          经验法则:如果您要将“做某事”放在单独的行上,请使用大括号;如果你不打算使用大括号,把它放在同一行!

          【讨论】:

            【解决方案10】:

            我见过很多带有愚蠢问题的第三方代码,我更喜欢一直使用大括号。那就是说我从来没有感觉良好

            if(){}
            else (){}
            

            当它是一条短指令并且它是单独的时,我在同一行使用 if(){}。如果有 else 使用 long:

            if(checkSomething)
            {
               //dosomething
            }
            else
            {
               //doanotherthing
            }
            

            【讨论】:

              【解决方案11】:

              这是我在不久前的一次就业考试中真正记得的事情。代码类似如下:

              if (x == 0)
                  x = 2;
              else
                  print("x is: %d", x); // debugging!
                  x = 4;
              

              这里的大多数人都可以发现错误,但您可以将任何您想要的内容替换为插入的“错误代码”。当你有一个“旧版本”的东西被注释掉了,而有人取消了它,突然第二个语句在块之外时,就会出现更微妙的错误。

              基本上,除非它是一个快速学习概念的小型测试应用程序,否则我总是括号(甚至在测试应用程序中我通常括号)。如果我不这样做,那么以后就不必头疼了,即使在 5 行方法中也是如此。

              【讨论】:

                【解决方案12】:

                您应该将“if”和“do something”放在不同的行中,以使您的代码对交互式调试器更友好。

                如果你把“if”和“do something”放在同一行,那么你不能在“do something”行设置断点。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2012-07-02
                  • 2016-04-25
                  • 2011-01-08
                  • 2017-06-14
                  • 1970-01-01
                  • 2020-10-02
                  • 1970-01-01
                  相关资源
                  最近更新 更多