「只要程式碼寫得好就不需要註解」是個誘人但錯誤的迷思——就像「冰淇淋對健康有益」一樣,我們都希望它是真的,但事實不是。
確實能做的事#
寫程式時可以做一些事減少對註解的需求:
- 選好的變數名(第 14 章)
- 結構清楚
但這些不能取代註解。
程式碼無法表達的設計資訊#
很多重要資訊根本無法僅靠程式碼表達:
- 類別介面中只有一小部分(如方法簽章)能在程式碼中正式表達
- 介面的非正式部分——例如方法做什麼的高階描述、回傳值的意義——只能透過註解
- 設計決策的理由(rationale)
- 一個方法何時該被呼叫的條件
「想知道方法做什麼?讀程式碼」這個論點不成立#
支持「無註解」的人會說:使用者想知道方法做什麼,自己讀程式碼最準。
問題:
- 從程式碼推回抽象介面極其耗時且痛苦
- 假設使用者會去讀實作 → 會逼開發者把每個方法寫得很短 → 製造一堆淺方法
- 反而更難讀:要懂頂層方法,得先懂巢狀的子方法
- 大型系統根本不可能讓使用者靠讀程式碼學行為
註解是抽象的根本#
抽象的目的是藏起複雜性:把實體簡化成保留必要資訊、省略可忽略細節的視角。
若使用者必須讀方法的程式碼才能用它,抽象就破功了——所有複雜性都暴露出來。
沒有註解時,方法唯一的抽象就是它的宣告:方法名 + 參數名 / 型別 + 回傳型別。
但宣告遠遠不夠:
例如 substring(start, end):
- 從宣告中,看不出取出的子字串會不會包含
end指的字元 - 也看不出
start > end時會發生什麼
註解能補上呼叫端需要的資訊,完成「簡化視角」並同時隱藏實作細節。
為什麼註解要用自然語言#
註解通常用英文(自然語言)寫——這讓它精確度比程式碼低,但表達力更高。
自然語言能寫出簡單、直覺的描述。
如果你要用抽象藏起複雜性,註解是不可或缺的。