《代碼整潔之道》
有意義的命名
- 名副其實 不用註釋也能看懂
- 避免誤導 iol容易與數字10混淆
- 做有意義的區分 a1 a2 ... aN
- 方便搜索的名稱 MAX_CLASSESPERSTUDENT 比找數字7容易
- 避免編碼
- 不用寫上類型,phoneNumber phoneString,類型改變時變量名容易忘記改;
- 類名名次,方法名動詞
- 避免雙關語 如 add insert append
函數
- 只做一件事 函數應該做一件事,做好一件事。只做一件事
- 每個函數一個抽象層級 自頂向下讀代碼,函數中混雜不同抽象層級,會讓人迷惑
- 描述性的名稱 長而具有描述行的名稱,要筆短而令人費解的名稱好
- 函數參數 數量越少越好,可以用對象封裝,參數不要做輸出
- 無副作用 函數承諾只做一件事,但還是會做其他被隱藏起來的事,在函數名上體現出來
- 分隔指令與詢問 函數要麼做事情,要麼回答什麼事,不可兼得
if(set("username", "tom"))
- 使用異常代替返回錯誤碼
- 抽離try/catch 代碼段 try和catch代碼快的主體部分抽離出來,形成函數
註釋
- 儘量用代碼來詮釋
- 提供信息的註釋
- 對意圖的解釋
- 警告 警告其他程序員修改後會有哪些影響
- javadoc
- 刪除註釋的代碼 有源代碼控制系統了
格式
- 垂直距離 空白行隔離開概念,相關函數儘量反正一起,被調函數在調用函數下面
- 橫向距離
a = b; -b + 4*a
main(String a, int b)
錯誤處理
- 使用異常而非返回碼
- 別返回null值
- 別傳遞null值
邊界
- adapter模式
單元測試
- TDD(測試驅動開發)
- 在編寫不能通過的單元測試前,不可編寫生產代碼
- 只可編寫剛好無法通過的單元測試,不能編譯也算不通過
- 只可編寫剛好足以通過當前失敗測試的生產代碼
- 保持測試整潔可讀性
- 每個測試一個斷言
- FIRST
- 快速 fast
- 獨立 independent
- 可重複 repeatable
- 自足驗證 self-validating
- 及時 timely
類
- 類應該小 單一權責原則,內聚
系統
- 構造與使用分開 工廠、依賴注入
- 擴容