it-swarm.cn

大括号应该出现在自己的行上吗?

大括号应该放在自己的行上吗?你怎么看待这件事?

if (you.hasAnswer()) {
    you.postAnswer();
} else {
    you.doSomething();
}

还是应该

if (you.hasAnswer())
{
    you.postAnswer();
}
else
{
    you.doSomething();
}

甚至

if (you.hasAnswer())
    you.postAnswer();
else
    you.doSomething();

请建设性!解释为什么,分享经验,并以事实和参考作为支持。

284
Tamara Wijsman

当我还是一个学生的时候,我曾经把花括号放在同一行上,这样一来行就更少了,并且代码也可以打印在更少的页面上。看着一行中唯一打印的单个括号字符很烦人。 (环境,纸张浪费)

但是,在对大型应用程序进行编码时,考虑到它所具有的“分组”感觉,允许在某些行中仅使用大括号即可。

无论选择哪种样式,都应一致,以免您的大脑在相关代码段中处理多种样式不会成为您的负担。在不同的情况下(如上),我会说使用不同的样式是可以的,从更高层次上“切换上下文”会更容易。

90
dbza

您永远不要执行第3种方法。

跳过花括号可能会第一次为您节省一些按键操作,但是,随之而来的下一个编码器会在您的else子句中添加一些内容,而不会注意到该块丢失了花括号,这会带来很多痛苦。

为他人编写代码。

251
rhettg

很长一段时间以来,我一直在争辩说它们是等值的,或者非常接近等价通过做出正确的选择可能获得的收益远远低于争论的成本关于它。

但是一致很重要。因此,我说了让我们掷硬币并继续编写代码。

我以前见过程序员抵制这种变化。克服它!我的职业生涯已经换过很多次了。我什至在C#中使用的样式与在PowerShell中不同。

几年前,我在一个团队(约20个开发人员)中工作,该团队决定征求意见,然后做出决定,然后在所有代码库中强制实施。我们有1周的时间来决定。

很多of吟声和眼神。很多“我喜欢我的方式,因为这样更好”,但没有实质意义。

当我们研究问题的精妙之处时,有人问如何用相同的括号方式处理此问题:

void MyFunction(
    int parameterOne,
    int parameterTwo) {
    int localOne,
    int localTwo
}

请注意,参数列表的结束位置和主体的开始位置并不清楚。相比于:

void MyFunction(
    int parameterOne,
    int parameterTwo) 
{
    int localOne,
    int localTwo
}

我们阅读了一些有关世界各地人们如何处理此问题的文章,并发现了在大括号后面添加空白行的模式:

void MyFunction(
    int parameterOne,
    int parameterTwo) {

    int localOne,
    int localTwo
}

如果您想在视觉上休息一下,不妨用撑子做一下。然后,您的视觉休息也变得一致。

编辑:使用K&R时,“多余的空白行”解决方案有两种选择:

1 /使函数参数缩进与函数体不同

2 /将第一个参数与函数名称放在同一行,并将新行中的其他参数与该第一个参数对齐

例子:

1 /

void MyFunction(
        int parameterOne,
        int parameterTwo) {
    int localOne,
    int localTwo
}

2 /

void MyFunction(int parameterOne,
                int parameterTwo) {
    int localOne,
    int localTwo
}

/编辑

我仍然认为一致性比其他考虑因素更重要,但是如果我们没有已建立的先例,那么顺便说一下是行之有效的方法。

206
Jay Bazuzi

基本规则是:

  1. 遵循项目现有的编码标准。
  2. 如果没有编码标准,而您正在编辑别人拥有的现有代码库,则无论您喜欢/不喜欢它的方式,都应与现有代码的样式保持一致。
  3. 如果您正在从事未开发的项目,请与其他团队成员进行讨论,并就正式或非正式的编码标准达成共识。
  4. 如果您是唯一开发人员,在一个绿地项目上工作-下定决心,然后无情地保持一致

即使您没有任何外部约束,(IMO)最好也要寻找现有的(广泛使用的)编码标准或样式准则,并尝试并遵循它。如果您采用自己的风格,那么很有可能几年后就会后悔。

最后,使用现有样式检查器和代码格式化程序实现/可实现的样式优于需要手动“实施”的样式。

103
Stephen C

