第一部分 表面層次的改進
可讀性代碼的改進從 表面層次 的改進開始:選擇好的名字玻熙、寫好的注釋仔燕、代碼整潔的寫成更好的格式螟蝙。
第二章——把信息裝到名字里
無論是命名變量、函數(shù)還是類扼褪,都有很多相同的原則,嘗試把名字當(dāng)成一個小小的注釋語句粱栖,選擇一個好的名字话浇,讓其承載更多的信息。
-
選擇專業(yè)的詞
假設(shè)你有個Thread類:
class Thread{ void Stop(); };
Stop其實還可以闹究,但是如果該線程不能恢復(fù)幔崖,使用Kill應(yīng)該更好一些
-
找更有表現(xiàn)力的詞
下面列出一些表現(xiàn)力更強的單詞,依語境采用:
send -> deliver 渣淤、 dispatch 赏寇、 announce 、 distribute 价认、 route find -> search 嗅定、 extract 、 locate 用踩、 recover start -> lanch 渠退、 create 、 begin 脐彩、 open make -> create 碎乃、 set up 、 build 惠奸、 generate 梅誓、 compose 、 add 晨川、 new
-
用具體的名字代替抽象的名字
在給變量证九,函數(shù)或者其他元素命名時,要把它描述的更具體而不是更抽象共虑。
-
為名字附帶更多信息
一個變量名就像是一個小小的注釋愧怜,有時候我們可以讓它更有幫助些
附帶其他的重要屬性
-
名字應(yīng)該有多長
- 在小的作用域里可以使用短的名字
- 首字母縮略詞和縮寫: doc = document
- 丟掉沒用的詞
- 利用名字的格式來傳遞含義
第三章——不會誤解的名字
- 推薦使用 min 和 max 來表示(包含)極限
- 推薦使用 first 和 last 來表示包含的范圍
- 推薦使用 begin 和 end 來表示包含/排除范圍
第四章——審美
- 原則:
- 使用一致的布局,讓讀者很快就習(xí)慣這種風(fēng)格
- 讓相似的代碼看上去相似
- 把相關(guān)的代碼行分組妈拌,形成代碼塊
第五章——該寫怎樣的注釋
- 什么地方不需要這注釋
- 應(yīng)該記錄下來一些想法:為什么代碼寫成這樣而不是那樣拥坛、TODO、常量為什么是這個值
- 站在讀者的角度去思考:
- 預(yù)料到那部分的代碼會讓人搞不清楚尘分,加上注釋
- 為讀者意料之外的行加上注釋
- 在文件/類的級別使用“全局觀”注釋來解釋所有的部分如何一起工作的
第六章——寫出言簡意賅的注釋
- 避免使用不明確的代詞
- 盡量精確描述函數(shù)的行為
- 精心挑選輸入/輸出的例子
- 聲明代碼的高層次意圖猜惋,而非明顯的細節(jié)
- 用嵌入注釋解釋難以理解的函數(shù)參數(shù)
- 用含義豐富的詞語
第二部分——簡化循環(huán)和邏輯
第七章——把控制流變得易讀
- 條件語句中參數(shù)的順序:左側(cè)的值傾向于不斷變化、右側(cè)的值更傾向于常量
- if/else 語句塊的順序:首先處理正邏輯而不是負邏輯培愁、先處理簡單的情況
- ?: 表達式:只有在簡單的情況下使用
- 避免 do/while 循環(huán)
- 最小化嵌套
- 從函數(shù)中提前返回
第八章——拆分超長表達式
-
if line.split(':')[0].strip() == "root"
改為username = line.split(':')[0].strip();if username == "root"
- 拆分巨大的語句
第九章——變量與可讀性
變量越多著摔,就越難全部跟蹤他們的動向
變量的作用越到,就需要跟蹤它的動向越久
變量改變的越頻繁定续,就越難以跟蹤它的當(dāng)前值
- 減少變量谍咆,即那些妨礙的變量禾锤。通過離開處理結(jié)果來消除“中間結(jié)果”變量。
- 減少每個變量的作用域摹察,越小越好恩掷。
- 只寫一次的變量更好,那些只設(shè)置一次值的變量(或者 const 供嚎、final 黄娘、常量)使得代碼更容易理解。
第三部分——重新組織代碼
第十章——抽取不相關(guān)的子問題
第十一章——一次只做一件事
應(yīng)該把代碼組織得一次只做一件事情克滴。
第十二章——把想法變成代碼
學(xué)會用自然語言描述你要實現(xiàn)的功能逼争,寫出和描述匹配的代碼。
第十三章——少寫代碼
- 從項目中消除不必要的功能劝赔,不要過度設(shè)計
- 重新考慮需求氮凝,解決版本最簡單的問題
- 經(jīng)常性地通讀標準庫的整個API,保持對它們的熟悉程度
第四部分——精選話題
第十四章——測試與可讀性
- 使測試易于閱讀和維護
- 讓錯誤消息更具可讀性
- 選擇好的測試輸入
- 簡化輸入值
- 為測試函數(shù)命名