代码之家  ›  专栏  ›  技术社区  ›  rjzii

单一决策和行动陈述的首选样式是什么?

  •  3
  • rjzii  · 技术社区  · 16 年前

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

    if (var == true)
        doSomething();
    

    写这个的首选方式是什么?应该始终使用方括号,还是应该将它们的使用作为单个开发人员的首选项?此外,此实践是否取决于代码块的大小,例如在以下示例中:

    if (var == 1)
        doSomething(1);
    else if (var > 1 && var < 10)
        doSomething(2);
    else
    {
        validate(var);
        doSomething(var);
    }
    
    20 回复  |  直到 7 年前
        1
  •  10
  •   stimms    16 年前

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

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

    但这是一场神圣的战争。

        2
  •  10
  •   ZombieSheep    16 年前

    我推荐

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

    因为我发现提前做比在成功条件中添加第二个语句时记住添加大括号要容易得多…

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

    非常不同于

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

    看见 Joel's article 更多详细信息

        3
  •  8
  •   erlando    16 年前

    我总是用牙套。你可以从一些细微的错误开始,比如:

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

    然后决定将另一个操作添加到 else 子句并忘记用大括号括起来:

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

    AlwaysGetsCalled() 总会有人打电话给你,如果你在凌晨3点坐在那里,想知道为什么你的代码会表现得很奇怪,这种情况可能会让你有一段时间无法理解。仅因为这个原因,我总是使用大括号。

        4
  •  4
  •   Jon Limjap    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相同的行)。

        5
  •  3
  •   Rytmis    16 年前

    这是因为缺乏经验,但在我七年的代码猴生涯中,我 从未 实际上,有人在向没有大括号的块中添加代码时犯了不添加大括号的错误。这就是 时代。

    在聪明的人开始之前,不,原因不是“每个人都用牙套”。

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

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

        6
  •  2
  •   Stu    16 年前

    只要你坚持下去,这并不重要。

    似乎确实有一种趋势要求在一个语句中保持相同,即,如果一个分支中有括号,那么到处都有括号。首先,Linux内核编码标准规定了这一点。

        7
  •  2
  •   Nick    16 年前

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

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

    现在,有人来找一个没有真正注意到的人,他决定如果(var==1)发生一些额外的事情,那么他们会这样做:

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

    它的凹痕仍然很漂亮,但不能达到预期效果。

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

        8
  •  2
  •   Dewm Solo    16 年前

    我个人支持麦康奈尔从代码中的解释。

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

    但有一件事更重要……一致性。无论你使用哪种风格,都要确保你总是用同样的方式。

    开始写一些东西,比如:

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

    你一定会找到一个奇怪的bug,在这个bug中编译器不会理解你试图做什么,这很难找到。

    基本上,找到一个你每次写作都很舒服的人,坚持下去。我相信尽可能多地使用积木式熟食店(“”、“”)是一种可行的方式。

    我不想在另一个问题里开始一个问题,但我想提的是与此相关的一些事情可以让你的精神更加活跃。一是决定使用括号。你把开口销放在哪里?在语句的同一行或下面。括号是否缩进?

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

    请不要回答这个问题,因为这将是一个新问题。如果我对此感兴趣,我将打开一个新问题,你的意见。

        9
  •  1
  •   Ryan Ahearn    16 年前

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

    在这种情况下,我要确保它是一个单一的声明,将所有内容都放在一行上,如:

    if (aString) free(aString);
    
        10
  •  1
  •   Eldila    16 年前

    写这句话没有对错之分。有许多可接受的编码 styles . 但是,对于我来说,我更喜欢在整个项目中保持编码样式的一致性。即,如果项目使用K&R样式,则应使用K&R。

        11
  •  1
  •   James A. Rosen    16 年前

    Ruby在讨论中很好地排除了一个问题。单衬层的标准是:

    do_something if (a == b)
    

    对于多行:

    if (a == b)
      do_something
      do_something_else
    end
    

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

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

        12
  •  1
  •   Adam Lassek    16 年前

    正如其他人提到的,在没有大括号的两行中执行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块更简洁,但很容易看到发生了什么。

        13
  •  1
  •   Eek    16 年前

    孙氏 Code Conventions for the Java programming Language this 说:

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

    if (condition) {
        statements;
    }
    
    if (condition) {
        statements;
    } else {
        statements;
    }
    
    if (condition) {
        statements;
    } else if (condition) {
        statements;
    } else {
        statements;
    }
    
        14
  •  0
  •   Chris Benard Mafoo    16 年前

    我们的老板让我们把放在决策声明之后,不管它是什么,即使它是一个单一的声明。多加两行真烦人。唯一的例外是三元运算符。

    我想这是一件好事,我的代码监视器是纵向的,在1200x1600。

        15
  •  0
  •   Baltimark    16 年前

    我更喜欢

    if (cond)
       {
       //statement
       }
    

    即使只有一句话。如果你要写一次东西,毫无疑问它是有效的,而且从来没有计划在另一个编码器上,从来没有看过该代码,继续使用你想要的任何格式。但是,额外的支架到底花了你多少钱?一年中的时间比打字时间短。

    是的,我也喜欢将括号缩进到块的级别。

    python很好,因为缩进定义了块。这个问题用那种语言来说是没有意义的。

        16
  •  0
  •   Pascal Paradis    16 年前

    我倾向于同意乔尔·斯波斯基关于那篇文章的观点。( Making Wrong Code Look Wrong )使用以下代码示例:

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

    foo现在是无条件的。威奇真糟糕!

    我总是用括号作决定陈述。它有助于代码的可维护性,并使代码不容易出现错误。

        17
  •  0
  •   spitzak    16 年前

    如果并且仅当其中至少一个语句需要大括号时,我才会在每个语句周围使用大括号。

        18
  •  0
  •   Brad Gilbert    16 年前

    在Perl中,如果您正在进行一个简单的测试,有时您将以以下形式编写它:

    do_something if condition;
    
    do_something unless condition;
    

    这对于检查子例程开头的参数非常有用。

    sub test{
      my($self,@args) = @_;
    
      return undef unless defined $self;
    
      # rest of code goes here
    
    }
    
        19
  •  0
  •   Jason Plank Maksim Kondratyuk    13 年前

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

    当我在家的时候,我有两张表格。

    第一条是单线:

    if (condition) doThis();
    

    第二种是多行:

    if (condition) {
       doThis();
    }
    
        20
  •  0
  •   Jason Plank Maksim Kondratyuk    13 年前

    我曾经像一个官员一样遵循“总是使用大括号”这一行。但是,我已经修改了我的样式,允许在单行条件表达式中省略它们:

    if(!ok)return;
    

    对于任何多个州的情况,尽管我仍然认为支撑应该是强制性的:

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