如果是块,则使用单个语句-大括号或否?[关闭]


59

哪个更好/更普遍被接受?

这个:

if(condition)
{
  statement;
}

要么:

if(condition)
  statement;

我倾向于第一个,因为我认为它可以更容易地判断if块中的实际内容,它可以避免其他人以后添加花括号(或忘记创建错误),并使所有if语句统一,而不是一些带有大括号,而另一些则没有。但是,第二个在语法上仍然是正确的,并且绝对更紧凑。我很好奇,尽管看到哪个更受其他人青睐。


2
但是您的撑杆位置错误。可以肯定的是。
克里斯蒂安·曼

在许多语言中,块是一个语句,因此,从句法上讲,它始终是if(表达式)语句
Ingo

2
由于您未指定语言,所以statement if condition;呢?
Dave Sherohman 2011年

@克里斯蒂安-好人。这将是另一个问题,不是吗?
Zannjaminderson 2011年

@Ingo-好点。
Zannjaminderson 2011年

Answers:


131

第一个更好,因为第二个容易出错。例如,假设您要暂时注释掉代码以调试某些内容:

if(condition) 
//      statement;
otherStatement;

或急着添加代码:

if(condition) 
    statement;
    otherStatement;

这显然是不好的。另一方面,第一个有时确实太冗长。因此,我宁愿将所有内容都放在短而简单的一行上:

if(condition) statement;

这减少了语法噪音,同时使构造看起来像实际一样,从而减少了出错的可能性。只要该语法仅用于非常简单,简短的条件和语句,我就会发现它完全可读。


35
关于将所有内容放在一条线上的好点。
尼尔·艾特肯

7
@artjomka:如果语句很长,并且必须自己行,那么我使用花括号来提高可读性。关键是,您需要一个最短,语法上最不嘈杂的结构,该结构对于正在快速阅读而不是对其进行仔细检查的人来说是明确的。
dsimcha 2010年

15
由于上面提到的原因,我更喜欢带括号的。我不喜欢这种单行代码,因为当我在调试器中越过代码行时,发生的事情并不会立即显而易见。我必须采取单独的步骤来查看条件评估结果。
Jim A

10
@TMN空格是免费的,监视器很大,您的大脑学会识别有助于您解析代码的形状。
Murph '11

5
@Murph:空格是免费的吗?我一定错过了。在我的屏幕上,它占用了很大的空间。实际上远远超过50%。在我的书中,这似乎是一大浪费。就个人而言,我喜欢在代码中最大化每平方厘米的内容。
康拉德·鲁道夫

44

为了安全起见,我总是使用方括号。

编写它时很好,但是您知道将来有人会出现,并插入另一个语句而不用括号括起来。


20
人们真的看到这种情况了吗?我认为我在10年的编程中从未见过。也许我只是被庇护了。:)
大卫2010年

9
我很想说不,但可悲的是我看到了。
尼尔·艾特肯

13
您总是使用方括号,这样您就永远不会忘记使用方括号-就这么简单。
Murph

12
+1到@Murph。同样的原因,当没人在停车场和停车场时,我会使用转向信号灯!
丹·雷

7
这是一个很好的做法,有助于防止从分支到主干或跨分支合并时出现错误。
JBRWilkinson

27

我希望尽可能不使用花括号的版本

以下解释冗长。请多多包涵。我会给出一个令人信服的理由让我偏爱这种风格。我还将解释为什么我认为通常的反驳不成立。

(近)空行是浪费

这样做的原因是,闭合花括号需要额外的代码行-取决于样式,打开花括号也是如此。1个

这有什么大不了的吗?表面上没有。毕竟,大多数人还在其代码中插入空行以分隔逻辑上略微独立的块,从而大大提高了可读性。

但是,我讨厌浪费垂直空间。现代显示器实际上具有足够的水平空间。但是垂直空间仍然非常非常有限(除非您使用垂直放置的显示器,这种情况并不少见)。这种有限的垂直空间一个问题:众所周知,单个方法应尽可能短,并且相应的花括号(或其他块定界符)的高度应不超过屏幕高度,以便您可以看到整个块而没有滚动。

