大括号应该出现在自己的行上吗?[关闭]


273

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

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

还是应该

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

甚至

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

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


104
我发现“ == true”比选择大括号放置更令人分心。
Dan Dyer 2010年

11
@Dan:我认为始终对条件表达式进行说明可以大大提高清晰度。
Wizard79 2010年

4
唯一重要的原因是您的IDE /编辑器不支持匹配的花括号识别。
leeand00,2010年

4
@ leeand00:我们中有些人仍然打印出复杂的/不熟悉的代码以便对其进行研究/注释。优秀的漂亮打印机可以缓解大多数问题。
Shog9

2
不幸的是,这个问题已经关闭。经过一段时间基于缩进的语法使用后,我切换到了另一个括号结构(也许很奇怪)。就像您在代码块的最后一行中的第一个括号一样。(在代码行之后)
cnd 2012年

Answers:


88

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

但是,在对大型应用程序进行编码时,考虑到它带来的“分组”感觉,允许在某些行中仅包含大括号是可以承受的。

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


6
另一方面,新行上的大括号是ANSI STANDARD,而K&R不是。但是关于标准的好处在于,标准如此之多(另请参见uncyclopedia.wikia.com/wiki/AAAAAAAAA!)。
2016年

“行数更少”,我有TB级的空间和很多像素。我为什么要关心使用更多行?
12431234123412341234123

1
@ 12431234123412341234123:我认为他的意思是因为有些人将代码打印出来以进行代码审查。每个非绝对必要的换行符都会浪费纸张,或者会浪费一平方公里的阿甘胶。但是,如果您不打印出来(我当然不会),那么ANSI比K&R更好。另外,任何打算打印的人都应该使用自动代码格式化程序-因此这应该是工具问题,而不是编码风格之一。
困惑

247

您永远不要做第三种方法。

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

为他人编写代码。


113
我希望我知道一点点智慧源自何处。因为为不会打扰的人编写代码几乎没有意义……
Shog9

69
第二个程序员可以在添加内容时添加自己的花括号。他并不愚蠢,并且在鼓励将大括号省略诸如此类的简单东西的编码约定中,他会知道外观。
肯·布鲁姆

25
可选的花括号不是可选的。在C中做出并传给其后代的设计决策很少。它依赖于C#语言,这让我很生气。
亚当·克罗斯兰

28
不管您有多聪明,还是围绕单行省略的小卷发的根深蒂固的编码标准都没关系:如果您想解决问题或错误,您可能会想不到忽略了小卷发。总共花了2秒钟的时间,显露真的很糟糕吗?
乔丹

11
样式#3的一个优点是您都丢失了:您一次在屏幕上获得了更多代码。
洛伦·佩希特尔

203

很长一段时间以来,我都认为它们是同等价值的,或者说非常接近相等,以至于通过做出正确的选择可能获得的收益远远低于争论代价

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

我以前见过程序员抵制这种变化。克服它!我的职业生涯已经换过很多次了。我什至在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
}

/编辑

我仍然认为,一致性比其他考虑因素更为重要,但是如果我们没有既定的先例,那么顺其自然地走就是一条路。


33
仅供参考,我听起来听起来像是个理性的人,但我实际上是个疯子。对于简单的单行代码块,我将不使用花括号也不使用换行符,而将'if(foo)bar()'全部变为一行。我努力使我的代码足够简单,以至于没有问题。
杰伊·巴祖兹

38
来到这里发布确切。大量将开括号保持在同一行的人(特别是在类和方法的开头)跟着一个空白行,因为否则,很难将类/方法标头与正文分开。好吧,如果您仍然要使用额外的行,您最好将花括号放在那儿,并获得缩进的额外好处,更容易看到。
Yevgeniy Brikman 2010年

27
我还没有看到空行-当MyFunction()的参数流到另一行时,我对它们的双缩进更加熟悉。
Armand 2010年

34
像这样疯狂地将参数分解为多行。
Fosco 2011年

