星期日, 12月 10, 2006

我的寫碼風格與技巧(二):寫碼風格

寫碼風格英文上常見的稱呼為 Coding Style, Programming Standards, Code Convention。

寫碼風格是直觀又個人化的東西,選擇自己喜歡的即可。
團隊作業時請遵循團隊規定的一致性寫碼風格。
縮排(ident)的意義為讓程式容易閱讀與維護。
常見縮排空白字元數:2、4、8,建議值為4。
現代編輯器的自由度很高,可以任意設定編輯器的 TAB 為喜歡的間隔。
if/else/for/while 之後的單行敘述,最好加上大刮號。


K&R 的縮排風格:

來源:The C Programming Language 書上的範例程式風格,作者為 Kernighan 和 Ritchie,K&R 同時也是 Unix 和 C 語言之父,所以此風格謂之 K&R Style。

特徵:是只有函式的大括號才換行,判斷式之後的大括號僅以一個空白分開。

隨想:某些語言有自己的縮排風格,像 Pascal、Basic,有些語言甚至是直接用縮排來做結構控制的,如 Python。

範例:
int func() {
    int a, b;
    if (a > b) {
        printf("%d", a);
    }
    return 0;
}

BSD/Allman 風格:

來源:Eric Allman 於 sendmail 中所使用的寫碼風格,Allman 與柏克萊(Berkeley)大學頗有淵源,而他所寫的 sendmail 也是 BSD (Berkeley Software Distribution) 中相當重要的一個套件,所以稱之為 Allman 或 BSD Style,這種風格很可能來自於 Pascal 的 Begin 和 End 寫法。

特徵:在函式或判斷式之後的大括號是以換行隔開。

隨想:Microsoft Visual Studio 將此風格當標準,大部份使用 Microsoft 開發軟體的程式員皆使用這種風格。

範例:
int func()
{
    int a, b;
    if (a > b)
    {
        printf("%d", a);
    }
    return 0;
}

GNU 風格:

來源:GNU 的寫碼風格文件。

特徵:與 Allman 風格極為類似,唯一的差異是在於換行後的大刮號有前置空白。

範例:
int func()
 {
    int a, b;
    if (a > b)
     {
        printf("%d", a);
     }
    return 0;
 }

if/else/for/while 之後的單行敘述,都應加上大刮號:

理由:維護程式碼時較不易出錯。
範例:


如果今天要修改程式,要在第一個判斷之中再加上一個判斷,不仔細檢查,很可能會變成如下程式:



錯誤原因:C 語言中的 else 是和最靠近的 if 做對應的,編譯器並不會因為 else 的縮排與第一個 if 相同,而將 else 與第一個 if 對應。

相關閱讀:
C++ 風格與藝術 (Practical C++ Language)
http://en.wikipedia.org/wiki/Indent_style
http://java.sun.com/docs/codeconv/index.html (中文版)
ftp://ftp.netbsd.org/pub/NetBSD/NetBSD-current/src/share/misc/style
http://pear.php.net/manual/en/standards.php
http://www.python.org/dev/peps/pep-0008/

沒有留言: