本章探討程式碼佈局(Layout)這一兼具美學與實用性的議題。佈局不影響執行速度或記憶體使用,但深刻影響程式碼的可讀性、可審查性與可維護性。好的佈局讓邏輯結構一目瞭然,壞的佈局則使最優秀的命名與註解都失去作用。
31.1 佈局基本原則#
格式化基本定理(Fundamental Theorem of Formatting)#
好的視覺佈局能展現程式的邏輯結構。這是所有佈局決策的首要準則。
讓程式碼「看起來漂亮」有價值,但遠不如展現結構重要。若某技巧更能呈現結構,即使不夠美觀也應優先採用。
人與電腦的不同解讀#
電腦只看大括號與關鍵字,人類則從縮排與空白推斷邏輯。當視覺結構與實際邏輯不一致時(例如 for 後缺少大括號但多行縮排),會嚴重誤導讀者。
好的佈局值多少?#
研究顯示程式設計師對格式有強烈預期,違反時理解能力顯著下降(Soloway and Ehrlich)。Shneiderman 的研究也證實合理排列的程式碼有助專家記憶——與西洋棋的記憶實驗結論一致。
具體使用哪種佈局風格,遠不如一致地使用某種風格來得重要。
好的佈局目標#
- 準確呈現邏輯結構
- 一致地呈現(規則例外越少越好)
- 提升可讀性
- 耐受修改(改一行不應連帶修改數行格式)
31.2 佈局技術#
空白(White Space)#
- 分組(Grouping):相關述句歸在一起,形成「程式碼段落」
- 空行:分隔不相關的群組。最佳比例約 8-16%,超過 16% 除錯時間大幅增加
- 縮排:2-4 格最能提升理解力;6 格雖看起來舒服,理解分數反而較低
括號(Parentheses)#
運算式含兩個以上運算元時,即使非必要也應加括號,消除對優先順序的推理負擔。
31.3 佈局風格#
佈局爭議大多圍繞在區塊(Block)——由大括號或 begin/end 包圍的述句群組。
純區塊風格(Pure Blocks)#
Visual Basic 等語言每個控制結構都有終止關鍵字(If...End If、While...Wend),區塊自然形成。
仿純區塊風格(Emulating Pure Blocks)#
{ 放在控制述句尾端,} 與控制述句對齊。Java 標準慣例,C++ 也常見。
begin-end 區塊邊界風格#
{ 獨立佔一行並縮排於控制述句下方。研究顯示兩種風格在理解力上無統計顯著差異(Hansen and Yim 1987)。
行尾佈局(Endline Layout)#
程式碼縮排至行尾對齊。簡單情境看似整齊,但嵌套變深時迅速崩壞。
行尾佈局不準確、難以一致應用、難以維護,應盡量避免。
該選哪種?#
Visual Basic 用純區塊;Java 用仿純區塊;C++ 兩種皆可,選一種後一致使用。
31.4 控制結構的佈局#
區塊格式的細節#
- 避免未縮排的 begin-end 對:違反格式化基本定理,
{既不屬於控制結構也不屬於區塊 - 避免雙重縮排:
{縮排後內部再縮排,會誇大程式複雜度
其他考量#
- 用空行分隔程式碼段落,不同任務間以空行分隔
- 單述句區塊:團隊專案推薦一律加大括號,一致且安全
- 複雜條件式分行:每個條件獨立一行
- 避免 goto;若不得已,標籤靠左全大寫、前後空行
- case 述句用標準縮排,避免行尾對齊的維護問題
31.5 單條述句的佈局#
述句長度與空格#
傳統上限 80 字元,現代螢幕偶爾超過可接受。在邏輯運算式、陣列索引、子程式引數中加空格增進清晰度。
續行的格式#
續行格式的準則
- 讓不完整性顯而易見:第一行尾端以運算子(
&&、+、,)結束 - 將相關元素放在一起,不要在中間斷開
- 續行使用標準縮排(3-4 格)
- 每個引數獨佔一行亦可,以
);收尾
將運算子放在續行開頭而非前一行結尾,方便沿左邊界掃描運算結構。
每行一條述句,避免副作用#
每行一條述句能準確反映複雜度、方便除錯與編輯。C++ 中 ++ 等運算子混在同一行會產生未定義行為,應獨立出來。不要對齊賦值運算子右側——維護成本極高。
資料宣告的佈局#
- 每行只宣告一個變數,方便註解、修改、定位
- 在首次使用處附近宣告,縮短存活範圍(Live Time)
- 依型別分組;若需字母排序代表子程式太大
- C++ 指標:星號靠近變數名,或為指標宣告型別別名
31.6 註解的佈局#
- 註解與對應程式碼同層縮排:靠左對齊會破壞視覺結構
- 註解前至少空一行,幫助瀏覽時快速掃過
31.7 子程式的佈局#
用空行分隔標頭、資料宣告與主體。參數列使用標準縮排,避免行尾對齊(函式名改了就要重排整個參數列表),推薦函式名獨佔一行、參數縮排標準量。
31.8 類別的佈局#
介面與實作的佈局順序#
- 介面:標頭註解 → 建構子/解構子 → Public → Protected → Private 方法與資料
- 實作:檔案標頭註解 → 類別資料 → Public → Protected → Private 方法
檔案與程式的佈局#
- 一個檔案放一個類別,以類別命名(如
CustomerAccount.cpp) - 子程式間至少空兩行,比內部空行多以產生視覺區隔
- 避免過度裝飾:建立層級——星號用於類別、破折號用於子程式、空行用於註解
更多資源#
- Kernighan and Pike,《The Practice of Programming》(1999)
- Vermeulen et al.,《The Elements of Java Style》(2000)
- Misfeldt, Bumgardner, and Gray,《The Elements of C++ Style》(2004)
- Kernighan and Plauger,《The Elements of Programming Style》, 2nd ed. (1978)
- Knuth,《Literate Programming》(2001)
要點#
- 視覺佈局的首要準則是呈現程式碼的邏輯結構,評估標準為準確性、一致性、可讀性與可維護性
- 外觀美醜是次要考量;底層邏輯良好且遵循準則,佈局自然不差
- Java 用仿純區塊風格;C++ 仿純區塊或 begin-end 邊界皆可
- 結構化本身比特定慣例更重要——不一致的佈局反而傷害可讀性
- 佈局議題常引發宗教戰爭;應區分客觀與主觀偏好,用明確準則引導討論