我最近发现我们公司有一套编码指南(隐藏在文档管理系统中,没有人能找到它).它通常看起来非常明智,并且远离通常的宗教战争,关于在哪里放置'{以及是否使用硬标签.但是,它确实表明"行不应包含嵌入的多个空格".这意味着不要做这种事情:
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 }, // ... }
对此的理由是,对一行的更改通常需要编辑每一行.这使得改变更加努力,并且更难理解差异.
我被撕裂了.一方面,像这样排列可以使重复代码更容易阅读.另一方面,它确实使差异难以阅读.
你对此有何看法?
由于我监督源代码的每日合并,...我只能建议反对它.
这很漂亮,但是如果你定期合并,"更容易阅读"的好处远远少于合并代码所涉及的工作量.
由于该格式无法以简单的方式自动化,因此第一个不遵循该格式的开发人员将触发非平凡的合并.
不要忘记在源代码合并中,不能要求diff工具忽略空格:
否则,""和""在diff期间看起来会相同,这意味着不需要合并...编译器(以及添加的编码器) String双引号之间的空格)不同意!
我被撕裂了.一方面,像这样排列可以使重复代码更容易阅读.另一方面,它确实使差异难以阅读.
好吧,因为让代码可以理解比让差异理解更重要,所以你不应该被撕裂.
排除类似线条的恕我直言确实大大提高了可读性.此外,它允许使用允许垂直选择的编辑器更容易地进行剪切.
我从不这样做,我总是建议不要这样做.我不关心难以阅读的差异.我确实认为首先要做这件事需要时间,并且每当必须重新排列行时需要额外的时间.编辑具有这种格式风格的代码是令人愤怒的,因为它经常变成一个巨大的时间汇,并且我最终花费更多时间格式化而不是进行真正的更改.
我也对可读性益处提出质疑.此格式样式在文件中创建列.但是,我们不读从上到下列样式.我们从左到右阅读.柱子分散了标准阅读风格,并将眼睛向下拉.如果它们并非完全对齐,那么这些列也会变得非常难看.这适用于无关的空白,但也适用于具有不同间距但在文件中一个接一个地落下的多个(可能不相关的)列组.
顺便说一句,我发现你的编码标准没有指定标签或支架位置真的很奇怪.混合使用不同的标签样式和大括号放置会比使用(或不使用)列式格式化更容易损害可读性.
我从来没有这样做过.正如您所说,有时需要修改每一行来调整间距.在某些情况下(如上面的条件),如果你消除了间距并将块放在与条件不同的行上,它将是完全可读的并且更容易维护.
此外,如果你在编辑器中有很好的语法高亮,那么这种间距不应该是必要的.
史蒂夫麦康奈尔在一本非常有用的Code Complete中对此进行了一些讨论.如果你没有这本开创性书籍的副本,请帮个忙买一个.无论如何,讨论是在第一版的第426和427页,这是我手上的版本.
编辑:
McConnell建议在一组赋值语句中对齐等号以表明它们是相关的.他还警告不要在一组任务中对齐所有等号,因为它可以在视觉上暗示没有任何关系.例如,这是合适的:
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) . . .
我相信差异很明显.还有一些关于对齐延续线的讨论.
就个人而言,我更喜欢更高的代码可读性,但代价是稍微难以阅读的差异.在我看来,从长远来看,代码可维护性的改进 - 特别是在开发人员来来往往 - 值得权衡.