本章探討程式碼佈局(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 IfWhile...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 字元,現代螢幕偶爾超過可接受。在邏輯運算式、陣列索引、子程式引數中加空格增進清晰度。

續行的格式#

續行格式的準則
  1. 讓不完整性顯而易見:第一行尾端以運算子(&&+,)結束
  2. 將相關元素放在一起,不要在中間斷開
  3. 續行使用標準縮排(3-4 格)
  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 邊界皆可
  • 結構化本身比特定慣例更重要——不一致的佈局反而傷害可讀性
  • 佈局議題常引發宗教戰爭;應區分客觀與主觀偏好,用明確準則引導討論