我看过这样的代码:
if(statement)
do this;
else
do this;
但是,我认为这更具可读性:
if(statement){
do this;
}else{
do this;
}
既然这两种方法都起作用,那么这仅仅是使用偏好还是会推荐一种方法而不是另一种方法?
我看过这样的代码:
if(statement)
do this;
else
do this;
但是,我认为这更具可读性:
if(statement){
do this;
}else{
do this;
}
既然这两种方法都起作用,那么这仅仅是使用偏好还是会推荐一种方法而不是另一种方法?
Answers:
第一个版本的问题在于,如果您回过头向if或else子句添加第二条语句而又不记得要添加花括号,那么您的代码将以意想不到的有趣方式中断。
在可维护性方面,使用第二种形式总是更聪明。
编辑:内德在评论中指出了这一点,但我认为也值得链接到这里。这不仅是一些象牙塔的废话:https : //www.imperialviolet.org/2014/02/22/applebug.html
if (…) { goto L; goto L; }
但忘记了花括号。``如果(...){转到L; 转到L; }`碰巧不是安全漏洞,因为它仍然是一个错误(不是一个有安全后果的错误)。在另一个示例中,事情可能朝着相反的方向发展,无括号的代码可能会意外地安全。在第三个示例中,无括号代码最初将是无错误的,并且开发人员将在添加括号时引入错字。
遗漏语句块的一个问题是else-歧义。那就是受C语言启发的语言会忽略缩进,因此无法将其分开:
if(one)
if(two)
foo();
else
bar();
由此:
if(one)
if(two)
foo();
else
bar();
else
绑定贪婪地绑定到最近的,最里面的if
。问题出在不了解,不考虑或还没有喝咖啡的人正在使用C或类似语言编写代码时-他们编写了认为可以做一件事的代码,但是语言规范说解析器必须做其他事情,这可能会大不相同。是的,这是另一个坚如磐石的论点,主张即使语法在理论上将括号标记为“不必要的”,也要始终包含括号。
我的一般模式是,如果它适合一行,我会这样做:
if(true) do_something();
如果有一个else子句,或者如果我想执行的代码true
长度很大,请一直将其括起来:
if(true) {
do_something_and_pass_arguments_to_it(argument1, argument2, argument3);
}
if(false) {
do_something();
} else {
do_something_else();
}
最终,它归结为样式和可读性的主观问题。但是,一般的编程世界几乎分为两方(对于使用花括号的语言):要么一直无一例外地使用它们,要么一直无例外地使用它们。我属于后者。
if(true){ do_something(); }
为什么要趁这个机会让另一个程序员介绍一个严重的错误(查找Apple的“ goto fail”总ssl代码错误)。
我正在使用所使用的IDE的代码格式化程序。可能有所不同,但是可以在“首选项/选项”中进行设置。
我喜欢这一个:
if (statement)
{
// comment to denote in words the case
do this;
// keep this block simple, if more than 10-15 lines needed, I add a function for it
}
else
{
do this;
}
我遵循的“规则”是这样的:
如果“ if”语句正在测试以便执行某些操作(IE调用函数,配置变量等),请使用花括号。
if($test)
{
doSomething();
}
这是因为我觉得您需要弄清楚在什么条件下正在调用什么函数以及程序的流向。让程序员确切地了解在这种情况下调用了哪些函数以及设置了哪些变量,对于帮助他们确切地了解您的程序在做什么很重要。
如果正在测试“ if”语句以停止执行某项操作(循环或函数中的IE流控制),请使用一行。
if($test) continue;
if($test) break;
if($test) return;
在这种情况下,对程序员来说重要的是迅速发现哪些异常情况是您不希望代码运行的,而所有这些情况都包含在$ test中,而不是在执行块中。
从一开始就拥有大括号,这将有助于防止您不得不调试以下内容:
if (statement)
do this;
else
do this;
do that;
;
:)
根据我的经验,第一种形式的唯一(非常)轻微的优势是代码可读性,第二种形式增加了“噪音”。
但是,强烈建议使用第二种形式的现代IDE和代码自动生成(或自动完成)功能,这样您就不必花更多的时间键入花括号,并且可以避免一些最常见的错误。
有足够多的耗能虫子,人们只是不应该浪费大量时间而开门。
编写代码时要记住的最重要规则之一是一致性。无论是谁编写的,每一行代码都应以相同的方式编写。严谨防止错误“发生”;)
这与清楚明确地命名变量,方法,文件或正确缩进它们相同...
当我的学生接受这一事实时,他们就不再与自己的源代码作斗争,他们开始将编码视为一项非常有趣,刺激和创造性的活动。他们挑战自己的思想,而不是他们的神经!
这是一个优先事项。我个人使用这两种样式,如果我有把握地确定不再需要添加其他语句,则使用第一种样式,但如果可能,则使用第二种样式。由于您无法再向第一种样式添加语句,因此我听说有人建议不要使用它。但是,第二种方法的确增加了一行代码,如果您(或您的项目)使用这种编码风格,则第一种方法非常适合简单的if语句:
if(statement)
{
do this;
}
else
{
do this;
}
但是,我认为解决此问题的最佳方法是使用Python。使用基于空白的块结构,您没有两种不同的方法来创建if语句:您只有一种:
if statement:
do this
else:
do this
尽管确实有一个“问题”,您根本无法使用花括号,但您的确获得了好处,即第一种样式不再包含任何行,并且可以添加更多语句。
我同意大多数答案,因为最好在代码中明确使用大括号。我个人将采用一套编码标准,并确保团队中的每个人都知道并遵守。在我工作的地方,我们使用IDesign.net为.NET项目发布的编码标准。