第一种方法的好处是它在垂直方向上更紧凑,因此您可以在屏幕上放置更多代码,这就是为什么我更喜欢它。我听到的唯一支持第二种方法的论据是,它使配对左括号和右括号更加容易,但是大多数IDE都具有键盘快捷键,这实际上是一个错误的声明-而不是将右括号与右括号配对方括号,您可以在相同的缩进级别上将右方括号与“块的开始”表达式配对(如果是,则是for,while),因此确定块的起始位置就很容易。

当前面的for/while/if构造已经在视觉上指示块的开始时,我认为没有理由浪费整行仅用于括号。

就是说,我确实相信右方括号应该在自己的行中,因为我们需要一些东西以可见的方式指示块的末尾及其缩进结构。

72
EpsilonVector

我更喜欢

_if (you.hasAnswer())
{
    you.postAnswer();
}
else
{
    you.doSomething();
}
_

过度

_if (you.hasAnswer()) {
    you.postAnswer();
} else {
    you.doSomething();
}
_

因为乍一看,you.postAnswer();行更易于阅读和查找。在第二种方法中,它与上面的线(you.hasAnswer())融合在一起,使我的眼睛不得不更加集中精力阅读它。

49
JD Isaacks

我更喜欢第一种方法。大括号完全不值得单独使用。

问题是括号并不重要。它们只是语法垃圾,对于理解代码的用途,目的和实现方式绝对是不必要的。它们只是对老式C语言的致敬,由于屏幕空间不足,无法对操作员进行可视分组。

有些语言(Python,Haskell,Ruby)都可以,无需花括号即可。这仅确认括号是垃圾,并且在任何可能的情况下都不应该为它们保留一行:

if (you.hasAnswer()){
    you.postAnswer();
}else{
    you.doSomething();
}
39
P Shved

使用Python并完全回避该参数。

37
Mark Ransom

花括号的位置应为

元数据

可由程序员在IDE)中进行配置。这样,无论编写者是谁,所有代码中的讨厌括号都一样。

28
Jonathan

我喜欢第一个,因为在这个例子中我很难看到错误。

if (value > maximum);
{
    dosomething();
}

比这个例子

if (value > maximum); {
    dosomething();
}

; {在我看来比以;结尾的行更错,所以我更有可能注意到它。

19
bmb

这取决于。

如果我使用Javascript或jQuery进行编码,则使用第一种形式:

jQuery(function($) { 
    if ($ instanceOf jQuery) { 
        alert("$ is the jQuery object!"); 
    } 
}); 

但是,如果我使用C#编码,则使用第二种形式,因为这是用C#进行编码的规范方法。

public int CalculateAge(DateTime birthDate, DateTime now) 
{ 
    int age = now.Year - birthDate.Year; 
    if (now.Month < birthDate.Month 
        || (now.Month == birthDate.Month && now.Day < birthDate.Day)) 
        age--; 
    return age; 
} 

请注意,您的示例可以写成

if (you.hasAnswer())
    you.postAnswer();
else
    you.doSomething();

在C#中。

19
Robert Harvey

我更喜欢1的略微变体

if (you.hasAnswer()) {
    you.postAnswer();
} // note the break here
else {
    you.doSomething();
}

为什么?

  • 我认为总是将大括号放在自己的行上会降低可读性。我只能在屏幕上放入一定数量的源代码。括号样式2)使带有大量嵌套循环和条件语句的波动算法变得很痛苦。

  • 但是,我想else从新的一行开始,因为ifelse在视觉上属于同一类。如果else前面有一个括号,则发现属于什么的难度要大得多。

  • 3)取消自身资格。我们都知道,如果您忘记了括号,却忘记了它,将会发生什么不好的事情。

15
Alexander Gessler

我确实读过某本书的作者希望其代码格式如下的地方:

if (you.hasAnswer())
{
    you.postAnswer();
}
else
{
    you.doSomething();
}

但是由于发布者的空间限制,他们不得不使用以下方法:

if (you.hasAnswer()) {
    you.postAnswer();
} else {
    you.doSomething();
}

现在我不知道这是否正确(因为我再也找不到它了),但是后一种风格在书中非常普遍。

就个人而言,我更喜欢将括号放在单独的一行上,例如:

a)他们表明一个新的范围
b)当您出现不匹配时更容易发现(尽管在IDE会为您突出显示错误)中这不是问题。

10
ChrisF

啊, 一种True Brace Style

它拥有一切为圣道而准备的东西-甚至是先知(理查德“我的路还是高速公路”斯托曼)。

这个家伙在很多事情上都错了,但是GNU在支撑时很重要。).


