請給代碼多留一些空間

jopen 10年前發布 | 4K 次閱讀 代碼

最近在幾個不同的團隊中發現他們的編碼規范中對空格的用法大不相同。這激起了我的好奇心,因為我一直覺得,對于代碼格式中的空格的使用,應該有一個大家都公認的最好的習慣。但是在現實開發中,似乎沒有出現這樣的統一。

現狀

首先,我們看看在大多數Java IDE中Java代碼的風格習慣。

下面是一個例子:

public class Example {

public static void main(String[] args) {
    int answer = 2 + 4 * 6;
    for (int i = 0; i < 5; i++) {
        doSomething();
    }
    System.out.println("The answer is " + answer);
}

    private static void doSomething() {
        // something
    }
}

請注意,這是Java編程者中和其它類似C語言的語言中最常見的一種風格

在括號內部兩邊沒有留空格。只有當括號前面有關鍵字forwhile等時,空格才會出現在它們之間,但在方法名和其之后的括號間沒有空格。然而,在左大括號前總會有空格(這個左大括號一般會出現在一行的最后)。數學操作符總有空格包圍。而分號前不會有空格。

如果你經常閱讀代碼,也許認為這是很自然的安排,但如果你不是一個程序員,可能會認為這些規則太隨意,有很多不統一、特例、有待討論的地方。

請給你的代碼留下多一些空間

在我當前的開發項目中,公司里有兩個主要的開發團隊,一個是Load Test Products(LTP)團隊,另一個是Functional Test Products(FTP)團隊。兩個團隊里遵守了一些編碼風格習慣,其中對空格的使用都是特別慷慨,就像下面這個代碼片段的例子:

public class Example
{

    public static void main( String[] args )
    {
        int answer = 2 + 4 * 6;
        for( int i = 0; i < 5; i++ )
        {
            doSomething();
        }
        System.out.println( "The answer is " + answer );
    }

    private static void doSomething()
    {
        // something
    }

}

這種風格看起來代碼的密度更小,而且更有統一性(例如,在左括號前都沒有空格,在所有的括號、花括號、中括號的左右內邊都有空格)!我并不是說這樣比之前的風格更好或更差….只是這樣更容易區別單詞。代價就是一個屏幕里只能顯示更少的代碼。

雖然每種編碼風格都有各自的優勢和缺點,但讓我吃驚的是,FTP開發團隊最終決定轉向使用之前提到的最常見的那種編碼風格。他們認為這種轉變是值得 的,他們甚至還進行過討論,所以,我相信他們認為這種轉變是重要的。他們判斷的依據并不是這種比那種好…我認為這主要著眼于什么人習慣這種風格,因為我們 的大部分產品都是開源的,這是重要原因,更容易讓社群內的程序員捐贈代碼。

在我的團隊里,LTP團隊,我們仍然堅持我們的風格,不打算做任何改變。至少對于我來說,這是一種基于技術考慮的決定:如果另一種編碼風格沒有體現出任何的優勢(我們的這個項目對開源捐贈的需求很少),為什么要轉向另一種風格?

規則需要統一

我一直在給開源項目捐贈代碼,比如Ceylon編程語言,讓我非常吃驚的是,他們完全沒有遵守任何的編碼風格。你可以用任何你喜歡的風格來寫代碼。

也許某些被一些公司里大量的編碼規范驚嚇住的程序員會喜歡這樣,但我相信,如果沒一套編碼規范,你的項目的代碼很可能在格式上出現混亂。每個代碼捐贈者都會在提交的代碼里帶入他特有的代碼風格,這不奇怪,結果就是所有的代碼各式各樣,你從下面幾行代碼里就能看到多種不同的風格:

while (exists cell = iter) {
        if (exists elem = cell.element,
        elem==element) {
            last = cell;
        }
        iter = cell.rest;
    }
}

if (exists cell=last){
    cell.element=replacement;
    return true;
}
assert (0<=index<length);

我主要想提出的問題是:編碼風格究竟是不是一種重要的開發制度?它對程序員開發軟件的效率有多大影響?

