花括号是否应该放在一行上?您如何看待它? >
if (you.hasAnswer()) {
    you.postAnswer();
} else {
    you.doSomething();
}


请保持建设性!说明原因,分享经验,并提供事实和参考。

评论

我发现“ == true”比选择大括号放置更让人分心。

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

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

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

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

#1 楼

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

但是,在对大型应用程序进行编码时,考虑到它给人的“分组”感觉,允许一些只用大括号的行是可以负担的。

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

评论


另一方面,新行上的大括号是ANSI STANDARD,而K&R不是。但是关于标准的好处在于,有太多不同的标准(另请参阅uncyclopedia.wikia.com/wiki/AAAAAAAAA!)。

–四进制
16-3-31在9:53



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

– 12431234123412341234123
16-09-21在6:27



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

–四进制
18-10-11在16:00



我同意您应该保持一致,多年来我一直在新行上使用花括号,但是我不得不在代码中以其他方式混合使用,例如在调用函数,匿名函数,对象文字等时。基础语言/匿名代码使括号在同一行上更加容易

–大卫·卡拉南(David Callanan)
19/12/6在22:24

#2 楼

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

用花括号打滑可能会第一次为您节省一些按键操作,但是接下来出现的下一个编码器会在您的else子句中添加一些内容,而不会注意到该括号丢失了花括号痛苦

为他人编写代码。

评论


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

–Shog9
2010-09-12的3:19

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

–肯·布鲁姆
2010-10-22 14:25

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

–亚当·克罗斯兰(Adam Crossland)
2010-10-29 15:58

不管您有多聪明,还是围绕单行省略的curl的编码标准是多么根深蒂固:如果您想解决问题或bug,您可能会想念掉curly。总共花了2秒钟的时间,显露真的很糟糕吗?

–乔丹
2011-02-15 6:01



样式#3的一个优点是,您都丢失了:您一次在屏幕上获得了更多代码。

–Loren Pechtel
2011-09-21 23:52

#3 楼

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

保持一致很重要。所以我说了让我们掷硬币并继续编写代码。

我以前已经看到程序员抵制这种变化。克服它!我的职业生涯已经换过很多次了。我什至在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时,“多余的空白行”解决方案有两种选择:函数主体

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

示例:

1 /

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


2 /

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


/编辑

我仍然认为,一致性比其他考虑因素更为重要,但是如果我们没有既定的先例,那么继续前进是不二之选。

评论


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

–杰伊·巴祖兹(Jay Bazuzi)
2010年9月11日下午4:42

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

–叶夫根尼·布里克曼(Yevgeniy Brikman)
2010-10-29 20:14

我还没有看到空行-我对MyFunction()的参数在输入到另一行时的双缩进更加熟悉。

–武器
2010年12月1日于18:07

像这样疯狂地将参数分解为多行。

–莫斯科
2011-11-10 17:59

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

–David Ongaro
15年3月22日在21:24

#4 楼

基本规则是:


遵循项目现有的编码标准。
如果没有编码标准,并且您正在编辑别人拥有的现有代码库,请保持一致保持现有代码的风格,无论您喜欢/不喜欢它。
如果您正在进行绿色项目,请与其他团队成员讨论,并就正式或非正式编码达成共识标准。
如果您是唯一开发人员,正在做一个绿地项目-下定决心,然后保持无情的一致。

即使您没有外部约束,最好(IMO)寻找现有的(广泛使用的)编码标准或样式指南,并尝试并遵循它。如果您推出自己的样式,那么很可能会在几年内后悔。

最后,使用现有样式检查器和代码格式化程序实现/可实现的样式比需要手动“强制”的一种。

评论


这个答案值得更多投票。

– AShelly
2010年11月1日于23:04

一致性是关键

– MediaVince
18年5月30日在13:57

#5 楼

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

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

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

评论


否...我是说为什么要通过做一些不会增加代码清晰度的事情来减少屏幕上适合显示的代码量?

– EpsilonVector
2010-09-11 9:54

当我开始编码时,我喜欢每个大括号都独立一行,现在我更喜欢第一种方法

– NimChimpsky
2010-09-21 9:01

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

– John R. Strohm
2010年11月1日在21:34

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

– Nick Spreitzer
2010-12-12 19:47

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

– KChaloux
2013年1月17日15:54

#6 楼

我更喜欢

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


超过一眼。在第二种方法中,它与上面的线(you.postAnswer();)融合在一起,使我的眼睛不得不更加专注于阅读。

评论


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

–weberc2
13年4月4日在18:09

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

– Mageek
13年6月29日在10:41

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

–LightStriker
2014年4月6日13:34

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

– Declan McKenna
15年7月30日在17:00

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

–weberc2
15年12月18日在21:56

#7 楼

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

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

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

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


评论


我不了解Haskell或Ruby,但是Python对空格敏感,这就是为什么它不需要括号或其他定界符来表示块的原因。大括号不只是句法上的噪音;他们服务于实际目的。

–罗伯特·哈维(Robert Harvey)
2010-09-16 16:16

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