10
“功能参数”自变量是红色鲱鱼。显然,参数应该是双重意图。可以将其与以下代码区分开来。
David Ongaro

99

基本规则是:

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

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

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


10
这个答案值得更多投票。
AShelly

1
一致性是关键
MediaVince

70

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

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

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


12
不。我是说为什么要通过做一些不会增加代码清晰度的事情来减少屏幕上适合的代码量?
EpsilonVector 2010年

6
当我开始编码时,我喜欢每个支撑都在自己的行上,现在我更喜欢第一种方法
NimChimpsky 2010年

57
有大量的研究可以追溯到早期的Steam时代(Weinberg,“计算机编程心理学”),这表明当必须查看的代码量超出可理解程度时,程序员的理解力就会明显下降。一次可以看到(即一屏,一页打印机)。这种现象强烈主张将垂直空间视为一种宝贵的资源,而不是无偿浪费,因此首选第一种方法。
John R. Strohm

10
大声笑@“浪费整个行”。我的天啊!不是那个!!= P
Nick Spreitzer 2010年

6
@Julio在大学里,我强烈赞成方法1,而无法忍受方法2。在一家使用C#(标准为方法2)的公司工作之后,我也很喜欢这种方法。我现在可以阅读或使用;没有人打扰我。对彼此产生强烈反感的人通常会对自己不熟悉的事物反应过度。
KChaloux

46

我更喜欢

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

过度

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

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


7
在程序超出屏幕高度之前,这是正确的。;)
weberc2 2013年

13
@ weberc2我认为,当您的程序超出屏幕高度时,少两行不会有太大变化。
Mageek

13
10年前,我本来应该同意屏幕空间。今天,我使用1920 * 1200的屏幕。它适合很多代码,比我的大脑可以立即处理的更多。第一种方法使我可以撤回并看到不同的示波器打开/关闭,而不必阅读它。
LightStriker 2014年

3
我永远无法理解为什么我偏爱这种方法,但这恰恰是出于这种目的。
Declan McKenna 2015年

2
@Mageek这是迟来的,但不是2行,每个作用域是2行。那是O(N),而不是O(1)。我对此并不感到强烈。更重要的是选择一种使长参数列表可读的样式。
weberc2

38

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

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

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

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

7
我不了解Haskell或Ruby,但是Python对空格敏感,这就是为什么它不需要括号或其他定界符来表示块的原因。大括号不仅是语法上的噪音,还包括语法上的噪音。他们服务于实际目的。
罗伯特·哈维

14
@Robert,在C语言中,您必须同时使用空格和花括号。在Python中,您应该只做空格。哪个更好?
P Shved 2010年

5
@Pavel,在C'中,您不必白手起家。
肯·布鲁姆

7
没有空格的@KenBloom C程序无法读取。因此,无论如何,您都必须这样做。
P

6
不管括号是否是个好主意,仅不使用括号的语言的存在似乎就不支持或反对它们。它仅表明有一种语言可能没有它们,而不是说这是一种好的或不良的语言设计。
杰森

37

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


17
+1SyntaxError: not a chance
赛斯2010年

6
对于绝大多数项目而言,这根本不是一个选择。另外,缩进分组还有很多问题。
布莱恩·奥克利

@Bryan,我意识到这不是很实际。我只是认为这是一种观点,需要强加于评论。而且我从未遇到过您暗示的缩进引起的问题,可能是因为我没有混合使用制表符和空格。
Mark Ransom

使用Go并完全避开该参数(加上静态类型,速度和编译器!):)
weberc2

4
然后,多次按空格键,然后看着编译器/解释器嘲笑您。在大多数支持的语言中不会发生这种情况。
法拉普2015年

27

花括号的位置应为

元数据

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


7
完全同意。它是表示形式,而不是数据。
Petruza 2012年

问题是,如果让每个人都设置自己的东西,那么随着提交的完成,事情很快就会变得混乱。
安迪

