一、代碼應該易於理解
這裏提出一個概念-理解代碼時間,我們應該讓別人理解代碼的時間越短越好。
而不是所用的代碼越短越好。
1 變量名稱
- 避免使用temp/size/foo/get/stop這種意義不清晰或者表達意思不多的詞彙
- 循環中如果有意義,避免使用i/j,要用users/numbers這種有業務意義的詞
- 數值帶單位,比如秒還是毫秒都是時間,但是加上_ms或者_s就會一下子看出來不會處理出錯
- 作用域很小的時候名稱可以是短的
- 不需要進行首字母縮寫
2 命名技巧
- min和max表示極限
- first和last表示包含的範圍
- begin和end表示包含/排除範圍
- 布爾值要求定義明確,比如 use_ssl = true
- 和期望表示一致
3 審美
- 相似的代碼應當看上去相似
- 必要時使用列對齊,增加空白
- 用段落隔開增加邏輯
作用
- 消除大量代碼重複
- 添加新代碼更簡單
- 閱讀變得更直白
4 註釋
- 註釋的目的是幫助讀者瞭解的和作者一樣多
- 寫註釋之後會提高理解代碼的速度,業務簡單邏輯複雜的也要寫註釋
- 註釋加入思考過程,供以後參考
- 關鍵字
- todo 還沒處理
- fixme 已知的無法運行代碼
- hack 粗糙的解決問題方式
- xxx 危險重要的問題
- 常量加上註釋
- 標記意料之中的疑問
- 提前聲明代碼的問題
- 全局、總結的註釋
- 聲明高層次含義,而不是明顯的細節
二、簡化循環和邏輯
1 條件語句中的參數順序
- 比較的值是不斷變化的,比較的表達式的值傾向於常量
- 優先正邏輯,優先簡單邏輯,優先異常
- 三目運算符只處理最簡單的邏輯,默認使用if/else
- 避免使用do/while
- 從函數中提前返回return結果,通過提前return減少邏輯嵌套
2 拆分超長的表達式
- 引入做解釋的變量
- 使用總結變量
- 德摩根定理,取反之後顛倒邏輯,增加可讀性
- 短路邏輯會增加閱讀時間
3 變量的可讀性
- 減少沒有價值的臨時變量,減少中間結果
- 縮減作用域
- 操作變量的地方越多,越難確定他的值
三、重新組織代碼
工程學就是大問題拆成小問題再把這些問題的方案放回一起。把這條原則應用於代碼會使代碼更健壯並且更容易讀。
這也就是我們最基本的分而治之以及抽象的思想。
1 積極地發現並抽取不相關的子邏輯
- 關注更高層次的代碼
- 把一些解決了不相關的子問題的代碼,抽出到獨立的代碼中
- 子問題更容易被測試
- 創建大量通用代碼/工具類
- 簡化已有接口,按需重塑接口
- 把一般代碼和項目專有代碼分開
2 一次只做一件事
應該把代碼組織得一次只做一件事情。
- 整理碎片,切分小任務
2 想法變成代碼
- 清晰的自然語言描述邏輯,注意關鍵詞和短語,寫出匹配的代碼
- 如果你不能把問題說明白,那估計是缺少了什麼東西或者定義
泰迪熊太難了~
3 少些代碼
最好讀的代碼就是沒有代碼。
- 質疑和拆分需求,學會縮減需求
- 定期刪除沒用的代碼
- 重用庫
- 經常熟悉標準庫的API,避免重複編寫基礎代碼
三、精選話題
1 測試與可讀性
- 測試具有可讀性,測試代碼可以當做非正式的文檔
- 對使用者隱去不重要的細節,以便更重要的細節會更突出
- 讓錯誤信息更具可讀性
- 簡化輸入值。又簡單又能完成工作的測試值更好
- 給測試命名一般Test_開頭
參考資料
- 《編寫可讀代碼的藝術》