我相信這個問題牽連到另外一個相似的問題:代碼的格式影響代碼的可讀性嗎?

代碼格式影響代碼的可讀性

我認為,這個問題非常容易回答!當然會影響。用眼睛逐行掃描一下下面兩段代碼(從Ceylon項目中選出的),你會很容易感覺到哪個更易讀。 – CeylonCreate)?

function validModuleNameChar(Character c)=>c.letter||c.digit||c in ['_','.' ];
if (!trimmedName.empty,
    validModuleNameFirstChar(trimmedName.first else 'X'),
    trimmedName.every(validModuleNameChar),
    !(trimmedName.split('.'.equals,true,false)).containsAny(ceylonKeywords.chain {""})) {
    return trimmedName;
}
function validModuleNameChar( Character c ) => c.letter || c.digit || c in ['_', '.' ];
if ( ! trimmedName.empty,
    validModuleNameFirstChar ( trimmedName.first else 'X' ),
    trimmedName.every ( validModuleNameChar ),
    ! ( trimmedName.split ( '.'.equals, true, false ) ).containsAny ( ceylonKeywords.chain { "" } ) )
{
    return trimmedName;
}

它們的區別也許很小,但如果你整天花大量的時間讀大量的代碼,這區別就大了。

從普通文字寫作中學到的經驗

說起代碼的可讀性,我們也許應該看看人們更普通的閱讀文字的能力,這種能力已經發展了幾千年,所以,應該會總結出來更好的方案!?

在“普通”的英文中,你可以看出約定俗成的對于空格的用法,而你卻看不到作家們討論他們是否應該在括號周邊使用空格的問題!
那么,如果代碼像“普通”英文那樣編寫,會是什么樣子?

回到我們上面簡單的例子:

function validModuleNameChar( Character c ) => c.letter || c.digit || c in ['_', '.' ];
if ( ! trimmedName.empty,
    validModuleNameFirstChar ( trimmedName.first else 'X' ),
    trimmedName.every ( validModuleNameChar ),
    ! ( trimmedName.split ( '.'.equals, true, false ) ).containsAny ( ceylonKeywords.chain { "" } ) )
{
    return trimmedName;
}

代碼里大部分的東西都本普通英文句子一樣。你使用括號將某些字詞“分組”。你在單詞和符號之間使用空格——這里我們發現了一個跟普通編碼習慣不一樣的地方:我們在調用方法時,方法名和之后的括號間沒有空格,對象點操作符后面不留空白。

我可以理解為什么在這些地方沒有空格,因為代碼里這些括弧或點號表示了一種“擁有”關系,或關聯關系。但真的有必要擠壓這一點空間來表示這種關系嗎?當我們看上面的這個例子代碼時不是感覺很清晰嗎?

另外一個在普通英文里不存在的東西是嵌套表達…所以,我們有普通英文寫作里不會出現的情況。但這不是大問題,只需要在記住一個通用規則:在符號兩邊加空格。

你是不是感覺上面的代碼有些奇怪?我不得不承認,看起來稍微有些不舒服,當我相信這只是我還不習慣。

雖然還不習慣,但我確定這些代碼讀起來更容易理解。

我可以明確的說,如果所有的代碼都遵守這樣的習慣,那我們程序員閱讀代碼的過程將會輕松的多。

結束語

我希望沒有程序員會認為遵守一個預先定義的編碼規范會讓編程變得困難!

首先,所有的IDE都能配置成自動對代碼進行格式規范調整,你寫代碼時可以寫的很亂,但最后別忘了使用IDE里的快捷鍵整理一下代碼,然后再提交代碼。同樣,我估計沒有哪個作家會認為我們的寫文字的格式太嚴,限制了他的創作。

幸運的是,我發現當前所有的編碼風格、規范里對空格的使用習慣都沒有大問題。但多使用一些空格肯定會讓代碼更清晰易讀。

你覺得呢?

[英文原文:Give your code some space! ]
來自: 外刊IT評論 http://www.vaikan.com/

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!