对于支持单一决策和不带括号的操作的语言,例如以下示例:
if (var == true)
doSomething();
写这个的首选方式是什么?是否应始终使用括号,还是应将其使用留作个别开发人员的偏好?此外,这种做法是否取决于代码块的大小,例如以下示例:
if (var == 1)
doSomething(1);
else if (var > 1 && var < 10)
doSomething(2);
else
{
validate(var);
doSomething(var);
}
答案 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)
我强烈主张总是使用大括号,即使它们是可选的。为什么?拿这个C ++代码块:
if (var == 1)
doSomething();
doSomethingElse();
现在,有人出现并没有给予足够的重视,并决定在(var == 1)时需要发生一些额外的事情,所以他们这样做:
if (var == 1)
doSomething();
doSomethingExtra();
doSomethingElse();
它仍然精美缩进,但不会达到预期目的。
总是使用大括号,你更有可能避免这种错误。
答案 6 :(得分:2)
只要你与它保持一致,这并不重要。
在单个陈述中似乎存在要求相同性的倾向,即如果一个分支中有括号,则到处都有括号。例如,Linux内核编码标准要求它。
答案 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)
我总是一直使用括号,除了我在释放之前检查变量为NULL的情况,就像在C中所必需的那样
在这种情况下,我确保通过将所有内容保持在一行来确定它是一个单一的声明,如下所示:
if (aString) free(aString);
答案 9 :(得分:1)
写上述陈述没有正确或错误的方法。有大量可接受的编码styles。但是,对我来说,我更喜欢在整个项目中保持编码风格。即。如果项目使用K&amp; R风格,则应使用K&amp; R。
答案 10 :(得分:1)
Sun的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; }
答案 11 :(得分:1)
Ruby很好地避免了讨论中的一个问题。单线的标准是:
do_something if (a == b)
和多行:
if (a == b)
do_something
do_something_else
end
这允许简洁的单行语句,但如果你从单行到多行,它会强制你重新组织语句。
这还没有(现在)可用于Java,也没有许多其他语言,AFAIK。
答案 12 :(得分: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块更简洁,但很容易看出发生了什么。
答案 13 :(得分:0)
我更喜欢
if (cond)
{
//statement
}
即使只有一个声明。如果你打算写一次,不要怀疑它是否有效,并且从未计划在另一个编码器上查看该代码,继续使用你想要的任何格式。但是,额外的包围真的花了你多少钱?一年中的时间少于输入这篇文章所需的时间。
是的,我也喜欢将括号缩进到块的级别。
Python很好,因为缩进定义了块。问题是用这样的语言没有实际意义。
答案 14 :(得分:0)
黄金法则是,在现有项目中工作时,请遵循这些编码标准。
当我在家时,我有两种形式。
第一个是单行:
if (condition) doThis();
,第二个是多行:
if (condition) {
doThis();
}
答案 15 :(得分: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
}
答案 16 :(得分:0)
我会在每个语句周围使用花括号,当且仅当至少其中一个语句需要它时。
答案 17 :(得分:0)
我过去常常遵循“使用花括号”这样的线条,就像一个政治家。但是,我修改了我的样式以允许在单行条件表达式上省略它们:
if(!ok)return;
对于任何多语句场景,我仍然认为大括号应该是强制性的:
if(!ok){
do();
that();
thing();
}
答案 18 :(得分:0)
我倾向于同意Joel Spolsky关于那篇文章(Making Wrong Code Look Wrong)并使用以下代码示例:
if (i != 0)
bar(i);
foo(i);
Foo现在是无条件的。真的很糟糕!
我总是在决策陈述中使用括号。它有助于代码的可维护性,并且使代码不易出错。
答案 19 :(得分:0)
我们的老板让我们在决定声明之后放置{},无论如何,即使它是一个单一的陈述。添加两条额外的线条真的很烦人。唯一的例外是三元运算符。
我想我的代码监视器在1200x1600的纵向方向上是一件好事。