it-swarm.cn

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

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

这个:

if(condition)
{
  statement;
}

要么:

if(condition)
  statement;

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

59
Zann Anderson

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

if(condition) 
//      statement;
otherStatement;

或急着添加代码:

if(condition) 
    statement;
    otherStatement;

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

if(condition) statement;

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

131
dsimcha

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

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

44
Neil Aitken

我更喜欢没有括号的版本.

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

(近)空行是浪费

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

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

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

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

结果,我讨厌多余的空行。在单个空行对于分隔独立块至关重要的地方(只需看一下这段文字的视觉外观),连续空行在我看来是非常不良样式本书(以我的经验,它们通常是新手程序员的标志)。

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

省略大括号可能没有害处

只有one参数反对大括号:有人以后会在有问题的块中添加另一条语句,而忘记添加大括号,从而无意中更改了代码的语义。

这确实是一件大事。

但是根据我的经验,事实并非如此。我是个草率的程序员;然而,在我十年的编程经验中,我可以诚实地说,当我在单例代码块中添加额外的语句时,我忘记了没有一次

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

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

因此,直到有人能向我展示从科学实验中收集到的硬数据,证明这确实是一个问题,这个理论仍然是“ so-so-so story ”:一个非常引人注目的假设,从未有过进行测试,并且必须not用作参数。


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

if (condition)
{ do_something(); }

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

27
Konrad Rudolph

我和第二个一起去。它更简洁,更简洁。

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

19
Steven Evers

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

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;

(这是not伪代码;-)

16
rubber boots

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

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

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

11
user36294

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

10
Covar

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

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

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

8
shimonyk

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

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

7
Steven A. Lowe

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

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

5
jsternberg

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

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

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

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

3
Vedran Krivokuća

我个人使用括号。

为什么?

好吧,如果有人来了,并且需要在if语句中添加代码,那么100%清楚范围在哪里。

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

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

2
ChrisF

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

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

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

If (cond) { statement; }
1
hotpaw2

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

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之后添加了一条语句,那么与范围界定问题相比,我们面临的问题更大。

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

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

0
nimcap