关于不可知的语言:单个决策和动作陈述的首选样式是什么?

关于不可知的语言:单个决策和动作陈述的首选样式是什么?

What is the prefered style for single decision and action statements?

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

1
2
if (var == true)
    doSomething();

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

1
2
3
4
5
6
7
8
9
if (var == 1)
    doSomething(1);
else if (var > 1 && var < 10)
    doSomething(2);
else
{
    validate(var);
    doSomething(var);
}

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

1
2
3
4
5
6
if ( a == b)    {
    doSomething();
}
else {
    doSomething();
}

但这是一场神圣的战争。


我建议

1
2
3
4
if(a==b)
{
    doSomething();
}

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

1
2
3
if(a==b)
    doSomething();
    doSomethingElse();

1
2
3
4
5
if(a==b)
{
    doSomething();
    doSomethingElse();
}

有关更多详细信息,请参见Joel的文章


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

1
2
3
4
if(something)
 DoOneThing();
else
  DoItDifferently();

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

1
2
3
4
5
if(something)
 DoOneThing();
else
  DoItDifferently();
  AlwaysGetsCalled();

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


我的偏好是保持一致,例如,如果在一个块上使用方括号,则即使仅使用一条语句,也要在整个方括号中使用方括号:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
if (cond1)
{
   SomeOperation();
   Another();
}
elseif (cond2)
{
   DoSomething();
}
else
{
   DoNothing();
   DoAnother();
}

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

1
2
3
4
5
6
if (cond1)
    DoFirst();
elseif (cond2)
    DoSecond();
else
    DoElse();

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

这也适用于循环构造等:

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

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


可以用缺乏经验的方式来解决这个问题,但是在我作为代码猴子的七年间,我从未真正见过有人在向没有括号的代码块添加代码时不加括号的错误。恰好是零倍。

而且,在胡扯之前,不是,原因不是"每个人都总是使用牙套"。

因此,一个诚实的问题-我真的很想得到实际的答复,而不只是拒绝投票:这真的发生了吗?

(编辑:我已经听到了足够多的关于外包的恐怖故事,可以澄清一下:有能力的程序员实际上会发生这种情况吗?)


我强烈建议始终使用花括号,即使它们是可选的。为什么?采取以下C ++代码块:

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

现在,某个人并没有真正引起足够的重视,并决定如果(var == 1)需要发生一些额外的事情,所以他们这样做:

1
2
3
4
if (var == 1)
  doSomething();
  doSomethingExtra();
doSomethingElse();

它仍然缩进得很漂亮,但是并没有达到预期的效果。

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


我个人支持Code Complete的McConnell的解释。

尽可能使用它们。它们提高了代码的可读性,并消除了可能发生的少量稀疏的混淆。

但是有一件事更重要。。。一致性。使用哪种样式,请确保始终以相同的方式进行。

开始编写如下内容:

1
2
3
4
5
6
7
8
9
<wyn>
If A == true
   FunctA();

If B =="Test"
{
   FunctB();
}
</wyn>

您肯定会发现一个奇怪的错误,在该错误中编译器将无法理解您要执行的操作,而这将很难找到。

基本上找到一个您每次都能舒适书写的东西并坚持下去。我相信,尽可能多地使用块分隔符('{','}')是可行的方法。

我不想在另一个问题中提一个问题,但是我想提一下与此相关的一些问题,以使您的思维更加活跃。做出使用括号的决定。您将开括号放在哪里?与语句相同或在下面。括号是否缩进?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<wyn>
If A == false {
  //calls and whatnot
}
//or
If B =="BlaBla"
{
  //calls and whatnot
}
//or
If C == B
  {
  //calls and whatnot
  }
</wyn>

请不要回答这个问题,因为这将是一个新问题。如果我对此感兴趣,则将打开一个新问题,请输入。


只要您与它保持一致,就没有关系。

在单个语句中似乎确实存在要求相同性的趋势,即,如果一个分支中有方括号,则到处都有方括号。 Linux内核编码标准就是其中之一。


Sun的Java编程语言代码约定说:

The if-else class of statements should
have the following form:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if (condition) {
    statements;
}

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

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


就像其他人提到的那样,在没有大括号的情况下在两行中执行if语句会导致混乱:

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

因此,如果可以的话,我将其放在一行上而不影响可读性:

1
if (a == b) DoSomething();

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

三元运算符有所不同。大多数时候,我会一行执行:

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

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

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

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


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

1
do_something if (a == b)

对于多行:

1
2
3
4
if (a == b)
  do_something
  do_something_else
end

这样可以使用简洁的单行语句,但是如果您从单行转换为多行,则会强制您重新组织语句。

目前尚无法使用Java或AFAIK多种其他语言来使用此功能。


我一直都使用方括号,除非我在释放变量之前先检查变量是否为NULL(例如C语言中的必要条件)

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

1
if (aString) free(aString);

编写以上声明没有正确或错误的方法。有很多公认的编码样式。但是,对我来说,我更喜欢在整个项目中保持编码风格一致。即。如果项目使用K&R样式,则应使用K&R。


老板让我们将{}放在决策声明之后,无论它是什么,即使只是一个声明。添加两条额外的行确实很烦人。唯一的例外是三元运算符。

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


我更喜欢

1
2
3
4
if (cond)
   {
   //statement
   }

即使只有一条语句。如果您要编写一次内容,毫无疑问,它可以工作,并且从未计划过使用另一个编码器来查看该代码,请继续使用所需的任何格式。但是,额外的包围实际上会使您付出什么呢?一年中的时间少于键入此帖子的时间。

是的,我也想将方括号缩进方块的高度。

Python很不错,因为缩进定义了块。问题是用这样的语言来解决的。


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

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

第一是单行:

1
if (condition) doThis();

第二个是用于多行:

1
2
3
if (condition) {
   doThis();
}

我过去经常遵循"总是使用花括号"这一行,就像一个apparatchik。但是,我修改了样式,以允许在单行条件表达式中省略它们:

1
if(!ok)return;

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

1
2
3
4
5
6
7
8
if(!ok){

    do();

    that();

    thing();
}

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


在Perl中,如果您要进行简单的测试,有时您会以这种形式编写它:

1
2
3
do_something if condition;

do_something unless condition;

在子例程开始时检查参数非常有用。

1
2
3
4
5
6
7
8
sub test{
  my($self,@args) = @_;

  return undef unless defined $self;

  # rest of code goes here

}


我倾向于与Joel Spolsky在该文章(错误代码看起来错误)中使用以下代码示例达成一致:

1
2
3
if (i != 0)
bar(i);
foo(i);

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

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


推荐阅读