【问题标题】:What is the prefered style for single decision and action statements?单一决策和行动陈述的首选风格是什么?
【发布时间】:2010-09-05 21:10:13
【问题描述】:

对于支持不带括号的单一决策和动作的语言,例如以下示例:

if (var == true)
    doSomething();

写这篇文章的首选方式是什么?应该始终使用括号,还是应该将它们的使用保留为个人开发人员的偏好?此外,这种做法是否取决于代码块的大小,例如以下示例:

if (var == 1)
    doSomething(1);
else if (var > 1 && var < 10)
    doSomething(2);
else
{
    validate(var);
    doSomething(var);
}

【问题讨论】:

    标签: language-agnostic language-features readability


    【解决方案1】:

    我曾经像 apparatchik 一样遵循“始终使用花括号”这一行。然而,我已经修改了我的风格,允许在单行条件表达式中省略它们:

    if(!ok)return;
    

    尽管我仍然认为大括号应该是强制性的,但对于任何多语句场景:

    if(!ok){
    
        do();
    
        that();
    
        thing();
    }
    

    【讨论】:

    • 我不确定,但我不怀疑 StackOverflow 上有 apparatchiks。
    【解决方案2】:

    黄金法则是,在现有项目中工作时,请遵循这些编码标准。

    当我在家时,我有两种表格。

    第一个是单行:

    if (condition) doThis();
    

    第二个是多行:

    if (condition) {
       doThis();
    }
    

    【讨论】:

      【解决方案3】:

      我倾向于一直使用大括号。您可能会在开始时遇到一些细微的错误,例如:

      if(something)
       DoOneThing();
      else
        DoItDifferently();
      

      然后决定在else 子句中添加另一个操作并忘记将其包裹在大括号中:

      if(something)
       DoOneThing();
      else
        DoItDifferently();
        AlwaysGetsCalled(); 
      

      AlwaysGetsCalled() 总是会被调用,如果你在凌晨 3 点坐在那里想知道为什么你的代码表现得这么奇怪,那么你可能会在很长一段时间内遇到类似的事情。仅出于这个原因,我总是使用大括号。

      【讨论】:

        【解决方案4】:

        如果你在 Perl 中做一个简单的测试,有时你会写成这样的形式:

        do_something if condition;
        
        do_something unless condition;
        

        这对于检查子程序开始时的参数非常有用。

        sub test{
          my($self,@args) = @_;
        
          return undef unless defined $self;
        
          # rest of code goes here
        
        }
        

        【讨论】:

          【解决方案5】:

          Sun 的Code Conventions for the Java programming Languagethis 说:

          if-else 类语句应该 有以下形式:

          if (condition) {
              statements;
          }
          
          if (condition) {
              statements;
          } else {
              statements;
          }
          
          if (condition) {
              statements;
          } else if (condition) {
              statements;
          } else {
              statements;
          }
          

          【讨论】:

            【解决方案6】:

            当且仅当至少有一个语句需要时,我在每个语句周围使用花括号。

            【讨论】:

              【解决方案7】:

              我个人支持麦康奈尔在 Code Complete 中的解释。

              尽可能使用它们。它们增强了代码的可读性并消除了可能发生的少数和稀缺的混淆。

              不过,有一件事更重要....一致性。无论您使用哪种风格,请确保您始终以相同的方式进行操作。

              开始写类似的东西:

              If A == true FunctA(); If B == "Test" { FunctB(); }

              您最终会寻找一个奇怪的错误,编译器无法理解您正在尝试做什么,而且很难找到。

              基本上找到你每次都写得舒服的那个并坚持下去。我确实相信尽可能多地使用块分隔符('{', '}') 是要走的路。

              我不想从另一个问题开始,但是我想提一下与此相关的一些事情,让您的精神活力。已做出使用括号的决定之一。你把开口支架放在哪里?在语句的同一行或下方。是否缩进括号?

              If A == false { //calls and whatnot } //or If B == "BlaBla" { //calls and whatnot } //or If C == B { //calls and whatnot }

              请不要回答这个问题,因为这是一个新问题。如果我看到对此感兴趣,我会提出一个新问题。

              【讨论】:

                【解决方案8】:

                将此归咎于缺乏经验,但在我作为代码猴子的七年时间里,我从未真正看到有人在将代码添加到块时犯了不添加大括号的错误没有大括号。那正是 次。

                在说俏皮话之前,不,原因不是“每个人都总是使用大括号”。

                所以,一个诚实的问题——我真的很想得到实际的答复,而不仅仅是投反对票:这真的发生过吗?

                (编辑:我听过足够多的外包恐怖故事来澄清一下:有能力的程序员真的发生过这种情况吗?)

                【讨论】:

                • 我犯了这个错误,当其他人犯了这个错误时,我已经找到并修复了它。我们是否胜任有待讨论。
                【解决方案9】:

                正如其他人所提到的,在没有大括号的情况下在两行中执行 if 语句可能会导致混淆:

                if (a == b)
                    DoSomething();
                    DoSomethingElse(); <-- outside if statement
                

                所以如果我可以在不影响可读性的情况下将它放在一行上:

                if (a == b) DoSomething();
                

                在所有其他时间我都使用大括号。

                三元运算符有点不同。大多数情况下,我会在一行中完成:

                var c = (a == b) ? DoSomething() : DoSomethingElse();
                

                但有时语句有嵌套的函数调用或 lambda 表达式 使单行语句难以直观地解析,所以我更喜欢这样的:

                var c = (a == b)
                    ? AReallyReallyLongFunctionName()
                    : AnotherReallyReallyLongFunctionOrStatement();
                

                仍然比 if/else 块更简洁,但很容易看到发生了什么。

                【讨论】:

                  【解决方案10】:

                  Ruby 很好地避免了讨论中的一个问题。单线的标准是:

                  do_something if (a == b)
                  

                  对于多行:

                  if (a == b)
                    do_something
                    do_something_else
                  end
                  

                  这允许简洁的单行语句,但如果您从单行变为多行,则会强制您重新组织语句。

                  这在 Java 中(还)不可用,在许多其他语言中也不可用,AFAIK。

                  【讨论】:

                    【解决方案11】:

                    我倾向于同意 Joel Spolsky 的那篇文章 (Making Wrong Code Look Wrong) 的代码示例:

                    if (i != 0)
                    bar(i);
                    foo(i);
                    

                    Foo 现在是无条件的。真的很糟糕!

                    我总是在决策陈述中使用方括号。它有助于代码的可维护性,并使代码不易出错。

                    【讨论】:

                      【解决方案12】:

                      我更喜欢

                      if (cond)
                         {
                         //statement
                         }
                      

                      即使只有一个语句。如果你打算写一次东西,毫无疑问它可以工作,并且从未计划过让另一个编码员查看该代码,那么继续使用你想要的任何格式。但是,额外的包围真的让你付出了什么?一年的时间比写这篇文章的时间还短。

                      是的,我也喜欢将括号缩进到块的水平。

                      Python 的优点在于缩进定义了块。这个问题在这样的语言中是没有实际意义的。

                      【讨论】:

                        【解决方案13】:

                        我强烈主张总是使用大括号,即使它们是可选的。为什么?拿这段 C++ 代码:

                        if (var == 1)
                          doSomething();
                        doSomethingElse();
                        

                        现在,出现了一个没有真正关注的人,并决定如果 (var == 1) 需要发生一些额外的事情,所以他们这样做:

                        if (var == 1)
                          doSomething();
                          doSomethingExtra();
                        doSomethingElse();
                        

                        所有的缩进仍然很漂亮,但它不会达到预期的效果。

                        通过始终使用大括号,您更有可能避免此类错误。

                        【讨论】:

                          【解决方案14】:

                          上面的语句没有对错之分。有很多公认的编码styles。然而,对我来说,我更喜欢在整个项目中保持编码风格。 IE。如果项目使用 K&R 风格,则应使用 K&R。

                          【讨论】:

                            【解决方案15】:

                            我推荐

                            if(a==b)
                            {
                                doSomething();
                            }
                            

                            因为我发现在向成功条件中添加第二条语句时,预先进行操作比尝试记住添加大括号要容易得多...

                            if(a==b)
                                doSomething();
                                doSomethingElse();
                            

                            有很大不同
                            if(a==b)
                            {
                                doSomething();
                                doSomethingElse();
                            }
                            

                            更多详情请见Joel's article

                            【讨论】:

                            • 你应该总是在 if/else 中使用大括号。永远永远永远。
                            【解决方案16】:

                            我的偏好是保持一致,例如,如果您在一个块上使用括号,即使只有一个语句,也要始终使用括号:

                            if (cond1)
                            {
                               SomeOperation();
                               Another();
                            }
                            elseif (cond2)
                            {
                               DoSomething();
                            }
                            else
                            {
                               DoNothing();
                               DoAnother();
                            }
                            

                            但是,如果您只有一堆衬里:

                            if (cond1)
                                DoFirst();
                            elseif (cond2)
                                DoSecond();
                            else
                                DoElse();
                            

                            这样看起来更干净(如果您不介意虚拟方法名称;),但这只是我。

                            这也适用于循环结构等:

                            foreach (var s as Something)
                                if (s == someCondition)
                                    yield return SomeMethod(s);
                            

                            您还应该考虑到这是一个可能更适合 .NET 的约定(请注意,Java peepz 喜欢将第一个花括号与 if 放在同一行)。

                            【讨论】:

                              【解决方案17】:

                              除了在释放变量之前检查变量是否为 NULL 的情况外,我一直都使用方括号,就像在 C 中是必需的那样

                              在这种情况下,我通过将所有内容都放在一行来确保它是一个单一的语句,如下所示:

                              if (aString) free(aString);
                              

                              【讨论】:

                                【解决方案18】:

                                没有真正正确的答案。这就是公司内部的编码标准。如果您可以在整个公司中保持一致,那么它将很容易阅读。我个人喜欢

                                if ( a == b)    {
                                    doSomething();
                                }
                                else {
                                    doSomething();
                                }
                                

                                但这是一场圣战。

                                【讨论】:

                                  【解决方案19】:

                                  我们的老板无论如何都让我们把 { } 放在一个决策声明之后,即使它是一个单一的声明。多加两行真的很烦人。唯一的例外是三元运算符。

                                  我想我的代码监视器以 1200x1600 为纵向显示是件好事。

                                  【讨论】:

                                    【解决方案20】:

                                    没关系,只要你坚持就行了。

                                    似乎确实倾向于在单个语句中要求相同,即,如果一个分支中有括号,则到处都有括号。 Linux 内核编码标准就是这样规定的。

                                    【讨论】:

                                      猜你喜欢
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 2019-11-22
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 1970-01-01
                                      相关资源
                                      最近更新 更多