[更新]我看到了光明,现在崇拜 Allman

10

简单答案:什么更容易调试?

// Case 1:
void dummyFunction() {
  for (i = 0; i != 10; ++i) {
    if (i <= 10)
      std::cout << "i is: " << i << "\n";
      std::cout << 10 - i << " steps remaining\n";

      // Some hard work here
      // which is really hard
      // and does take some screen estate
    }
    else
      std::cout << "We'll never get there";
  }
} // COMPILER ERROR HERE


// Case 2:
void dummyFunction()
{
  for (i = 0; i != 10; ++i)

    if (i <= 10)
    {
      std::cout << "i is: " << i << "\n";
      std::cout << 10 - i << " steps remaining\n";

      // Some hard work here
      // which is really hard
      // and does take some screen estate
    }
    else
      std::cout << "We'll never get there\n";
  }
} // COMPILER ERROR HERE

您首先在哪种情况下诊断了问题?

我不太在乎个人喜好(有很多其他样式,包括怀特史密斯和艾尔。),我也不在乎...只要不妨碍我阅读代码和调试它。

至于“浪费空间”的论点,我不买它:我总是倾向于在逻辑组之间添加空白行,以使程序更清晰。

9
Matthieu M.

第二个例子,我对可读性非常重视。我不能忍受是否以其他方式阻塞=(

9
Bryan Harrington

并不是所有人都会注意到的,但这就是为什么括号在同一行上作为条件句(非常长的条件句除外,但这是Edge的情况):

在C中,这是一个有效的构造:

 while(true); 
 {
 char c; 
 getchar(); //等待输入
} 

快!该代码的作用是什么?如果回答“无限循环请求输入”,那么您错了!它甚至没有输入。它被捕获在while(true)。注意最后的分号。实际上,这种模式看起来似乎应该更普遍。 C要求您在一个块的开头声明变量,这就是为什么要开始一个新变量的原因。

一行代码是一个想法。大括号是包含条件或循环的思想的一部分。因此,它们属于同一行。

8
Christian Mann

我喜欢第一种方法。 IMO更整洁,更紧凑,我喜欢。

编辑:啊,三分之一。我喜欢尽可能最好的那个,因为它更小/更整齐。

5
Ullallulloo

你可以这样写:

you.hasAnswer() ? you.postAnswer() : you.doSomething();

回答问题;我以前更喜欢在花括号上加上花括号,但为了避免考虑浏览器中自动分号插入带来的错误,我开始将埃及语样式用于javascript。当在Eclipse中编码Java)时,我对战斗(或配置)默认的花括号样式没有兴趣,因此在这种情况下我也选择了Egypt,现在我对两者都很好。

5
FeatureCreep

这里几乎所有的答复都对“无论做什么,坚持一两个都坚持”有所不同。

所以我想了一会儿,不得不承认我只是不认为它那么重要。谁能诚实地告诉我以下内容很难遵循?

int foo(int a, Bar b) {
    int c = 0;
    while(a != c)
    {
        if(b.value[a] == c) {
            c = CONST_A;
        }
        c++;
    }
    return c;
}

我不确定其他人...但是我在精神上在样式之间来回切换绝对没有零问题。我花了一些时间弄清楚代码是做什么的,但这是我只是随机输入类似于C的语法的结果。 :)

在我看来,开括号几乎完全与代码的可读性无关。上面列出了一些特殊情况,其中一种样式或另一种样式会有所不同,但是在大多数情况下,明智地使用空白行可以消除这种情况。

FWIW,我们在工作中的编码样式使用结构稍微更紧凑的形式1和修改形式3。(C++)

            // blank line is required here
if (x) {
            //This blank line is required
   y = z;
}
            // blank line is required here too, unless this line is only another '}'

if (x) y = z; //allowed

if (x)
    y = z;  // forbidden

我很好奇那些强烈喜欢表格2的人是否会发现此版本的表格1更好,仅仅是因为空行提供了更强的视觉分隔。

4
jkerian

我很惊讶这还没有提出。我喜欢第二种方法,因为它使您可以更轻松地选择块。

当花括号在同一列上并在它们自己的行上开始和结束时,您可以从空白处选择或将光标放在第0列上。使用鼠标选择时,这通常会更宽裕,而使用键盘选择时,这会减少按键的次数。

我最初使用括号与条件语句在同一行上,但是当我切换时,发现它加快了我的工作速度。当然,这不是白天和黑夜,但它会使您在条件句旁边使用牙套稍微慢一点。

