哪个更好/更普遍被接受?
这个:
if(condition)
{
statement;
}
要么:
if(condition)
statement;
我倾向于第一个,因为我认为它可以更容易地判断if块中的实际内容,它可以避免其他人以后添加花括号(或忘记创建错误),并使所有if语句统一,而不是一些带有大括号,而另一些则没有。但是,第二个在语法上仍然是正确的,并且绝对更紧凑。我很好奇,尽管看到哪个更受其他人青睐。
statement if condition;
呢?
哪个更好/更普遍被接受?
这个:
if(condition)
{
statement;
}
要么:
if(condition)
statement;
我倾向于第一个,因为我认为它可以更容易地判断if块中的实际内容,它可以避免其他人以后添加花括号(或忘记创建错误),并使所有if语句统一,而不是一些带有大括号,而另一些则没有。但是,第二个在语法上仍然是正确的,并且绝对更紧凑。我很好奇,尽管看到哪个更受其他人青睐。
statement if condition;
呢?
Answers:
第一个更好,因为第二个容易出错。例如,假设您要暂时注释掉代码以调试某些内容:
if(condition)
// statement;
otherStatement;
或急着添加代码:
if(condition)
statement;
otherStatement;
这显然是不好的。另一方面,第一个有时确实太冗长。因此,我宁愿将所有内容都放在短而简单的一行上:
if(condition) statement;
这减少了语法噪音,同时使构造看起来像实际一样,从而减少了出错的可能性。只要该语法仅用于非常简单,简短的条件和语句,我就会发现它完全可读。
我希望尽可能不使用花括号的版本。
以下解释冗长。请多多包涵。我会给出一个令人信服的理由让我偏爱这种风格。我还将解释为什么我认为通常的反驳不成立。
这样做的原因是,闭合花括号需要额外的代码行-取决于样式,打开花括号也是如此。1个
这有什么大不了的吗?表面上没有。毕竟,大多数人还在其代码中插入空行以分隔逻辑上略微独立的块,从而大大提高了可读性。
但是,我讨厌浪费垂直空间。现代显示器实际上具有足够的水平空间。但是垂直空间仍然非常非常有限(除非您使用垂直放置的显示器,这种情况并不少见)。这种有限的垂直空间是一个问题:众所周知,单个方法应尽可能短,并且相应的花括号(或其他块定界符)的高度应不超过屏幕高度,以便您可以看到整个块而没有滚动。
这是一个根本性的问题:一旦您无法再在屏幕上看到整个块,就很难掌握。
结果,我讨厌多余的空行。单个空行对于分隔独立的块至关重要(只看这段文字的外观),连续的空行在我的书中是很不好的样式(根据我的经验,它们通常是新手程序员的标志)。
同样,应该简单地撑起撑杆的线就可以了。用大括号分隔的单语句块浪费一到两行。每个屏幕高度只有50条线,这很明显。
只有一个反对删除括号的论点:有人稍后将另一个语句添加到所讨论的块中,而忘记添加括号,从而无意中更改了代码的语义。
这确实是一件大事。
但是根据我的经验,事实并非如此。我是个草率的程序员。但是,在我十年的编程经验中,我可以诚实地说,当我在单例代码块中添加额外的语句时,我从未忘记添加括号。
我什至觉得这是一个普遍的错误是难以置信的:块是编程的基本组成部分。块级分辨率和作用域对于程序员来说是一个自动的,根深蒂固的思维过程。大脑只是这样做(否则,进行编程的推理会困难得多)。记住花括号不需要额外的精力:程序员毕竟还记得正确地缩进新添加的语句。因此,程序员已经在脑海中处理了涉及块的问题。
现在,我并不是说省略括号不会导致错误。我的意思是,我们没有一种或另一种证据。我们根本不知道它是否会造成伤害。
因此,在有人向我展示从科学实验中收集到的硬数据,证明这确实是一个问题之前,该理论仍然是一个“ 讲故事的故事 ”:一个非常引人注目的假设,从未得到检验,并且必须不被用作一个参数。
1这个问题有时可以通过将所有内容(包括括号)放在同一行来解决:
if (condition)
{ do_something(); }
但是,我可以肯定地说,大多数人都鄙视这一点。此外,与不带花括号的变体一样,它也会遇到同样的问题,因此这是两个世界中最糟糕的一个。
我将使用以下内容(此处为共识):
if (condition) {
any_number_of_statements;
}
也可能:
if(condition) single_compact_statement;
不太好,尤其是在类似于C / C ++的语言中:
if(condition)
single_compact_statement;
(在Python中没有选择;-)
在Perl中,您将使用:
$C = $A**3 if $A != $B;
要么
$C = $A**3 unless $A == $B;
(这不是伪代码;-)
if
子句后的单行上的单个语句看起来不错,那么我不使用花括号。对于任何其他if
语句(或使用多行的任何语句),我始终使用花括号。特别是,如果有else
子句,则每种情况总是带有大括号。
<statement> if <condition>
或多块样式if <condition>
/ <do something>
/ end
(红宝石避免牙套,所以这里的开括号暗示由if
与端支具由一个立即替换end
)。它甚至不提供怪异的多行,但实际上只是单行的if语句。
没有括号。如果其他程序员在我的代码中添加了第二条语句,那无非是我的错,就像我让某人驾驶汽车而他们越过悬崖一样。
在这里,我们已经多次讨论了这种观点,总体共识是始终使用大括号。主要原因是关于可读性/可维护性。
如果需要将代码添加到if
块中,则无需记住/搜索括号。当未来的程序员阅读代码时,花括号总是明确的。
从好的方面来说,ReSharper会自动为Visual Studio中的懒惰程序员添加花括号,并且我假设也有其他IDE的插件。
我使用第一种语法,几乎没有例外。因为它不能被误解。
“不要让我思考”不仅仅适用于用户界面,你们都;-)
我个人更喜欢第二种。第一个看起来丑陋,笨拙,并且浪费了水平空间。第二个问题的主要问题是宏,人们在以后修改您的代码时弄错了。
为此,我说“不要使用宏”。我还说,“正确缩进该死的代码”。考虑到每个用于编程的文本编辑器/ IDE如何自动执行缩进,这并不难做到。在Emacs中编写代码时,我将使用自动缩进来确定我是否在上一行中写错了什么。每当Emacs开始加紧缩进时,我通常都知道我做错了什么。
实际上,我最终会遵循摆在我面前的任何编码约定。但是这些使我烦恼(当我用Python编写代码时,这让我更加快乐,而整个支架灾难已经过去了):
if (condition) {
statement;
} // stupid extra brace looks ugly
然后
if (condition) // the brackets have now just become noise
{ statement; } // also can't see the indentation, harder to read
坦白地说,if语句中的两个语句比单个语句更令人讨厌。通常是因为需要使用then括号,并且if语句中只有两个语句仍然显得很有趣。
我使用不带大括号的两行版本(第二种形式),但不是为了节省空间。
我使用该表格是因为我发现它更易读,更吸引人并且更易于键入。我仅在满足这些条件的情况下使用该表格;也就是说,if
条件必须很好地适合于单行,而相应的语句必须很好地适合于下一行。如果不是这种情况,那么我将使用花括号来提高可读性。
如果使用此表单,请确保在if
语句之前(或之后,如果有的话)之前有空行(或仅包含大括号的行)。虽然这不是我有意识地遵循的规则,但在阅读了此问题后,我现在注意到了。
节省屏幕空间对我来说不是优先事项。如果我需要更多空间,可以使用更大的显示器。屏幕已经足够大,可以阅读任何我可能需要关注的内容。我不太可能一次需要专注于这么多的代码行,以至于它们占据了我的整个屏幕。如果嵌套大量的代码,以至于我无法一次查看更多的代码就无法理解它,那么我将不得不考虑重构是否可以更好地表现逻辑。
下面是一些示例,这些示例演示了如何使用这种形式的if
语句。
string GuardConditions(Plan planForWorldDomination)
{
if (planForWorldDomination == null)
throw new ArgumentNullException("planForWorldDomination");
if (!planForWorldDomination.IsComplete())
return "Doh!";
planForWorldDomination.Execute();
}
void ProcessingLogic()
{
OneBlankLineAbove();
if (simpleCondition)
simpleStatement();
OneBlankLineBelow();
OneBlankLineAbove();
// optional comment on the line above an if statement
if (simpleCondition)
simpleStatement();
OneBlankLineBelow();
}
void Assignment(string drive)
{
OneBlankLineAbove();
string prompt;
if (simpleCondition)
prompt = "simple assignment";
else
prompt = null;
OneBlankLineBelow();
}
string Return()
{
OneBlankLineAbove();
if (simpleCondition)
return "simple return";
else
return null;
OneBlankLineBelow();
}
大括号。总是。我喜欢它们,因为它使代码具有一定的一致性。而且,正如@dsimcha所写-添加其他代码行时出错的机会较小。
与在代码调试和/或添加代码的情况下可能发生的额外工作相比,单行代码花括号的“丑陋”危害较小。
为了安全起见,我几乎总是使用括号。但是,有时候,如果该块的内容确实很短,我会不理会它们,并使其成为单线形式,如下所示:
if (x==5) Console.WriteLine("It's a five!");
我更喜欢用大括号来保持一致性,但不要浪费太多的空格(因此在我有限的视野中,格式更可读的代码)。因此,我将这段代码写得足够短:
If (cond) { statement; }
我通常使用花括号,但在某些情况下我不使用花括号。
object GetObject() {
// calculate obj1
if(obj1 != null)
return obj1;
// calculate obj2
if(obj2 != null)
return obj2;
// calculate obj3
if(obj3 != null)
return obj3;
return defaultObj;
}
对我来说,将它们添加到那里只是愚蠢的。如果有人在后面添加了一条语句,那么return
我们会遇到比范围界定问题更大的问题。
return (obj != null) ? obj : "Error";
Object returnObj = defaultObj; /* Three else-if's to change it to obj1/2/3 */ return returnObj;
。