Ch8: 遠離註釋
觀念
本文討論的是function內的註釋
應該要避免用註釋(Rob Pike, 1989)
- 好的實作或function可以self describing
- 註釋不會被編譯器檢查
- 排版容易雜亂
應僅在code無法表達之處使用註釋(Kevlin Henney)
8.1 刪除過時的註釋
8.1 Outdated Comment
if (element.hasSelection() || element.isMultiSelect()) { // Is has a selection and allows multi selection
// ...
}
8.2 刪除被註釋掉的代碼
8.2 Commented-out code
const PHI = (1 + Math.sqrt(5)) / 2;
const PHI_ = (1 - Math.sqrt(5)) / 2;
const C = 1 / Math.sqrt(5);
function fib(n: number) {
// if(n <= 1) return n;
// else return fib(n-1) + fib(n-2);
return C * (Math.pow(PHI, n) - Math.pow(PHI_, n));
}
- 剛開始試運行註釋的Code,但是找到更好的實作,但對改善的Code沒有信心所以都保留
- 建議可以開branch實作新的,如果stable就merge,否則就保留既有的
8.3 删除瑣碎的註釋
8.3 Trivial comment
// Log error
Logger.error(errorMessage, e);
- Code可以self describing,註釋其實是沒有用處的
8.4 將註釋轉化為方法名稱
8.4 Comment documenting the code
// Build request url
if (queryString) {
fullUrl += "?" + queryString;
}
8.4.1 After
// Build request url
fullUrl = buildRequestUrl(fullUrl, queryString);
- 大家習慣在實作複雜邏輯透過註釋標記每個block要實現的內容
- 方法實現之後,註釋就會變得多餘,就可以刪除
8.5 保留記錄不變量的註釋
8.5 Comment documenting an invariant
// Log off used to force re-authentication on next request
session.logout();
- 這個註釋是否會阻止某人引入錯誤?
- 檢查是否可以將它們轉化為Code
- 是否可以製作一個自動化測試來驗證這個不變量
- 如果這兩者都不可行,我們保留註釋
8.5.1 實作流程上的不變量
- TODO / FIXME / HACK
- 作者認為可以有,但是要有指標監控這些註釋在減少
Summary
- 開發過程中註釋可能有幫助,但是要在交付時檢查把不必要的刪掉
- 介紹了五大類註釋
- 過時的註釋應該被刪除,因為它們可能導致錯誤。
- 被註釋掉的Code應該被刪除,因為Code已經存在於版本控制中。
- 瑣碎的註釋應該被刪除,因為它們不增加可讀性。
- 可以作為方法名的註釋應該變成方法名。
- 記錄非局部不變量的註釋應該轉化為Code或自動化測試;否則,我們保留註釋。