单一决策和行动陈述的首选样式是什么?
对于支持无括号的单一决策和行动的语言,例如以下示例:
if (var == true) doSomething();
编写此内容的首选方式是什么?应该始终使用方括号,还是应该将其用法留给单个开发人员使用?此外,这种做法是否取决于代码块的大小,例如下面的示例:
if (var == 1) doSomething(1); else if (var > 1 && var < 10) doSomething(2); else { validate(var); doSomething(var); }
解决方案
回答
只要我们与它保持一致,就没有关系。
在单个语句中似乎确实存在要求相同性的趋势,即如果一个分支中有方括号,那么到处都有方括号。 Linux内核编码标准就是其中之一。
回答
老板让我们将{}放在决策声明之后,无论它是什么,即使只是一个声明。添加两条额外的行确实很烦人。唯一的例外是三元运算符。
我想这是一件好事,因为我的代码监视器的纵向分辨率为1200x1600。
回答
我的偏好是保持一致,例如,如果在一个块上使用方括号,则即使仅使用一条语句,也要在整个方括号中使用方括号:
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放在同一行)。
回答
确实没有正确的答案。这就是公司内部的编码标准。如果我们可以在整个公司范围内保持一致,那么它将很容易阅读。我个人喜欢
if ( a == b) { doSomething(); } else { doSomething(); }
但这是一场神圣的战争。
回答
除了在释放变量之前检查变量是否为NULL的情况(如C中的必要条件)外,我一直都使用方括号
在这种情况下,我通过将所有内容保持在一行中来确保它是单个语句,如下所示:
if (aString) free(aString);
回答
我建议
if(a==b) { doSomething(); }
因为我发现提前完成它比在成功条件中添加第二条语句时要记得记住添加花括号要容易得多...
if(a==b) doSomething(); doSomethingElse();
与...有很大的不同
if(a==b) { doSomething(); doSomethingElse(); }
有关更多详细信息,请参见Joel的文章。
回答
我倾向于一直使用大括号。在开始时,我们可能会遇到一些细微的错误,例如:
if(something) DoOneThing(); else DoItDifferently();
然后决定将另一个操作添加到else
子句中,而忘记将其用大括号括起来:
if(something) DoOneThing(); else DoItDifferently(); AlwaysGetsCalled();
" AlwaysGetsCalled()"将始终被调用,如果我们凌晨3点坐在那里,想知道为什么代码表现出所有奇怪的现象,类似的事情可能会在相当长的一段时间内使我们困惑。仅出于这个原因,我总是使用大括号。
回答
编写以上声明没有正确或者错误的方法。有很多公认的编码样式。但是,对我来说,我更喜欢在整个项目中保持编码风格一致。 IE。如果项目使用K&R样式,则应使用K&R。
回答
我强烈建议始终使用花括号,即使它们是可选的。为什么?采取以下C ++代码块:
if (var == 1) doSomething(); doSomethingElse();
现在,某个人并没有真正引起足够的重视,并决定如果(var == 1)需要做一些额外的事情,所以他们这样做:
if (var == 1) doSomething(); doSomethingExtra(); doSomethingElse();
仍然缩进得很漂亮,但是它并没有达到预期的效果。
通过始终使用花括号,我们更有可能避免此类错误。
回答
我倾向于在该文章的Joel Spolsky(用错误的代码看错)上同意以下代码示例:
if (i != 0) bar(i); foo(i);
Foo现在是无条件的。真是太糟糕了!
我总是在决策声明中使用方括号。它有助于提高代码的可维护性,并减少代码的易错性。
回答
我更喜欢
if (cond) { //statement }
即使只有一条语句。如果我们打算编写一次内容,毫无疑问,它是可行的,并且从未计划过使用另一个编码器来查看该代码,请继续使用所需的任何格式。但是,额外的包围到底要花多少钱呢?一年中的时间少于键入此帖子所需的时间。
是的,我也想将方括号缩进方块的高度。
Python很不错,因为缩进定义了块。问题是用这样的语言来解决的。
回答
我过去经常遵循"总是使用花括号"这一行,就像一个apparatchik。但是,我修改了样式,以允许在单行条件表达式中省略它们:
if(!ok)return;
对于任何多语句场景,我仍然认为大括号应该是强制性的:
if(!ok){ do(); that(); thing(); }
回答
Ruby很好地消除了讨论中的一个问题。单线的标准是:
do_something if (a == b)
对于多行:
if (a == b) do_something do_something_else end
这样可以使用简洁的单行语句,但是如果我们从单行转到多行,则会强制我们重新组织该语句。
目前尚无法使用Java或者AFAIK多种其他语言来使用此功能。
回答
就像其他人提到的那样,在没有大括号的情况下在两行中执行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块更简洁,但很容易看到发生了什么。
回答
可以用缺乏经验的方式来解决这个问题,但是在我作为代码猴子的七年时间里,我从未真正看到任何人在向没有括号的代码块中添加代码时没有犯括号的错误。恰好是零倍。
而且,在胡扯之前,不是,原因不是"每个人都总是使用牙套"。
因此,一个诚实的问题-我真的很想得到实际的答复,而不只是拒绝投票:这真的发生了吗?
(编辑:我已经听到了足够多的关于外包的恐怖故事,可以澄清一下:有能力的程序员实际上会发生这种情况吗?
回答
我个人支持Code Complete的McConnell的解释。
尽可能使用它们。它们提高了代码的可读性,并消除了可能发生的少量稀疏的混淆。
但是有一件事更重要。。。一致性。使用哪种样式,请确保始终以相同的方式进行。
开始编写如下内容:
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 }
请不要回答这个问题,因为这将是一个新问题。如果我对此感兴趣,将打开一个新问题,请输入意见。
回答
当且仅当其中至少一个需要时,我才会在每个语句周围使用花括号。
回答
Sun的Java编程语言代码约定说:
The if-else class of statements should have the following form: if (condition) { statements; } if (condition) { statements; } else { statements; } if (condition) { statements; } else if (condition) { statements; } else { statements; }
回答
在Perl中,如果我们要进行简单的测试,有时我们会以这种形式编写它:
do_something if condition; do_something unless condition;
在子例程开始时检查参数非常有用。
sub test{ my($self,@args) = @_; return undef unless defined $self; # rest of code goes here }
回答
黄金法则是,在现有项目中工作时,请遵循那些编码标准。
当我在家时,我有两种形式。
第一是单行:
if (condition) doThis();
第二个是用于多行:
if (condition) { doThis(); }