强制使用牙箍

Dea*_*n J 17 maintainability coding-style

作为代码标准文档的一部分,我写了一段时间,我强制执行"你必须总是使用大括号循环和/或条件代码块,甚至(特别是)如果它们只是一行."

例:

// this is wrong
if (foo) 
    //bar
else 
    //baz
while (stuff)
    //things

// This is right.
if (foo) {
    // bar
} else {
    // baz
}
while (things) {
    // stuff
}
Run Code Online (Sandbox Code Playgroud)

如果你不支持单行,然后有人评论出来,那你就麻烦了.如果你不支持单行,并且缩进在其他人的机器上显示不相同......你就麻烦了.

所以,问题:为什么这会是一个错误的或其他不合理的标准有充分的理由吗?有一些讨论,但没有人能给我一个比"感觉难看"更好的反驳.

Ada*_*wen 22

我可以提供最好的反驳是,通过空间占用多余的线(S)减少的代码,你可以在同一时间看到你可以一次看量,代码量是多么容易的一大因素它是发现错误.我同意你给括号括起来的原因,但是在C++的多年里,我只能想到有一次我犯了一个错误的结果而且我在没有充分理由跳过括号的地方无论如何.不幸的是,我无法告诉你是否看到那些额外的代码行在实践中有所帮助.

我也许更偏向因为我喜欢在相同缩进级别匹配的括号的对称性(和所包含的语句的隐含分组为执行中的一个块) -这意味着添加括号所有的时间增加了很多线到项目.

  • +1.我宁愿在页面上看到更多代码行,而在10年内我从未见过由此引起的错误. (8认同)
  • 考虑是否在`if`之后放置调试打印.如果你没有大括号,`if`现在只影响调试打印,而不影响它下面的语句.在调试未强制执行大括号规则的代码时,我不止一次被这种方式烧毁. (3认同)
  • 单线+1支架只增加噪音而没有任何实际好处.只要规则是使用围绕任何多行代码的大括号,或者构造(大括号上方的if/while部分)多于一行.这包括评论等.即,只有在代码易于阅读和清晰的最简单的情况下,您可以省略括号,因此缺少括号不会带来任何危险.如果您添加注释,或者将if分开超过2行,那么请加强评论! (3认同)

Pet*_* H. 21

我强制执行这一点,if if语句的一些小例外,它们评估为返回或继续循环.

所以,根据我的标准,这是正确的:

if(true) continue;
Run Code Online (Sandbox Code Playgroud)

就是这样

if(true) return;
Run Code Online (Sandbox Code Playgroud)

但规则是它要么是回归,要么是继续,而且它们都在同一条线上.否则,支撑一切.

理由是为了有一个标准的方法,并避免你提到的评论问题.

  • if(true){继续; } (4认同)
  • 我*总是*把继续或返回语句放在下一行,但也许这只是我. (3认同)
  • 并且,大概是`if(true)break;`来终止循环. (2认同)

Mik*_*one 11

我认为这条规则太过分了.严厉的标准并不能成为优秀的程序员,他们只是降低了一个混乱的可能性.

您提供的示例是有效的,但它们比强制括号有更好的解决方案:

如果你不支持单行,然后有人评论出来,那你就麻烦了.

两种做法更好地解决了这个问题

1)注释出if,while一衬垫与所述一个衬垫之前,等等.就是对待

if(foo)
    bar();
Run Code Online (Sandbox Code Playgroud)

与任何其他多行语句一样(例如,具有多行的赋值或多行函数调用):

//if(foo)
//    bar();
Run Code Online (Sandbox Code Playgroud)

2)前缀//;:

if(foo)
;//    bar();
Run Code Online (Sandbox Code Playgroud)

如果你不支持单行,并且缩进在其他人的机器上显示不相同......你就麻烦了.

不你不是; 代码工作原理相同,但更难阅读.修复你的缩进.挑选标签或空格并坚持使用它们. 不要混合标签和空格进行压痕. 许多文本编辑器会自动为您解决此问题.

写一些Python代码.这将至少解决一些不良的缩进习惯.

此外,像} else {我的TIE战斗机的nethack版本看起来像结构.

有充分的理由说明为什么这会是错误的或其他不合理的标准?有一些讨论,但没有人能给我一个比"感觉难看"更好的反驳.

冗余括号(和括号)是视觉混乱.视觉混乱使代码更难阅读.更难的代码是阅读,隐藏错误越容易.

int x = 0;
while(x < 10);
{
    printf("Count: %d\n", ++x);
}
Run Code Online (Sandbox Code Playgroud)

强制括号无助于在上面的代码中找到错误.

PS我是"每个规则都应该说为什么"学校的订阅者,或者正如达赖喇嘛所说的那样,"了解规则以便你可以正确地打破它们."

  • @Pestilence:在if/else/elsif链中强制一致性也消除了悬空的其他问题.在任何地方强迫支撑都是矫枉过正 (6认同)
  • +1"视觉混乱"是不使用不必要的括号的真正反驳.我也同意能够一次看到更多代码更好. (4认同)
  • +1视觉杂乱.我希望人们能够停止将已经冗长的语言变成冗长的语言,因为它们可能是以良好实践的名义. (3认同)
  • 我不是一个人工作; 这就是标准的全部原因.我不能强迫人们记住在评论事情时做一些具体的事情.不过,我可以强制执行容易检查的事情. (2认同)

Jef*_*nes 9

我还没有任何人想出一个不总是使用花括号的好理由.

这些好处远远超过我所听到的任何"感觉丑陋"的原因.

存在编码标准以使代码更易于阅读并减少错误.

这是一个真正得到回报的标准.

  • 这些意见不是关于利益的事实 (8认同)
  • 在十多年的时间里,我只遇到了一个由于遗漏大括号而导致的错误,这就是为什么当条件语句的主体为*empty*时你需要大括号和注释.在同样的十年里,我已经进入了许多支架,并且遗漏了更多.当它永远不会导致错误时,很难说"真正得到回报"来添加所有这些支撑.关注实际得到回报的规则,比如避免在条件中出现不一致的双重或三重否定(有时在C++中有用的`!!`被认为是一致的). (4认同)
  • 有什么好处? (3认同)
  • 下行是噪音.额外的代码并不意味着任何东西只会让你更难以阅读有意义的代码.它在一个人为的例子中并不是什么大不了的事,但它加起来了 (3认同)
  • 罗伯特; 好处包括避免引入意外错误,并使代码的可读性更容易. (2认同)

Bry*_*anD 5

我发现很难与编码标准争论,这些标准可以减少错误并使代码更具可读性.有些人起初可能觉得难看,但我认为这是一个完全有效的规则.


Wil*_*ins 5

我站在地上,根据缩进,牙箍应该匹配.

// This is right.
if (foo) 
{
    // bar
}
else 
{
    // baz
}

while (things) 
{
    // stuff
}
Run Code Online (Sandbox Code Playgroud)

至于你的两个例子,我认为你的可读性稍差,因为找到匹配的右括号可能很难,但在缩进不正确的情况下更易读,同时允许更容易地插入逻辑.这不是一个巨大的差异.

即使缩进不正确,if语句也会执行下一个命令,无论它是否在下一行.不将两个命令放在同一行上的唯一原因是调试器支持.