这是一个根本性的问题:一旦您无法再在屏幕上看到整个块,就很难掌握。

结果,我讨厌多余的空行。单个空行对于分隔独立的块至关重要(只看这段文字的外观),连续的空行在我的书中是很不好的样式(根据我的经验,它们通常是新手程序员的标志)。

同样,应该简单地撑起撑杆的线就可以了。用大括号分隔的单语句块浪费一到两行。每个屏幕高度只有50条线,这很明显。

省略大括号可能没有害处

只有一个反对删除括号的论点:有人稍后将另一个语句添加到所讨论的块中,而忘记添加括号,从而无意中更改了代码的语义。

这确实是一件大事。

但是根据我的经验,事实并非如此。我是个草率的程序员。但是,在我十年的编程经验中,我可以诚实地说,当我在单例代码块中添加额外的语句时,我从未忘记添加括号。

我什至觉得这是一个普遍的错误是难以置信的:块是编程的基本组成部分。块级分辨率和作用域对于程序员来说是一个自动的,根深蒂固的思维过程。大脑只是这样做(否则,进行编程的推理会困难得多)。记住花括号不需要额外的精力:程序员毕竟还记得正确地缩进新添加的语句。因此,程序员已经在脑海中处理了涉及块的问题。

现在,并不是说省略括号不会导致错误。我的意思是,我们没有一种或另一种证据。我们根本不知道它是否会造成伤害。

因此,在有人向我展示从科学实验中收集到的硬数据,证明这确实是一个问题之前,该理论仍然是一个“ 讲故事的故事 ”:一个非常引人注目的假设,从未得到检验,并且必须被用作一个参数。


1这个问题有时可以通过将所有内容(包括括号)放在同一行来解决:

if (condition)
{ do_something(); }

但是,我可以肯定地说,大多数人都鄙视这一点。此外,与不带花括号的变体一样,它也会遇到同样的问题,因此这是两个世界中最糟糕的一个。


6
省略花括号会损害可读性,并且在修改代码时很容易引起问题。
乔什(Josh K)2010年

15
@Josh:第一个声明是荒谬的,因为诸如Python之类的语言显示出来(如果您认为不是,请提供证据)。我的回答中已经提到了第二个问题。您有证据支持吗?否则,您的评论表明您实际上尚未阅读我的文字。请在批评之前这样做。
康拉德·鲁道夫

8
+1代表您的想法,但我认为您的立场是自欺欺人的。您说“向我展示从科学实验中收集到的硬数据,表明这确实是一个实际问题”,但您只能依靠传闻经验(自己的经验)来捍卫自己的立场。您说,“以我的经验……在我十年的经验中……我发现这简直令人难以置信……”,依此类推。您能否显示从科学实验中收集到的硬数据,以支持您的主张“省略括号不会造成伤害”?支持观点时,个人经验会很好,但是不要要求提供比您愿意提供的更多的“证据”。
bedwyr 2010年

3
@bedwyr:但是,在质量上有所不同。首先,我明确指出我实际上会被数据说服,并且我同样清楚地表明,我只是一个假设,没有数据支持。其次,我已经(至少对我而言)提出了一个合理的论据,因为我相信该主张是错误的,以及为什么需要佐证。这导致我第三点:这里的责任在于反对派证明他们的主张,而不是由我来反对。除了合理性问题外,我还展示了一个与事实无关的事实论据,该论据支持我的编码风格。
康拉德·鲁道夫

4
@Konrad-python 不会显示其他内容,因为缩进量很大,因此括号是隐式的。优秀的聪明程序员,即使是这样的人,也可能根本不会经常犯错误(在很多年中,我可能只几次见过问题),但其中很多都不太好那里的程序员做愚蠢的事情,这就是为什么首先需要编码标准的原因之一。(而且由于截止日期和压力会使我们最好的人变得不那么好。)
Murph 2010年

19

我同意第二点。它更简洁,更简洁。

我尽量不要写最低的公分母,所以我希望其他开发人员知道如何在当今的编程中编写一种最常见的控制流结构。


11
绝对!毕竟,如果代码很难编写,那么也应该很难维护!;-)
史蒂文·洛

3
@Steven如果忘记了括号,我认为这里还有其他问题。
TheLQ