4
Tim O'Neil

我个人偏爱第一种方法,可能是因为这是我第一次学习PHP的方法。

对于单行if语句,我将使用

if (you.hasAnswer()) you.postAnswer();

如果不是you.postAnswer();,而是更长的时间,例如you.postAnswer(this.AnswerId, this.AnswerText, this.AnswerType);,我可能会恢复为第一种类型:

if (you.hasAnswer) {
    you.postAnswer(this.AnswerId, this.AnswerText, this.AnswerType);
}

我永远不会使用换行符,并且如果也有else语句,我将永远不会使用此方法。

if (you.hasAnswer()) you.postAnswer();
else you.doSomething()

是一种理论上的可能性,但我从未使用过。这将不得不变成

if (you.hasAnswer()) {
    you.postAnswer();
} else {
    you.doSomething();
}
2
TRiG

我个人喜欢第二种方式。

但是,在我看来,我要演示的方法是最好的,因为它可以带来最大的工作安全性!我大学的一位同学要求我帮他做作业,这就是他的代码的样子。整个程序看起来像一个块。有趣的是,他编写的程序中有95%的错误来自括号不匹配。大括号匹配后,其他5%即可发现。

while(1){
i=0;
printf("Enter coded text:\n");
while((s=getchar())!='\n'){
         if(i%1==0){
            start=(char*)realloc(input,(i+1)*sizeof(char));
if(start==NULL){
printf("Memory allocation failed!");
exit(1);}
input=start;}
      input[i++]=s;}
start=(char*)realloc(input,(i+1)*sizeof(char));
if(start==NULL){
printf("Memory allocation failed!!!");
exit(1);}
input=start;
input[i]='\0';
                puts(input);
2
AndrejaKo

他们不应该;我的第一种方法。

当我查看第二行时,由于未使用的行(那些行上仅带有大括号,而不是最后一个闭合的大括号),感觉好像破坏了代码的连续性。我无法如此快速地阅读它,因为我需要特别注意空行,这通常意味着代码目的或类似目的的分离,但决不能“此行属于花括号”(仅重复该含义)缩进)。

无论如何,就像您在编写文本时一样...如果在段落的开头有一个空行(段落更改的双重符号),则在段落的开头添加缩进是多余的,在我们适当缩进。

另外,如前所述,它允许在屏幕上容纳更多代码,否则会适得其反。

2
Joanis

这取决于平台/语言/惯例

在Java中:

void someMethod() { 
     if (you.hasAnswer()) {
         you.postAnswer();
     } else {
       you.doSomething();
     }
}

在C#中

void someMethod() 
{ 
     if (you.hasAnswer()) 
     {
         you.postAnswer();
     } 
     else 
     {
       you.doSomething();
     }
}

在C中:

void someMethod() 
{ 
     if (you_hasAnswer()) {
         you.postAnswer();
     } else {
       you_doSomething();
     }
}

我讨厌何时Java家伙在C#代码中使用他们的样式,反之亦然。

2
OscarRyz

我之所以使用第一种方法,仅仅是因为它更紧凑并且允许在屏幕上显示更多代码。我自己对配对花括号从来没有问题(在添加条件之前,我总是将它们与if语句一起写出,并且大多数环境允许您跳转到匹配的花括号)。

如果您did需要在视觉上配对大括号,那么我更喜欢第二种方法。但是,这一次允许更少的代码,这需要您滚动更大的代码。至少对我来说,这比使括号整齐对齐对阅读代码有更大的影响。我讨厌滚动。再说一次,如果您需要滚动一个if语句,则该语句很可能太大,需要重构。

但;最重要的是一致性。使用一个或另一个-决不要两者都使用!

1
gablin

我只能说,如果您是方法3的粉丝,那么您将受到地球上每个IDE代码格式化程序)的迫害。

1
Phil Cohen

有第四个选项可保持括号对齐,但不会浪费空间:

if (you.hasAnswer())
{    you.postAnswer();
     i.readAnswer();
}
else
{   you.doSomething();
}

唯一的问题是,大多数IDE的自动格式化程序对此都感到窒息。

0
AShelly

当我12岁第一次学习编程时,我将花括号放在了下一行,因为Microsoft编码教程就是这样。那时我还缩进了4空格TABS。

几年后,我学习了Java和JavaScript,并看到了更多的大括号,同一行代码),所以我进行了更改。我也开始缩进2位空格。

0
Ming-Tang