1
@Andy:这就是重点,IDE会改变它们的外观,但只能在IDE中!实际来源不会被触及。对于版本控制,您可以添加钩子,这些钩子将大括号的设置转换为常见情况,以便每个人都以相同的方式签出代码。
klaar '16

@klaar我使用的每个现代IDE都会将制表符更改为空格,并将大括号移动到自己的行或“ opening”行的末尾;我不确定您为什么认为在这些情况下没有触及消息来源,这就是我发表评论的原因。IDE通常会根据开发人员的设置对它进行更改,这意味着在提交过程中,我会看到很多更改,这些变化只是在将大括号移到自己的行时产生的噪音,因此隐藏了某人所做的ACTUAL更改。
安迪

@Andy:是否有可能使用挂钩将有关空格和花括号的差异转换为统一的标准uppon commit,以规避您描述的噪声问题?无论哪种方式,适当的版本控制系统都应超越空白之类的小东西或其他无意义的东西。
klaar '16

19

这取决于。

如果我使用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#中。


1
它可以用许多类似的语言编写,因为块语句是一条语句。加了!:-)
Tamara Wijsman 2010年

2
根据“框架设计指南”,“规范方法”是将开口撑杆放置在同一行上(即第一种形式)。只是说...
乌韦Honekamp

3
@Uwe:也许吧。但是Microsoft在其所有MSDN C#示例中都采用了“对齐花括号”方法,并且将其嵌入到Visual Studio中,所以……
Robert Harvey 2010年

@Uwe:那是Cwalina的书,它的名字叫人惊叹,因为它的意义远不止于此。MSDN上的FDG对此无话可说。我也想知道,为什么《框架 设计指南》对C# 编码实践有何看法?
R. Martinho Fernandes

3
实际上,您应该将大括号放在Javascript的同一行上。如果大括号位于单独的行上,则可能导致错误。例如,请访问encosia.com/…–
约瑟夫·汉森

18

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

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

比这个例子

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

; {对我来说,正义似乎比以结尾结尾的行更错,;因此我更有可能注意到这一点。


11
您提出了一个很好的论据,但就我个人而言,这在我5年的编程生涯中只发生过一次。我不知道为什么它没有执行,将其发布在SO上,然后有人迅速向我指出了分号。但是,每次压缩使用少了1条线时,我都觉得很难阅读。
JD Isaacks

6
“; {”看起来像是眨眼的脾气暴躁的脸,或者是一个留着小胡子的人。
glenatron

+1很好的例子:非常微妙的错误,容易被忽视。出现在布局上的想法也令人发指。
therobyouknow 2011年

10
当然,任何体面的IDE都会标记空的控制语句,任何体面的编译器都会发出警告。
Dunk

@Dunk您的观点中唯一的缺陷(我坚决同意)是,如今有很多人在使用解释语言(JavaScript,PHP等),以至于许多“程序员”都不了解双精度编译器。拿铁。
Craig

15

我更喜欢1的略微变体

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

为什么?

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

  • 但是,我想else重新开始,因为if并且在else视觉上属于彼此。如果的前面有一个括号else,则很难找出属于什么的东西。

  • 3)取消自身资格。我们都知道,如果您忘了括号,而忘了它,将会发生什么坏事。


1
我在我工作的地方见过这个人。这真有趣。
Almo

1
我也更喜欢这种样式,因为它允许我else在需要时在行上方添加注释,和/或在if块和else块之间放置空白行,以使事情看起来不那么拥挤。括号样式2除了将动作与条件区分开来外无所作为。话虽如此,我最喜欢的绝对是python的无括号样式:)
sayap 2012年

4
如果最大化屏幕上的代码行数量很重要,那么就完全不要使用换行符。您将可以在一个屏幕上获得很多行。我宁愿没有任何东西让我在阅读时停下来思考。我的定义更具可读性。戴着牙套,我的脑子无视它们。没有支撑,我的脑子必须暂停并对齐控制块。不是长时间的停顿,而是停顿。
Dunk

