152

我见过这样的代码:

if(statement)
    do this;
else
    do this;

但是,我认为这更具可读性:

if(statement){
    do this;
}else{
    do this;
}

由于这两种方法都有效,这仅仅是使用哪种方法的偏好问题,还是推荐一种方法而不是另一种方法?

4

15 回答 15

246

第一个版本的问题在于,如果您返回并在 if 或 else 子句中添加第二条语句而不记得添加花括号,您的代码将以意想不到的有趣方式中断。

在可维护性方面,使用第二种形式总是更聪明。

编辑:内德在评论中指出了这一点,但我认为也值得在这里链接。这不仅仅是一些象牙塔假设的废话:https ://www.imperialviolet.org/2014/02/22/applebug.html

于 2010-01-23T23:02:30.063 回答
131

省略语句块的一个问题是 else-ambiguity。那就是受 C 启发的语言忽略缩进,因此无法将其分开:

if(one)
    if(two)
        foo();
    else
        bar();

由此:

if(one)
    if(two)
        foo();
else
    bar();
于 2010-01-23T23:33:39.773 回答
41

我的一般模式是,如果它适合一行,我会这样做:

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();
}

最终,它归结为风格和可读性的主观问题。然而,一般的编程世界几乎分为两派(对于使用大括号的语言):要么一直无例外地使用它们,要么一直无例外地使用它们。我属于后者。

于 2010-01-23T23:03:03.000 回答
14

我遵循的“规则”是这样的:

如果“if”语句正在测试以执行某些操作(IE 调用函数、配置变量等),请使用大括号。

if($test)
{
    doSomething();
}

这是因为我觉得你需要弄清楚什么函数被调用,程序的流程在哪里,在什么条件下。让程序员准确了解在这种情况下调用了哪些函数以及设置了哪些变量,这对于帮助他们准确了解您的程序在做什么很重要。

如果“if”语句正在测试以停止做某事(循环或函数内的 IE 流控制),请使用单行。

if($test) continue;
if($test) break;
if($test) return;

在这种情况下,对程序员来说重要的是快速发现您不希望代码运行的异常情况,这都包含在 $test 中,而不是在执行块中。

于 2014-02-10T08:08:07.530 回答
11

我正在使用我使用的 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;
}
于 2010-01-23T23:02:53.883 回答
9

从一开始就使用大括号应该有助于防止您不得不调试这个:

if (statement)
     do this;
else
     do this;
     do that;
于 2010-01-23T23:04:22.327 回答
6

对所有 if 语句使用大括号,即使是简单的语句。或者,重写一个简单的 if 语句以使用三元运算符:

if (someFlag) {
 someVar= 'someVal1';
} else {
 someVar= 'someVal2';
}

像这样看起来好多了:

someVar= someFlag ? 'someVal1' : 'someVal2';

但是,只有在您绝对确定 if/else 块中没有其他内容时才使用三元运算符!

于 2010-01-23T23:18:07.760 回答
4

我更喜欢使用大括号。添加大括号使其更易于阅读和修改。

以下是一些使用大括号的链接:

于 2010-01-23T23:21:12.717 回答
3

根据我的经验,第一种形式的唯一(非常)轻微优势是代码可读性,第二种形式增加了“噪音”。

但是对于现代 IDE 和代码自动生成(或自动完成),我强烈建议使用第二种形式,您不会花费额外的时间输入花括号,并且可以避免一些最常见的错误。

有足够的能量消耗虫子,人们不应该打开门浪费时间。

编写代码时要记住的最重要的规则之一是一致性。无论是谁编写的,每一行代码都应该以相同的方式编写。严谨可以防止错误“发生”;)

这与清楚明确地命名您的变量、方法、文件或正确缩进它们是一样的......

当我的学生接受这个事实时,他们不再与自己的源代码作斗争,他们开始将编码视为一项非常有趣、刺激和创造性的活动。他们挑战的是他们的思想,而不是他们的神经!

于 2010-01-24T00:09:39.813 回答
2

这是一个偏好问题。我个人使用这两种样式,如果我有理由确定不需要添加更多语句,我会使用第一种样式,但如果可能的话,我会使用第二种。由于您无法在第一种样式中添加更多语句,因此我听说有些人建议不要使用它。但是,第二种方法确实会产生额外的代码行,如果您(或您的项目)使用这种编码风格,那么第一种方法对于简单的 if 语句来说是非常可取的:

if(statement)
{
    do this;
}
else
{
    do this;
}

但是,我认为这个问题的最佳解决方案是在 Python 中。使用基于空格的块结构,您没有两种不同的方法来创建 if 语句:您只有一种:

if statement:
    do this
else:
    do this

虽然这确实存在您根本无法使用大括号的“问题”,但您确实获得了这样的好处,即第一种样式不再有行,并且它具有添加更多语句的能力。

于 2010-01-23T23:05:29.450 回答
2

就我个人而言,我使用第一种样式只会抛出异常或过早地从方法返回。就像函数开头的参数检查一样,因为在这些情况下,我很少有不止一件事情要做,而且从来没有其他事情要做。

例子:

if (argument == null)
    throw new ArgumentNullException("argument");

if (argument < 0)
    return false;

否则我使用第二种风格。

于 2010-01-23T23:19:59.517 回答
1

我一直试图使我的代码标准并且看起来尽可能接近相同。这使得其他人在负责更新它时更容易阅读它。如果您执行第一个示例并在中间添加一行,它将失败。

不会工作:

如果(语句)这样做;还有这个; 否则这样做;

于 2010-01-23T23:02:21.910 回答
1

我个人的偏好是混合使用空格和括号,如下所示:

if( statement ) {

    // let's do this

} else {

    // well that sucks

}

我认为这看起来很干净,使我的代码非常易于阅读,最重要的是 - 调试。

于 2010-01-24T02:51:54.807 回答
0

我同意大多数答案,因为最好在代码中明确并使用大括号。我个人会采用一套编码标准,并确保团队中的每个人都知道并遵守这些标准。在我工作的地方,我们使用IDesign.net为 .NET 项目发布的编码标准。

于 2010-01-23T23:13:33.697 回答
0

我更喜欢放一个花括号。但有时,三元运算符会有所帮助。

代替 :

int x = 0;
if (condition) {
    x = 30;
} else {
    x = 10;
}

一个人应该简单地做:int x = condition ? 30 : 20;

还想象一个案例:

if (condition)
    x = 30;
else if (condition1)
    x = 10;
else if (condition2)
    x = 20;

如果你把花括号放进去会更好。

于 2010-01-29T08:00:51.587 回答