編排

程式的編排、可讀性、風格會在程式中立下先例,持續且深遠的影響程式的可維護性和可擴充性。

原始檔的最上方,提供高階的概念和演算法,在往下閱讀時,程式的細節才慢慢呈現出來,直到出現最低階的函式及細節為止。

概念間的垂直空白區隔

幾乎所有程式碼都是由上而下,由左至右。 每一行程式碼都代表一個表達式或某個程式子句,還有每一段程式碼都代表一個完整的思緒。

應該用空白行來分隔這些思緒

每一個空白行代表一個視覺上的提示,提示著空白行的後方將接續一個新而不同的概念。所以人的目光會被吸引到空白後的第一行。

垂直密度

垂直密度意味著密切相關的程度。

如果一群程式碼之間如果密切相關的話,它們就該是垂直緊密的。

垂直距離

在程式的垂直編排上,具有極度類似概念的應該盡可能地靠近。(很明顯,這項準則在同概念,但分散於不同檔案的情況下並不適用。但除非你有個好理由,否則相近的概念不應該分散在不同的檔案,這也是避免使用protected的理由之一)

變數宣告應該盡可能靠近被使用的地方

實體變數應該被宣告在類別的上方

(C++中通常放在類別的最下方,Java通常放在類別的最上方)

依照慣例放置,讀者就比較知道該去哪裡找 ~

相依的函式應該盡可能靠近,高階的在上方,低階的在下方(垂直的順序),這樣可以更容易尋找,藉此增加可讀性。

概念相似性的也應該盡可能靠近,例如:

assertTrue(a,b){...}

assertTrue(a){...}

assertFalse(a,b){...}

assertFalse(a){...}

水平的編排

空白有兩種用意,一種是為了突出,一種是強調運算子的優先性。

在設定運算子附近都加空白,用來突出 左邊右邊

方法名稱和旁邊的() 要貼著,()內的參數也要貼著,因為函式參數高度相關。

,後留空白是用來突出各個不同的參數。

method(a, b, c);

因為乘法的優先權高於加減法,所以乘法運算子的旁邊沒有空白。

(-b + Math.sqrt(determinant)) / (2*a)

(水平的對齊)

不需要做,這會造成讀者聚焦在錯誤的地方,而忽略某些東西。

縮排

一個原始檔是個階層架構

檔案 > 類別 > 方法 > 程式區塊

母程式區塊 > 子程式區塊

每一個階層都是一個視野(scope)

在某些情況下,while、for的程式區塊會是空白的,這時還是換行、縮排、留分號

while( ... )
    ;

重視團隊的共同準則

一致的風格,可以增加可讀性。

倘若一個軟體系統混合了各種不同個人風格的程式碼,會增加閱讀程式碼的複雜性。

Uncle Bob的編排準則

上大括號不會換行

單行if for 會省略大括號

Last updated