我最近发现我们公司有一套编码指南(隐藏在文档管理系统中,没有人能找到它)。它通常看起来非常明智,并且远离通常的宗教战争,关于在哪里放置'{以及是否使用硬标签。但是,它确实表明“行不应包含嵌入的多个空格”。这意味着不要做这种事情:
foo = 1;
foobar = 2;
bar = 3;
或者这个:
if ( test_one ) return 1;
else if ( longer_test ) return 2;
else if ( shorter ) return 3;
else return 4;
或者这个:
thing foo_table[] =
{
{ "aaaaa", 0 },
{ "aa", 1 },
// ...
}
这样做的理由是,对一行的更改通常需要编辑每一行。这使得改变更加努力,并且更难理解差异。
我被撕裂了。一方面,像这样排列可以使重复代码更容易阅读。另一方面,它确实使差异难以阅读。
您对此有何看法?
答案 0 :(得分:22)
由于我监督源代码的每日合并,...我只能建议反对它。
很漂亮,但是如果你定期合并,“更容易阅读”的好处远远少于合并代码所需的工作量。
由于该格式无法以简单的方式自动化,因此第一个不遵循该格式的开发人员将触发非平凡的合并。
不要忘记源代码合并中的,不能要求diff工具忽略空格:
否则,“”和“”在diff期间看起来会相同,这意味着不需要合并......编译器(以及在String双引号之间添加空格的编码器)不同意!
答案 1 :(得分:15)
我被撕裂了。一方面,排队 像这样可以制作重复的代码 更容易阅读。在另一 手,它确实使差异更难 读取。
好吧,因为让代码可以理解比让差异理解更重要,所以你不应该被撕裂。
恕我直言排队相似的线条确实大大提高了可读性。此外,它允许编辑器更容易切割,允许垂直选择。
答案 2 :(得分:13)
我从不这样做,我总是建议不要这样做。我不关心难以阅读的差异。我确实认为首先要做这件事需要时间,并且每当必须重新排列行时需要额外的时间。编辑具有这种格式风格的代码令人愤怒,因为它经常变成一个巨大的时间汇,我最终花费了更多的时间进行格式化而不是进行真正的更改。
我也对可读性好处提出质疑。此格式样式在文件中创建列。但是,我们不会在列样式中从上到下读取。我们从左到右阅读。柱子分散了标准阅读风格,并将眼睛向下拉。如果它们并非完全对齐,那么这些列也会变得非常难看。这适用于无关的空白,但也适用于具有不同间距但在文件中一个接一个地落下的多个(可能不相关的)列组。
顺便说一下,我发现你的编码标准没有指定标签或支架位置真的很奇怪。混合使用不同的标签样式和大括号放置会比使用(或不使用)列样式格式更容易损害可读性。
答案 3 :(得分:12)
我从不这样做。正如您所说,有时需要修改每一行来调整间距。在某些情况下(如上面的条件),如果你取消了间距并将块放在与条件不同的行上,它将是完全可读的并且更容易维护。
另外,如果你的编辑器中有很好的语法高亮,那么这种间距不一定是必要的。
答案 4 :(得分:6)
Steve McConnell在有用的 Code Complete 中对此进行了一些讨论。如果你没有这本开创性书籍的副本,请帮个忙买一个。无论如何,讨论是在第一版的第426和427页,这是我得到的版本。
编辑:
麦康奈尔建议在一组任务陈述中对齐等号以表明它们是相关的。他还警告不要在一组任务中对齐所有等号,因为它可以在视觉上暗示没有任何关系。例如,这是合适的:Employee.Name = "Andrew Nelson"
Employee.Bdate = "1/1/56"
Employee.Rank = "Senator"
CurrentEmployeeRecord = 0
For CurrentEmployeeRecord From LBound(EmployeeArray) To UBound(EmployeeArray)
. . .
虽然这不会
Employee.Name = "Andrew Nelson"
Employee.Bdate = "1/1/56"
Employee.Rank = "Senator"
CurrentEmployeeRecord = 0
For CurrentEmployeeRecord From LBound(EmployeeArray) To UBound(EmployeeArray)
. . .
我相信差异很明显。还有一些关于对齐延续线的讨论。
答案 5 :(得分:5)
就个人而言,我更喜欢更高的代码可读性,但代价是稍微难以阅读的差异。在我看来,从长远来看,代码可维护性的改进 - 特别是在开发人员来来往往时 - 值得权衡。
答案 6 :(得分:2)
有了一位优秀的编辑,他们的观点是不正确的。 :)
(请参阅vim的“视觉阻止”模式。)
P.S。:好的,你仍然需要改变每一行,但它快速而简单。
答案 7 :(得分:2)
我尝试遵循两条准则:
尽可能使用制表符代替空格,以尽量减少重新格式化的需要。
如果您担心对版本控制的影响,请先进行功能更改,然后检查它们,然后再进行修饰更改。
如果在“整容”变化中引入了错误,则允许公开鞭.. : - )
答案 8 :(得分:1)
如果您计划使用自动代码标准验证(即CheckStyle,ReShaper或类似的东西),那些额外的空格将使编写和执行规则变得非常困难
答案 9 :(得分:1)
我的立场是这是一个编辑器问题:虽然我们使用花哨的工具来查看网页,但在文字处理器中编写文本时,我们的代码编辑仍然处于ASCII年代。它们和我们制作它们一样愚蠢,然后,我们尝试通过编写花哨的代码格式化器来克服编辑器的限制。
根本原因是你的编译器不能忽略代码中的格式化语句,这些语句说“嘿,这是一个表”,并且IDE无法动态地创建视觉上令人愉悦的源代码表示(即< em> without 实际上改变了代码的一个字节。)
一种解决方案是使用制表符,但我们的编辑器无法自动对齐连续行中的制表符(这会使这么多事情变得如此简单)。并且为了侮辱伤害,如果你搞乱了标签宽度(基本上是任何东西!= 8),你可以阅读你的源代码,但没有来自其他任何人的代码,比如,附带的示例代码你使用的库。最后,我们的diff工具没有选项“忽略空格,除非重要”,编译器也不能产生差异。
Eclipse至少可以以表格方式格式化赋值,这将使大型全局常量集更具可读性。但那只是沙漠中的一滴水。
答案 10 :(得分:0)
我们在多个合同中遇到类似的问题......我们发现标签最适合每个人。设置编辑器以维护标签,每个开发人员也可以选择自己的标签长度。
示例:我喜欢2个空格标签,代码在左边非常紧凑,但默认值是4,所以虽然它看起来非常不同,如缩进等等,在我们的各种屏幕上,差异是相同的并且没有不会导致源代码管理问题。
答案 11 :(得分:0)
我喜欢第一个也是最后一个,但不是中间那么多。
答案 12 :(得分:0)
您可以将diff工具设置为忽略空格(GNU diff:-w)。 这样,您的差异将跳过这些行,只显示真正的变化。非常方便!
答案 13 :(得分:-2)
这是优秀的主作为标签给出的原因 - 在行的中间添加一个字符不会搞砸对齐。