3

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

if (var == true)
    doSomething();

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

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

20 回答 20

10

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

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

但这是一场圣战。

于 2008-08-14T14:27:26.750 回答
10

我建议

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

因为我发现在向成功条件添加第二条语句时尝试记住添加大括号要容易得多...

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

非常不同

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

有关详细信息,请参阅Joel 的文章

于 2008-08-14T14:31:55.773 回答
8

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

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

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

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

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

于 2008-08-14T14:32:35.913 回答
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 相同的行中)。

于 2008-08-14T14:27:17.047 回答
3

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

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

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

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

于 2008-08-14T19:19:40.920 回答
2

没关系,只要你坚持就好。

似乎确实有一种在单个语句中要求相同的趋势,即如果一个分支中有括号,那么括号无处不在。例如,Linux 内核编码标准要求这样做。

于 2008-08-14T14:25:17.443 回答
2

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

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

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

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

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

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

于 2008-08-14T14:32:51.560 回答
2

我个人支持麦康奈尔对 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
  }

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

于 2008-09-02T12:50:15.047 回答
1

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

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

if (aString) free(aString);
于 2008-08-14T14:28:36.903 回答
1

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

于 2008-08-14T14:32:48.707 回答
1

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

do_something if (a == b)

对于多行:

if (a == b)
  do_something
  do_something_else
end

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

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

于 2008-08-14T16:29:24.447 回答
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 块更简洁,但很容易看到发生了什么。

于 2008-08-14T19:14:11.790 回答
1

Sun 的Java 编程语言代码约定是这样的:

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

if (condition) {
    statements;
}

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

if (condition) {
    statements;
} else if (condition) {
    statements;
} else {
    statements;
}
于 2008-09-16T22:42:24.490 回答
0

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

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

于 2008-08-14T14:27:03.383 回答
0

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

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

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

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

于 2008-08-14T14:33:00.063 回答
0

我更喜欢

if (cond)
   {
   //statement
   }

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

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

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

于 2008-08-14T14:42:47.670 回答
0

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

if(!ok)return;

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

if(!ok){

    do();

    that();

    thing();
}
于 2008-08-14T15:08:51.503 回答
0

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

于 2008-09-16T21:50:42.633 回答
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

}
于 2008-09-17T18:02:54.527 回答
0

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

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

第一个是单行:

if (condition) doThis();

第二个是多行:

if (condition) {
   doThis();
}
于 2009-03-12T18:02:30.867 回答