在大多数情况下,这是个人喜好,但是需要考虑一些事项。
可能的错误
虽然可以说,由于忘记附加括号的错误是罕见的,从我所看到 的是 他们 不 发生 偶尔(不要忘记著名的IOS转到失败的bug)。因此,我认为这应该是考虑您的代码样式时要考虑的因素(某些工具会警告您误导性缩进,因此它也取决于您的工具链)。
有效的代码(即读取像它可能是一个错误)
即使假设你的项目没有从这样的错误苦,读代码的时候,你可能会看到一些代码块,看上去就像他们可能是错误-但不是,采取了一些你的心理周期。
我们从开始:
if (foo)
bar();
开发人员添加了有用的注释。
if (foo)
// At this point we know foo is valid.
bar();
后来,开发人员对其进行了扩展。
if (foo)
// At this point we know foo is valid.
// This never fails but is too slow even for debug, so keep disabled.
// assert(is_valid(foo));
bar();
或添加一个嵌套块:
if (foo)
while (i--) {
bar(i);
baz(i);
}
或使用宏:
if (foo)
SOME_MACRO();
“ ...由于宏可能定义多行代码,因此宏会do {...} while (0)
用于多行吗?这应该是因为它在我们的样式指南中,但我最好还是以防万一!”
上面的示例都是有效的代码,但是代码块中的内容越多,您需要阅读的内容越多,以确保没有任何错误。
也许您的代码风格定义了多行块需要大括号(无论如何,即使它们不是代码),但我已经在生产代码中看到了这些注释。当您阅读它时,会有一个小小的疑问,就是最后编辑这些行的人忘了添加括号,有时我觉得需要仔细检查是否正在按预期的方式工作(尤其是在研究该代码区域的错误时)。
差异噪声
对单行使用括号的一个实际原因是减少diff噪声。
也就是说,更改:
if (foo)
bar();
至:
if (foo) {
bar();
baz();
}
...导致条件行在更改时显示在差异中,这增加了一些小的但不必要的开销。
- 这些行在代码审查中显示为已更改,如果您的差异工具是基于单词的,则您可以轻松地看到只改变了花括号,但这需要花费更多的时间检查行是否完全没有更改。
话虽如此,并非所有工具都支持基于单词的差异,diff(svn,git,hg等)将显示整行,即使使用精美的工具也是如此,有时您可能需要快速浏览一条普通线基于差异的差异,看看有什么变化。
- 注释工具(如
git blame
)将显示更改的线,从而使跟踪线的原点更加容易以找到真实的更改。
这些都是很小的,并且取决于您花费多少时间在代码审查或跟踪下,这些时间提交更改的代码行。
在diff中进行额外的行更改会带来更明显的不便,代码更改的可能性更大,这会导致冲突,这些冲突会合并在一起,需要手动解决。
对于有独立代码行的代码库,有一个例外{
-这不是问题。
该差异的噪音,如果你在这个风格写的论点是站不住脚的:
if (foo)
{
bar();
baz();
}
但是,这不是一个常见的约定,因此主要是为了提高完整性(不建议项目应使用此样式)。