代码格式:排列相似的行可以吗? [关闭]

问题描述 投票:20回答:14

最近,我发现我们公司有一套编码准则(隐藏在文档管理系统中,没人能找到它)。通常,这似乎非常明智,并且避免了通常的宗教战争,即在何处放置“ {”以及是否使用硬标签。但是,它确实建议“行不应包含嵌入的多个空格”。这意味着不要做这种事情:

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 },
  // ...
}

这样做的理由是,更改一行通常需要编辑每一行。这使得更改变得更加努力,并且很难理解差异。

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

您对此有何看法?

formatting coding-style alignment code-readability human-readable
14个回答
24
投票

由于我监督源代码的日常合并,所以我只能建议反对它。

这很漂亮,但是如果您定期合并,“易读”的好处将远远少于合并该代码所涉及的工作。

由于无法轻松地自动格式化,因此第一个不遵循该格式的开发人员将触发非平凡的合并。

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


1
投票
[我的立场是,这是一个编辑器问题:虽然我们使用精美的工具查看网页,并且在文字处理器中编写文本时,我们的代码编辑器仍停留在ASCII时代。它们尽我们所能而变得愚蠢,然后,我们尝试通过编写奇特的代码格式化程序来克服编辑器的限制。

0
投票
我们在多个合同中的差异存在类似的问题。我们发现选项卡最适合每个人。设置您的编辑器以维护标签,每个开发人员也可以选择自己的标签长度​​。

0
投票
我最喜欢第一个和最后一个,但中间不那么喜欢。

0
投票
您可以将差异工具设置为忽略空白(GNU差异:-w)。这样,您的差异将跳过这些行,仅显示实际更改。非常方便!

-2
投票
这完全是好主赐予Tabs的原因-在行的中间添加一个字符不会使对齐变差。

17
投票

我很伤心。一方面,排队这样可以制作重复的代码更容易阅读。在另一手,这确实使差异变得更难阅读。

好吧,因为使代码易于理解比使差异易于理解更为重要,所以您不应该被撕裂。

恕我直言,将相似的行排成一行确实可以大大提高可读性。此外,它允许使用允许垂直选择的编辑器更轻松地进行剪切粘贴。


15
投票

我从不这样做,我总是建议不要这样做。我不在乎差异很难阅读。我确实在意,这样做首先需要花费时间,并且每当必须重新对齐行时都需要花费额外的时间。编辑具有这种格式样式的代码非常令人讨厌,因为它通常会占用大量时间,而且我最终花费了更多的时间格式化,而不是进行真正的更改。

我也对可读性优点提出了质疑。这种格式样式会在文件中创建列。但是,我们不会在列样式中从上到下read。我们从左到右阅读。列分散了标准阅读样式的注意力,并向下拉眼睛。如果所有列都不完全对齐,它们也会变得非常难看。这适用于无关的空格,但也适用于多个(可能是不相关的)列组,它们的间距不同,但在文件中一个接一个地排列。

顺便说一句,我发现您的编码标准没有指定制表符或大括号的位置确实很奇怪。与使用(或不使用)列样式格式混合使用,将不同的制表符样式和花括号位置混合使用会大大损害可读性。


12
投票

我从不这样做。如您所说,有时需要修改每行以调整间距。在某些情况下(例如上面的条件),如果您消除了间距并将这些块与条件分开放在单独的行中,那么它将很容易阅读并且易于维护。

此外,如果您在编辑器中突出显示了不错的语法,则这种间距实际上不是必需的。


7
投票

在史蒂夫·麦康奈尔(Steve McConnell)经常使用的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) 
. . .

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


5
投票

我个人更喜欢更高的代码可读性,但代价是稍微难于读取差异。在我看来,从长远来看,值得改善代码的可维护性-特别是随着开发人员的到来-值得权衡。


2
投票

[拥有出色的编辑,他们的观点是不正确的。 :)

(请参见vim的“可视块”模式。]

P.S .:好的,您仍然需要更改每一行,但是它既快速又简单。


2
投票

我尝试遵循两个准则:

  1. 尽可能使用制表符代替空格,以尽量减少重新格式化的需要。

  2. 如果您担心对版本控制的影响,请先进行您的[[功能更改,将其检入,然后进行仅修饰性的更改。

    ] >>
  3. 如果在“美容”更改中引入错误,则可以进行公共鞭log。 :-)

1
投票
如果您打算使用自动代码标准验证(即CheckStyle,ReShaper或类似的东西),那么多余的空格将使编写和执行规则变得非常困难
© www.soinside.com 2019 - 2024. All rights reserved.