–P切碎
2010-09-16 17:34



@Pavel,在C'中,您不必白手起家。

–肯·布鲁姆
10-10-22在14:26

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

–P切碎
10-10-23在11:21

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

–詹森
2011年4月6日14:52

#8 楼

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

评论


+1 SyntaxError:没有机会

–赛斯
2010年11月3日,0:56

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

–布莱恩·奥克利(Bryan Oakley)
2011年7月18日在14:02

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

– Mark Ransom
2011年7月18日在15:46



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

–weberc2
13年4月3日在20:23

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

–法老王
2015年2月2日下午5:00

#9 楼

花括号的位置应该是

元数据

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

评论


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

– Petruza
2012年11月9日14:57

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

–安迪
16年4月4日在1:22

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

– klaar
16年8月1日在7:44

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

–安迪
16年8月1日在22:26

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

– klaar
16年8月2日在7:17



#10 楼

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

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


比这个例子中的错误

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


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

评论


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

– JD Isaacks
2010-11-2 14:53

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

–旋转加速器
2010-11-2 23:28

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

–therobyouknow
2011年1月17日下午13:27

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

–扣篮
13年2月28日在15:16



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

– Craig
17年12月1日在18:11

#11 楼

这要看情况。

如果我使用Javascript或jQuery进行编码,则使用第一种形式: ,我使用第二种形式,因为这是用C#进行编码的典型方法。

>
jQuery(function($) { 
    if ($ instanceOf jQuery) { 
        alert("$ is the jQuery object!"); 
    } 
}); 
C#中的



评论


它可以用很多类似的语言来编写,因为语句块是语句。加了! :-)

–塔玛拉·维斯曼(Tamara Wijsman)
2010年9月11日下午0:34

根据“框架设计指南”,“规范方法”是将开孔撑杆放置在同一行(即第一个表格)上。只是在说' ...

– Uwe Honekamp
2010-09-11 14:48



@Uwe:也许吧。但是,Microsoft在其所有MSDN C#示例中都采用了“对齐括号”方法,并且将其嵌入到Visual Studio中,因此...

–罗伯特·哈维(Robert Harvey)
2010-09-11 15:05

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

– R. Martinho Fernandes
2010-09-15的3:15

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

–约瑟夫·汉森(Joseph Hansen)
15年5月6日在21:51



#12 楼

我更喜欢1)的细微变化

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


为什么? 。我只能在屏幕上放入一定数量的源代码。括号样式2)使带有大量嵌套循环和条件语句的重载算法痛苦地长了。如果else前面有一个支架,要找出属于什么的难度就更大了。
3)丧失了资格。我们都知道,如果忘记括号,而忘记了它,会发生什么不好的事情。


评论


我在我工作的地方见过这一人。这真有趣。

– Almo
2012年7月20日在15:16

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

–sayap
2012年10月28日,下午3:26

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

–扣篮
13年2月28日在15:21

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

–凯撒路迪
2014年5月5日在18:25

#13 楼

我确实读过某本书的作者,希望他们的代码格式如下: />
if (you.hasAnswer())
{
    you.postAnswer();
}
else
{
    you.doSomething();
}


现在我不知道那是不是真的(因为我再也找不到它了),但是后者的风格在书本中非常普遍。
从个人角度来说,我希望将括号放在单独的一行上,例如:

a)它们表示新的作用域
b)当您出现不匹配项时更容易发现(尽管这在IDE中不是一个问题,可以为您突出显示错误)。

评论


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

–weberc2
13年4月3日在20:24

#14 楼

啊,一个真正的支撑风格。

一切都为圣道而准备-甚至是先知(理查德“我的路或高速公路”斯托曼)。但是GNU在花括号方面显得格外引人注目。

评论


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

–罗伯特·哈维(Robert Harvey)
2010-09-11 17:10



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

–JéQueue
2010年11月5日18:00

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

– ergosys
2012年1月28日下午5:57

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

– Florian F
2014年9月2日14:28在

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

– 12431234123412341234123
16-09-21在7:13

#15 楼

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

评论


研究表明,一旦代码库超过了屏幕的高度,阅读紧凑的代码就会更容易。

–weberc2
13年4月3日在20:25

@ weberc2,您能为这些研究论文提供DOI吗?

–Grzegorz Adam Kowalski
16 Mar 9 '16 at 9:12

#16 楼

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

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


您是哪种情况下首先诊断出该问题?出于个人喜好(还有许多其他样式,包括whitesmith和al。),我不在乎...只要不妨碍我阅读代码和调试代码的能力。

关于“浪费空间”的说法,我不买账:我总是倾向于在逻辑组之间添加空白行,以使程序更清晰...

评论


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

– Htbaa
2011年4月6日14:44

@Htbaa:的确是:)那么,何必呢?

– Matthieu M.
2011年4月6日15:22

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

– klaar
16年3月3日,11:48



我想指出的是,这两个代码段完全不同。您将在代码的不同位置出现编译器错误。第一个将在“ else”上出现编译器错误,最后一个将出现卷曲。第二个只会在最后一个卷曲时出现编译器错误。

