单一决策和行动声明的首选风格是什么?

时间:2008-08-14 14:23:11

标签: language-agnostic language-features readability

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

if (var == true)
    doSomething();

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

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

20 个答案:

答案 0 :(得分:10)

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

if ( a == b)    {
    doSomething();
}
else {
    doSomething();
}
但这是一场神圣的战争。

答案 1 :(得分:10)

我推荐

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

因为我发现在向成功条件添加第二个语句时,尝试记住添加大括号要比预先更容易做到这一点...

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

非常不同
if(a==b)
{
    doSomething();
    doSomethingElse();
}

有关详细信息,请参阅Joel's article

答案 2 :(得分:8)

我倾向于一直使用大括号。你可以从一开始就得到一些微妙的错误:

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

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

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

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

答案 3 :(得分:4)

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

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相同的行中)。

答案 4 :(得分:3)

粉笔这个缺乏经验,但在我作为代码猴的七年工作期间,我从未实际上看到任何人犯了错误,在向块添加代码时不添加大括号没有牙套。这恰好是次。

在智者达到它之前,不,原因不是“每个人总是使用牙箍”。

所以,一个诚实的问题 - 我真的想得到实际的回复,而不仅仅是投票:那真的发生了吗?

(编辑:我听说过足够的外包恐怖故事要澄清一下:有能力的程序员实际上是否真的发生过?)

答案 5 :(得分:2)

只要你与它保持一致,这并不重要。

在单个陈述中似乎存在要求相同性的倾向,即如果一个分支中有括号,则到处都有括号。例如,Linux内核编码标准要求它。

答案 6 :(得分:2)

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

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

现在,有人出现并没有给予足够的重视,并决定在(var == 1)时需要发生一些额外的事情,所以他们这样做:

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

它仍然精美缩进,但不会达到预期目的。

总是使用大括号,你更有可能避免这种错误。

答案 7 :(得分:2)

我个人支持McConnell对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 :(得分:1)

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

do_something if (a == b)

和多行:

if (a == b)
  do_something
  do_something_else
end

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

这还没有(现在)可用于Java,也没有许多其他语言,AFAIK。

答案 9 :(得分:1)

正如其他人所提到的,在没有括号的情况下在两行中执行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 :(得分:1)

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

在这种情况下,我确保通过将所有内容保持在一行来确定它是一个单一的声明,如下所示:

if (aString) free(aString);

答案 11 :(得分:1)

写上述陈述没有正确或错误的方法。有大量可接受的编码styles。但是,对我来说,我更喜欢在整个项目中保持编码风格。即。如果项目使用K&amp; R风格,则应使用K&amp; R。

答案 12 :(得分:1)

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;
}

答案 13 :(得分:0)

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

当我在家时,我有两种形式。

第一个是单行:

if (condition) doThis();

,第二个是多行:

if (condition) {
   doThis();
}

答案 14 :(得分:0)

我们的老板让我们在决定声明之后放置{},无论如何,即使它是一个单一的陈述。添加两条额外的线条真的很烦人。唯一的例外是三元运算符。

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

答案 15 :(得分:0)

我倾向于同意Joel Spolsky关于那篇文章(Making Wrong Code Look Wrong)并使用以下代码示例:

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

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

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

答案 16 :(得分:0)

我更喜欢

if (cond)
   {
   //statement
   }

即使只有一个声明。如果你打算写一次,不要怀疑它是否有效,并且从未计划在另一个编码器上查看该代码,继续使用你想要的任何格式。但是,额外的包围真的花了你多少钱?一年中的时间少于输入这篇文章所需的时间。

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

Python很好,因为缩进定义了块。问题是用这样的语言没有实际意义。

答案 17 :(得分:0)

我过去常常遵循“使用花括号”这样的线条,就像一个政治家。但是,我修改了我的样式以允许在单行条件表达式上省略它们:

if(!ok)return;

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

if(!ok){

    do();

    that();

    thing();
}

答案 18 :(得分:0)

在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)

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