Formatting 代码格式:排列类似的行可以吗?

Formatting 代码格式:排列类似的行可以吗?,formatting,coding-style,alignment,code-readability,human-readable,Formatting,Coding Style,Alignment,Code Readability,Human Readable,我最近发现我们公司有一套编码指南(藏在文档管理系统中,没有人能找到)。一般来说,这似乎相当合理,避免了关于{放在哪里以及是否使用硬制表符的宗教战争。但是,它确实建议“行不应包含嵌入的多个空格”。这意味着不要做这种事情: foo = 1; foobar = 2; bar = 3; 或者这个: if ( test_one ) return 1; else if ( longer_test ) return 2; else if ( shorter ) retur

我最近发现我们公司有一套编码指南(藏在文档管理系统中,没有人能找到)。一般来说,这似乎相当合理,避免了关于{放在哪里以及是否使用硬制表符的宗教战争。但是,它确实建议“行不应包含嵌入的多个空格”。这意味着不要做这种事情:

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 },
  // ...
}
或者这个:

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 },
  // ...
}
这样做的理由是,对一行的更改通常需要编辑每一行。这使得更改更费力,也更难理解差异

我受够了。一方面,像这样排队可以让重复的代码更容易阅读。另一方面,它确实让差异更难阅读


你对此有什么看法?

有一个好的编辑,他们的观点就是不正确

(参见vim的“视觉块”模式。)

附言:好的,你仍然需要改变每一行,但它又快又简单

我很伤心。一方面,我在排队 这样可以使代码重复 更容易阅读。另一方面 另一方面,它确实使差异更难识别 阅读

好吧,因为让代码可以理解比让差异可以理解更重要,所以你不应该被撕裂


IMHO将类似的行排列起来确实大大提高了可读性。此外,它还允许使用允许垂直选择的编辑器更轻松地剪切粘贴。

2008:由于我每天监督源代码的合并,…我只能建议不要这样做

这很不错,但如果您定期进行合并,“更易于阅读”的好处很快就会远远小于合并代码所需的工作量

由于该格式不能以简单的方式实现自动化,因此第一个不遵循该格式的开发人员将触发非平凡的合并

不要忘记,在源代码合并中,不能要求diff工具忽略空格:
否则,“”和“”在diff期间看起来是一样的,这意味着不需要合并…编译器(以及在字符串双引号之间添加空格的编码器)不会同意这一点

2020年:如

在大多数IDE中,大多数代码合并应该能够处理忽略空白和对齐相等的问题,现在这是一个自动格式化选项

我仍然更喜欢有自己格式选项的语言,如和its。

甚至现在也有了。

我们在多个合同中遇到了类似的差异问题……我们发现标签对每个人都最有效。将编辑器设置为维护标签,每个开发人员也可以选择自己的标签长度


示例:我喜欢2个空格标签,左边的代码非常紧凑,但是默认值是4,所以尽管它在缩进等方面看起来非常不同。在我们的各种屏幕上,差异是相同的,不会引起源代码管理问题。

我从来没有这样做过。正如您所说,有时需要修改每一行来调整间距。在在某些情况下(如上面的条件句),如果去掉间距并将块放在与条件句分开的行上,它将非常可读,并且更易于维护


此外,如果编辑器中有适当的语法高亮显示,那么这种间隔应该不是必要的。

就我个人而言,我更喜欢更高的代码可读性,而不是更难阅读的差异。在我看来,从长远来看,代码可维护性的改进——特别是在开发人员来去匆匆的时候——是值得的这正是好的主给出标签的原因——在中间行加一个字符不会影响对齐。

我喜欢第一个也是最后一个,但不是中间那么多。

如果你计划使用一个自动代码标准验证(即,检查样式、整形器或类似的东西)。这些额外的空间将使编写和执行规则变得非常困难。

史蒂夫·麦康奈尔的《永远有用的》中对此进行了一些讨论。如果你没有这本开创性的书,请帮自己一个忙,买一本。无论如何,讨论在第一版的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) 
. . .

我相信差异是显而易见的。也有一些关于对齐续行的讨论。

您可以将您的diff工具设置为忽略空白(GNU diff:-w)。
这样,您的差异将跳过这些行,只显示真正的更改。非常方便!

我从不这样做,而且我总是建议您不要这样做。我不关心差异是否更难阅读。我只关心这样做首先需要时间,而且在需要重新对齐行时需要额外的时间。编辑具有is格式风格令人恼火,因为它经常会变成一个巨大的时间接收器,最终我花在格式化上的时间比做真正的更改要多

我还质疑可读性的好处。这种格式样式会在文件中创建列。但是,我们不以列样式从上到下阅读。我们从左到右阅读。这些列会分散标准阅读样式的注意力,并将眼睛向下拉。如果这些列没有完全对齐,它们也会变得非常难看。这个应用程序s指向无关的空白,但也指向多个(可能不相关)列组,这些列组具有不同的间距,但在文件中一个接一个地落下

顺便说一句,我发现你的编码标准没有指定制表符或大括号的位置真的很奇怪。混合使用不同的制表符样式和大括号的位置会比使用(或不使用u