–马克·沃尔什(Mark Walsh)
5月5日18:22

#17 楼

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

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

while(true);
{
    char c;
    getchar(); //Wait for input
}


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

评论


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

–杰里米
16-09-22在16:19

#18 楼

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

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

#19 楼

您可以这样写:

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


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

评论


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

– ASh
18年8月17日在12:01

#20 楼

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

用我不太谦逊的观点,大括号几乎完全与代码的可读性无关。上面列出了一些特殊情况,其中一种样式或另一种样式会有所不同,但在大多数情况下,明智地使用空行可以消除这种情况。结构化形式1和修改后的形式3稍微有些结构化。(C ++)
,只是因为空白行具有更强的视觉分离效果。

评论


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

–罗杰·佩特
2010-09-27 12:24



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

– Almo
2012年7月20日15:14

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

–扣篮
13年2月28日在15:12



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

– jkerian
13年2月28日在15:28

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

–扣篮
13年6月6日在21:05

#21 楼

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

当大括号在同一列上且在各自的行上开始和结束时,您可以从空白处选择或将光标放在第0列上。使用鼠标选择或键盘选择减少了击键次数。

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

评论


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

– ergosys
2012年1月28日下午6:10

#22 楼

我个人比较喜欢第二种方法。我大学的一位同学要求我帮他做作业,这就是他的代码的样子。整个程序看起来像一个块。有趣的是,他编写的程序中有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]='q4312078q';
                puts(input);


评论


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

– R. Martinho Fernandes
2010-09-15的3:20

@Martinho Fernandes我认为放括号和缩进在一起...

– AndrejaKo
2010-09-19 9:31

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

– jkerian
2010-09-26 23:27

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

– jkerian
2010-09-26 23:47

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

–莫格说要恢复莫妮卡
2014年9月3日7:50

#23 楼

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

对于单行if语句,我将使用>
如果不是if (you.hasAnswer()) you.postAnswer();,而是更长的东西,例如you.postAnswer();,我可能会恢复为第一种类型:

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


我永远不会使用换行符,如果还有you.postAnswer(this.AnswerId, this.AnswerText, this.AnswerType);语句,我将永远不会使用此方法。必须将其转换为

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


#24 楼

他们不应该;对我来说,第一种方法。

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

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

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

#25 楼

它取决于平台/语言/约定

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

评论


C风格总是让我烦恼。始终如一!

–克里斯蒂安·曼(Christian Mann)
2010年11月6日,7:51

#26 楼

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

#27 楼

我之所以使用第一种方法,仅仅是因为它更紧凑并且允许在屏幕上显示更多代码。我本人对配对括号从来没有问题(在添加条件之前,我总是将它们与if语句一起写出,并且大多数环境允许您跳转到匹配的括号)。您确实需要在视觉上配对大括号,那么我更喜欢第二种方法。但是,这一次允许更少的代码,这需要您滚动更大的代码。至少对我而言,这比使括号整齐对齐对读取代码有更大的影响。我讨厌滚动。再说一次,如果您需要滚动单个if语句,则该语句很可能太大,需要重构。

最重要的是一致性。使用一个或另一个-请勿同时使用!

#28 楼

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

评论


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

–JéQueue
2010-11-5 18:05

#29 楼

有第四个选项可以使花括号对齐,但又不会浪费空间:

评论


……大多数对此感到cho恼的程序员也是如此。

–JéQueue
2010-11-5 18:05

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

–布莱恩·奥克利(Bryan Oakley)
2011年7月18日在14:06

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

– nawfal
13年1月14日在8:50

显然,它甚至有一个名字。维基百科中提到了Horstman Syyle。我已经使用过这样的代码库,使用起来确实不错。

– AShelly
2013年1月14日14:29

#30 楼

只要您不在一个项目管理人员已经设置了一些编码约束或某些标准的项目上工作,所有在该项目上工作的程序员都必须在编码时遵循这些规则,这一切都取决于您。

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

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

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

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


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

如果您使用第三种方法,编译器将抛出语法错误。

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


评论


更糟糕的是,如果有人来做:if(you.hasAnswer())you.postAnswer();否则you.doSomething(); you.doSomethingElse(); -这是一些细微错误的诀窍,这些错误很容易引起人们的注意,并且编译器也无济于事

– FinnNk
2010-09-12 13:02



@FinnNk:是的!

–Chankey Pathak
2010-09-12 15:18

如果有人想添加另一条语句,则可以自己插入花括号。任何值得他为之奋斗的程序员都应该能够弄清楚这一点。

–罗伯特·哈维(Robert Harvey)
2010-09-16 16:18

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

–Chankey Pathak
10-9-16 '16:47

@Robert Harvey,我已经看到非常有经验的编码人员在修改现有代码时会错过添加花括号的麻烦。我认为问题在于缩进比花括号更有意义(特别是因为有多种花括号样式),所以如果缩进看起来像您期望的那样,则很容易忽略缺失的花括号。

– AShelly
2010-09-28 2:13