1
是的,如果and else属于同一类,但是{和}也是如此,并且}}位于单独的行上,{也应该位于单独的行上。“我只能在屏幕上容纳一定数量的源代码”,这就是为什么说3)将“取消资格”完全是没有选择的原因。经过3年的工作,3)我从未忘记在添加新的代码行时添加方括号,也不知道有谁拥有过。如果我不得不根据无法调整的代码来调整代码,那么代码在哪里结束?停止使用某些语言功能,因为某些代码读者可能不理解它们?
Kaiserludi 2014年

10

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

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

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

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

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

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

a)它们指示新的作用域
b)当您出现不匹配时,更容易发现(尽管在IDE中,它不大会为您突出显示错误)。


...第二个选项还可以简化您的两个要点(仅使用压痕即可实现括号/压痕组合的目的)。:)
weberc2

10

啊,一个真正的支撑风格

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

这个家伙在很多事情上都错了,但是GNU在花括号方面表现出色。


[更新]我见过光,现在崇拜奥尔曼


9
我看不到GNU样式的意义,除了它可以模拟Lisp代码。似乎需要大量工作却无济于事。
罗伯特·哈维

我不知道有人使用GNU风格。一路1TBS。
JE队列

每个块的缩进级别都不能低于两个,当然除了Lisp样式之外,这不用说。
ergosys

4
+1表示花括号样式的链接。它表明,无论您的风格如何,很多伟大的人都不同意您。
Florian F

@RobertHarvey没有多余的工作,如果没有,您将不会使用正确的工具编写代码或不正确地对其进行配置。好处是代码更具可读性,您可以很快看到括号中的每个错误,并且可以在忽略子块的同时轻松读取其中的代码。
12431234123412341234123


9

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

// 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

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

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

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


1
它们都很容易调试,主要是因为这是一小段代码。缩进是一致的,可以轻松地可视化实际代码块。
Htbaa 2011年

@Htbaa:的确如此:)那么,何必呢?
Matthieu M.

@MatthieuM。第一个块对我来说更有意义,因为在函数签名,for语句和if语句之间的换行符(在第二个块中)使我相信它们是不相关的,但显然它们并不相关。空行用于分隔不相关的代码位;与其他代码行非常接近的代码意味着它们实际上是相关的。当然,这全都是“ imo”,但我想知道您的意思是。编辑:同样,任何适当的IDE也会注意到任何括号丢失,并在解释代码时给您带来一些错误。
克拉

7

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

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

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

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

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


到目前为止,这是我所见过的K&R风格的最佳论据,其余的对于带有代码折叠支持的当今IDE系统都是可笑的。这仅适用于支持;块结尾的C样式语言。这也是为什么我鄙视恕我直言已经过时且Go语言证明了这一功能的分块结尾系统。尽管在这种情况下,我已经多次看到此问题。这通常发生在他们打算向语句中添加某些内容而忘记的地方。
杰里米

5

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

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


5

你可以这样写:

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

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


那样使用,postAnswer()并且doSomething()应该为三元运算符返回值,通常不是这种情况:它们可以很好地返回void(无值)。并且还将(至少在c#中)的结果?:分配给某个变量
ASh

4

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

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

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
如您的示例所示,对于可读代码,缩进比括号大得多。实际上,某些语言使缩进成为嵌套语句的唯一方法!

1
好的,老实说,我发现您很难理解不一致的示例。并不是很难,但是比一致的话要难。
Almo

我同意阿尔莫。这不是“真的很难”的情况。即使不是很难,也存在“一定要困难”的情况。那为什么使事情变得更困难呢?人们给出的“玩具”示例中几乎没有区别。以我的经验,当我从其他人那里继承令人讨厌的代码并且他们使用方法1时,常常必须继续并将其转换为方法2,以便能够遵循逻辑。由于它变得经常必要;它会自动回答哪种方法更好更容易理解的问题。
Dunk

@Dunk:我无法理解通过交换这些无关紧要的细节会明显改善的代码。
jkerian

@ jkerian-显然,您没有从长期离开项目或公司的其他人那里继承很多代码。我无法理解没有经验丰富的人会遇到这种情况。但是话又说回来,每个人的工作情况都不同。另外,如果您必须进行“正式”代码审查,则格式设置会大为不同。能够自然地阅读代码非常重要。当然,我可以停下来思考一下以匹配括号,但是这样会使过程变慢。一种方式不需要暂停,其他方式则需要暂停。这就是为什么我看不出为什么可以建议任何其他选择的原因。
Dunk

4

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

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

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


像我这样的旧计时器,无论该死的括号在哪里,都使用三个击键来选择块。
ergosys

2

我个人喜欢第二种方式。

但是,在我看来,我要展示的方法是最好的,因为它可以带来最大的工作安全性!我大学的一位同学要求我帮他做作业,这就是他的代码的样子。整个程序看起来像一个块。有趣的是,他编写的程序中有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);

