单行if语句或没有大括号的if语句是不良实践吗?

18
if (condition) { /* do something */ }
else { /* do something */ }

if (condition)
    /* do something */
else
    /* do something */

有人告诉我第一个实例不是个好主意。我不知道这是否真的是这种情况(或者第二个实例也是如此);这难道不能缩短输入的字符数吗?还是因为它只会产生混乱?

12个回答

35

最佳实践是编写易于他人阅读和更新的代码。

你的第一个形式存在问题,因为它不遵循大多数PHP开发人员习惯的形式:

if (condition) {
  // code
} else {
  // code
}

// ... or ...

if (condition)
{
  // code
}
else
{
  // code
}

// ... or ...

if (condition) { /* short code */ } else { /* short code */ }

// ... or ...

condition ? /* short code */ : /* short code */;

请注意,这完全是关于标准实践的问题,不一定合情合理 - 它只是关于其他开发人员习惯看到的内容。

更重要的是,你的第二种形式并不好,因为它会让另一个程序员犯这个错误变得容易:

if (condition)
  // code A
else
  // code B
  // code C (added by another programmer)
在这个例子中,另一个程序员添加了代码C,但忘记用大括号包装整个else块。这会导致问题。你可以通过简单地用大括号将你的if和else块包装起来来防止这种情况发生。

其实,我习惯于将大括号放在单独的一行。 - unrelativity
这是第二个最佳实践 - 最好的方法是以与原作者相同的风格编写 - 尽管我想这也是正确的 :) - Brian
6
我不同意第二点。只有一个非常糟糕的程序员才会这样做,即添加没有花括号的C代码。 - rlbond
2
@rlbond:或者是一个犯错误的好程序员。这种情况也是有可能发生的。 - Beska
5
或者只是一个非常糟糕的程序员,因为一个好的程序员在找不到闭合大括号时会意识到它。 - St. John Johnson

8

我的偏好是保持一致性...所以:

if(...)
{
   statement 1;
   statement 2;
}
else
{
   statement 1;
   statement 2;
}

与之无异:

if(...)
{
   statement 1;
}
else
{
   statement 1;
}

因此,我总是使用它们,因为它是一致的,并且避免了忘记稍后添加它们所带来的问题。

然而,其他人会看着我的代码,并认为在加入 { 和 } 是愚蠢的。他们有他们的理由,我有我的理由...... 我恰好更喜欢我的理由而不是他们的 :-)


干杯 :) 我也这么做,出于同样的原因:不要忘记稍后再添加花括号。我也喜欢将 { 放在新行而不是 if(condition){ 中,因为它并不总是可见的。 - Bogdan Constantinescu

5
一般来说,不可读的代码是一种不好的实践。尽管单行代码在输入时更有效率且节省行数,但一年后或者在查找错误时会让处理过程变得更加困难。
在我看来,使用单行if语句是一种不好的实践。
计算机并不在乎(据我所知),但你应该总是写你的代码,就好像它将被一个知道你住在哪儿的连环杀手维护一样。
易读!容易自主辨别。

@jerebear 这更像是一条评论而不是一个答案 :) - eglasius

4
我看到的问题是开发人员在添加代码到其中一个条件时,没有意识到{}-less-if。例如:
//before
if(something)
    statement;

//after
if(something)
    statement;
    addedstatement;

显然,这不会达到他们的预期。

1
我认为这是因为他们不理解这门语言。通常我不会试图为那些不懂我写的语言的人量身定制我的代码。话虽如此,如果在特定情况下变得不太易读,即使是专家也可能仍然有困难。 - Bob Gettys

3
你是否曾经在C或C++中看到过像这样的代码?
    /*  Warning:  bogus C code!  */

if (some condition)
        if (another condition)
                do_something(fancy);
else
        this_sucks(badluck);

要么是缩进有误,要么程序有bug,因为“else”总是应用于最近的“if”,除非使用花括号。 (让我们只使用Python。没有括号,只有纯净的空格。 :P)

1

对于除了最短语句之外的所有语句,使用大括号并相应地进行间隔。你要这样做有几个原因:

  • 更难出错。

  • 更容易阅读。

  • 在具有宏扩展功能的语言(例如 C、C++)中,如果未包含大括号,则在未加大括号的 if-else 中展开包含多个语句的宏时会导致混乱的逻辑错误。


1
使用多行的一个主要好处是易于调试。如果您在一行上有一个if else语句,并且调试器告诉您x行出了问题,那么确定哪个部分失败更加困难。多行也使得使用调试器逐步执行代码更容易。

0

这更多是编码风格问题。话虽如此,我的个人观点是你的第二个例子可能会带来潜在的危害。在只有花括号可以创建代码块的语言中,很容易意外地“添加第二行到代码块”。但在 PHP 中,由于存在另一种语法,这种情况更不可能引起必要的警报:

if ($_GET["asdf"]==1):
    /* do something */
else:
    /* do something */
endif;

经验之谈:如果你要把“做某事”放在单独的一行上,就使用大括号;如果你不打算使用大括号,就把它放在同一行上!

0

这是我记得很久以前在一次就业考试中遇到的问题。代码类似于以下内容:

if (x == 0)
    x = 2;
else
    print("x is: %d", x); // debugging!
    x = 4;

大多数人都能发现错误,但你可以将任何你想要替换的“坏代码”插入其中。更微妙的错误出现在你注释掉了“旧版本”的某些内容,而有人取消了注释,突然第二个语句就在块外面了。

基本上,除非它是一个小型测试应用程序,以快速学习概念为目的,否则我总是加上括号(即使在测试应用程序中,我通常也会加上)。如果我不这样做,即使在5行方法中,以后也不值得头疼。


0
你应该将 "if" 和 "do something" 放在不同的行上,以使你的代码更加友好,便于交互式调试器进行调试。
如果你将 "if" 和 "do something" 放在同一行上,那么你就不能仅在 "do something" 行上设置断点了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接