更简洁==较少冗长
UncleZeiv

5
@SnOrfus:有点讽刺,因为多余的2个字符是微不足道的开销,可以防止非常常见的维护错误。您的里程可能会有所不同;-)
史蒂文·洛

1
对我来说,缩进可以清楚地表明发生了什么。第一种形式会消耗额外的屏幕空间,因此对我不利。
罗伦·佩希特尔

16

我将使用以下内容(此处为共识):

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;

(这不是伪代码;-)


1
我的想法正好。如果该if子句后的单行上的单个语句看起来不错,那么我不使用花括号。对于任何其他if语句(或使用多行的任何语句),我始终使用花括号。特别是,如果有else子句,则每种情况总是带有大括号。
eswald

9
我以前从未见过有人将perl与伪代码混淆。随机字符是,伪代码-否。
Joe D

3
我想知道是否有人通过将/ dev / random连接到Perl解释器而制成了Perl程序生成器?
Christian Mann 2010年

我在这里喜欢红宝石的方法。它提供了perl的风格单行<statement> if <condition>或多块样式if <condition>/ <do something>/ end(红宝石避免牙套,所以这里的开括号暗示由if与端支具由一个立即替换end)。它甚至不提供怪异的多行,但实际上只是单行的if语句。
本李

单行代码不适用于大多数调试器(当将要执行“ if”子句的内容时,无法触发中断)。
彼得·莫滕森

11

我使用花括号方法-出于上述所有原因,再加上一个。

代码合并。如果我的单语句工作被自动合并破坏了,那将发生在我所做的项目中。可怕的是,即使代码错误,缩进看起来也正确,因此这种类型的错误很难发现。

因此,我坚持使用大括号-靠自己行。这样更容易发现水平。是的,它确实浪费了垂直屏幕的空间,这是真正的缺点。总的来说,我认为这是值得的。


10

没有括号。如果其他程序员在我的代码中添加了第二条语句,那无非是我的错,就像我让某人驾驶汽车而他们越过悬崖一样。


3
究竟!他/她不知道语法不是我们的错。
kirk.burleson

3
不好的例子。一个很好的例子是脚踏板放错位置的汽车-用汽油代替刹车。这是你的车,所以你不在乎别人。他们不知道您对踏板的独特定位存在问题。您是这种情况下的优秀汽车工程师吗?
yegor256

如果您知道他们可能喝醉了,就给他们开车,这是您的错。同样,我们应该尽量少考虑未来的开发人员,以帮助简化维护。
Aram Kocharyan 2014年

8

在这里,我们已经多次讨论了这种观点,总体共识是始终使用大括号。主要原因是关于可读性/可维护性。

如果需要将代码添加到if块中,则无需记住/搜索括号。当未来的程序员阅读代码时,花括号总是明确的。

好的方面来说,ReSharper会自动为Visual Studio中的懒惰程序员添加花括号,并且我假设也有其他IDE的插件。


3
我绝对不购买可读性声明。Python是目前最易读的语言之一,不需要定界符。这种说法是不正确的。我也不会购买可维护性声明,因为到目前为止尚未得到证实,并且仍在不断重复。但是在这种情况下,我实际上对经验证据非常感兴趣。这是一项研究可以很容易地发现并一劳永逸地解决的问题。
康拉德·鲁道夫

由于Python使用缩进而不是定界符,因此它们是隐式的,这不是有效的比较。
Murph

@Konrad-经验证据:当我是一名新程序员时,我个人将代码添加到了一个不带括号的if块中,而没有意识到以前的程序员没有花括号。我亲眼看到其他人用自己的眼睛这样做。当然,只有一次我看到有人需要帮助才能在运行他们的代码后发现问题,但这更多与不良的测试技能有关。
shimonyk,2010年

@shimonyk:所以基本上您的观察支持我的断言,这个问题无关紧要?顺便说一句,个人观察是轶事,它们不算作经验证据。
康拉德·鲁道夫