8
不好,很糟糕,我的意思是可怕的例子。问题不在于括号!这是疯狂的压痕!
R. Martinho Fernandes

@Martinho Fernandes我以为将大括号和压痕放在一起……
AndrejaKo 2010年

2
不一定...在上面做适当的缩进,然后随机切换花括号样式,您会发现它是可以理解的。
jkerian's

实际上,对此的思考激发了我对这个问题的回答。
jkerian's

“他编写的程序中有95%的错误来自不匹配的括号”-仅适用于解释语言,未经编译。
Mawg 2014年

2

我个人偏爱第一种方法,可能是因为这是我第一次学习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

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

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

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

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


2

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

在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#代码中使用其样式,反之亦然。


3
C风格总是让我烦恼。始终如一!
克里斯汀·曼

1

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


1

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

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

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


0

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

几年后,我学习了Java和JavaScript,并看到了更多的相同代码,因此我进行了更改。我也开始缩进2位空格。


5
+ 1,-1。为什么不缩进制表符,因为任何编辑器都可以将制表符的长度调整为任意长度?否则,您将带领我们许多喜欢8缩进的人来诅咒您的代码。
JE队列

0

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

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

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


9
……大多数对此感到窒息的程序员也是如此。
JE队列

4
那太可怕了。想想如果您想在顶部插入一行或删除顶部一行,则需要付出额外的努力。您不仅可以删除该行并继续前进,还必须记住重新插入花括号。
Bryan Oakley

大声笑这太棒了!:)比第一种风格更好!
nawfal

显然,它甚至有一个名字。维基百科中提到了霍斯特曼·西尔。我已经使用过这样的代码库,使用起来确实不错。
AShelly

-1

只要您不在一个项目经理已经设定了一些编码约束或某些标准的项目上工作,所有从事该项目的程序员在编码时都必须遵守这些内容,这一切都取决于您。

我个人更喜欢第一种方法。

我也没有得到您想通过第三种方法显示的内容吗?

这不是错误的方式吗?例如,考虑一种情况。

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

现在,如果有人想在if块中添加更多语句呢?

在这种情况下,如果您使用第3种方法,则编译器将抛出语法错误。

if (you.hasAnswer())
   you.postAnswer1();
   you.postAnswer2();
else
   you.doSomething();

2
更糟糕的是,如果有人来做:if(you.hasAnswer())you.postAnswer(); 否则you.doSomething(); you.doSomethingElse(); -这是一些细微错误的
诀窍

@FinnNk:是的!
Chankey Pathak 2010年

2
如果有人想添加另一条语句,则可以自己放入花括号。任何值得他为之奋斗的程序员都应该能够找出答案。
罗伯特·哈维

我想说他的第三种方法是错误的。
Chankey Pathak

3
@Robert Harvey,我已经看到非常有经验的编码人员在修改现有代码时会错过添加花括号的麻烦。我认为问题在于,缩进比括号更能说明含义(特别是因为有多种括号样式,因此),如果缩进看起来像您期望的那样,则很容易忽略缺失的括号。
AShelly
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.