大括弧之战

大括弧之战

2005-3-19

伟大的大括弧之战已经持续了多年,开发人员们仍然在毫不让步地争吵着大括弧在代码中应该摆放的位置。在多人的项目组里,每个人都给别人的代码重新排版是件很糟糕的事情,版本记录里大量的无用格式变化淹没了重要的有意义的修改,代码在各种格式间拉锯。大括弧的位置作为最具宗教性的争议,分为以下几个派别。

K&R风格:

if () {

以传说中的Kernighan & Ritchie之名命名,因他们的样例代码而被广为接受。又因Unitx内核使用这种风格,所以又被称作Kernel Style,也被它的信徒称作One True Brace Style。也因为C代码主要使用这种风格,也被其他类C语言的使用者称作C风格。

这种风格的流行,一是因为大部分教学书籍使用这种风格以节约纸张成本,二是随着Java的普及而被广泛接受。其优点是代码相当紧凑,对低分辨率的显示器和打印文稿来说很有价值;缺点是在有些情况下匹配大括弧有些困难,并且也因此产生很多子派别。如:

if () {
} else {
}

if () {
}
else {
}

当if语句的条件很长需要折行时,也有不同的处理方式:

if (aVeryLongBooleanExpression && anotherVeryLongBooleanExpression &&
    yetAnotherVeryLongBooleanExpression) {
    DoSomething();
}


if (aVeryLongBooleanExpression && anotherVeryLongBooleanExpression &&
        yetAnotherVeryLongBooleanExpression) {
    DoSomething();
}


或干脆把大括弧放下来

if (aVeryLongBooleanExpression && anotherVeryLongBooleanExpression &&
    yetAnotherVeryLongBooleanExpression)
{
    DoSomething();
}


另外有很多人喜欢在类和函数的上将大括弧独占一行,而语句里使用标准的K&R风格。如C#语言标准里的样例和Apache项目就使用了这种风格。这种写法也被认为是不同于K&R的另外一种风格。

void DoSomething()
{
    if () {

Allman风格:

if ()
{

以Berkeley黑客Eric Allman之名命名,又被称作BSD风格,也叫Ansi风格。大括弧独占一行。这是除了K&R风格外,唯一的在Java社群里大量使用的风格。而Dos/Windows程序员大部分使用这种风格,在这个社群里也被称作标准风格。优点是在所有的地方大括弧都是对称的,大部分人认同这种风格的代码更易读;缺点是浪费空间,比如:

try
{
    DoSomething();
}
catch
{
    DoSomething();
}

如果你无法忍受浪费的行,最好的办法就是用这些行来写注释。

GNU风格:

if ()
  {
    DoSomething();

所有GNU EMACS和自由软件基金会的代码都使用这种风格,除此之外没有其他地方使用。大括弧距离两边各两格。

Whitesmiths风格:

if ()
    {
    DoSomething();

因Whitesmiths C的样例代码而出名,现在已经很少有人用这种风格。

结论

对于这种没有正确答案的争论,最有效的方法是不要找任何理由,不用比较优劣。如果项目组内使用的工具或软件包是使用某一风格的,那么就和它保持一致;除此之外,选最易于统一管理的Allman风格。

你可能感兴趣的:(java,apache,C#,语言,工具,emacs)