@Konrad很好,请也引用您的消息来源。我假设您有同行参考的双盲研究,您正在参考吗?如果不是这样,那么就不仅仅是flo弄自己的轶事,以试图证明别人是错误的,同时要求其他海报提及“证据”充其量也是虚伪的。当有人进一步关注这个话题时,写道:“这里的责任在于反对派证明他们的主张,而不是由我来反对”。
shimonyk,2010年

7

我使用第一种语法,几乎没有例外。因为它不能被误解

“不要让我思考”不仅仅适用于用户界面,你们都;-)


4
我曾经这样做,但是我被程序员需要了解这种语言并且应该让他们思考的论点深深吸引了。
kirk.burleson

2
我认为这是对我未来的自我礼貌。
史蒂文·劳

5

我个人更喜欢第二种。第一个看起来丑陋,笨拙,并且浪费了水平空间。第二个问题的主要问题是宏,人们在以后修改您的代码时弄错了。

为此,我说“不要使用宏”。我还说,“正确缩进该死的代码”。考虑到每个用于编程的文本编辑器/ 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语句中只有两个语句仍然显得很有趣。


如果要编写宏,则应编写宏以确保它们可以插入到代码的任何部分而不会中断。
科瓦(Covar)2010年

4

我使用不带大括号的两行版本(第二种形式),但不是为了节省空间。

我使用该表格是因为我发现它更易读,更吸引人并且更易于键入。我仅在满足这些条件的情况下使用该表格;也就是说,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();
    }

3

大括号。总是。我喜欢它们,因为它使代码具有一定的一致性。而且,正如@dsimcha所写-添加其他代码行时出错的机会较小。

与在代码调试和/或添加代码的情况下可能发生的额外工作相比,单行代码花括号的“丑陋”危害较小。


1
我从未见过有人犯您所说的错误。
kirk.burleson

1
我昨天刚在别人的代码上做到了。:-)我只是想知道上游代码将如何出现,以及在代码的其他补充内容中,在他的所有if上都加上了大括号,因为在这方面他的确似乎与我不同。:-)(冷静点,我在开玩笑,编辑我必须要做的...)
VedranKrivokuća2010年

2

我个人使用括号。

为什么?

好吧,如果有人来了并且需要将代码添加到if语句中,则可以100%明确范围在哪里。

if无论块中有多少条语句,它都会使语句的格式保持一致。

但是,如果要保留项目风格,请坚持这一点。


1

为了安全起见,我几乎总是使用括号。但是,有时候,如果该块的内容确实很短,我会不理会它们,并使其成为单线形式,如下所示:

if (x==5) Console.WriteLine("It's a five!");

猜猜某人不是简洁者。
JohnFx 2010年

2
为了可读性而简洁?绝对不。这是代码,而不是高尔夫比赛。
乔什·K

3
我个人认为,可读性是简洁的一个重要原因。无论如何:我的代码高尔夫规则手册中不包括空格。
JohnFx 2010年

这样做的一个问题是,它很容易受到滥用
Conrad Frix

2
然后不要滥用它。我并不是说将其用作编码标准。很多情况下,当您有一个非常短的条件后跟一个非常短的单个语句时,这很好。例如,一个if(assert)log.write(“ assert failed”);
JohnFx

1

我更喜欢用大括号来保持一致性,但不要浪费太多的空格(因此在我有限的视野中,格式更可读的代码)。因此,我将这段代码写得足够短:

If (cond) { statement; }

有趣的是,我并没有真正看到这样的代码,但我有点喜欢。
Thomas Eding

0

我通常使用花括号,但在某些情况下我不使用花括号。

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";
Josh K

@Josh,请参见编辑
自我说明-想起一个名字,2010年

在这种情况下,我将使用Object returnObj = defaultObj; /* Three else-if's to change it to obj1/2/3 */ return returnObj;
乔什·K

@Josh,阅读stackoverflow.com/questions/36707/…。对第一个答案的第一个评论是:“尽管有多个出口点可能会失控,但我绝对认为这比将整个函数放在IF块中要好。”
请注意-想起

0

如果IDE具有可用的代码格式,则不要使用花括号。

另一方面,在可能不支持自动格式化的其他编辑器中编辑代码的地方,危险的是不要像其他文章中提到的那样放括号。即便如此,我还是不喜欢使用大括号,这对我来说并不是问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.