代碼應(yīng)當(dāng)易于理解
可讀性基本原理
關(guān)鍵思想: 代碼的寫法應(yīng)當(dāng)使別人理解它所需的時間最小化。
可讀性基本定理總是先于任何其他條例或原則挑豌。
表面層次的改進
如果你的代碼有很棒的名字酗失、寫的很好的注釋义钉,并且整潔地使用了空白符,你的代碼會變得易讀很多规肴。
命名藝術(shù)
- 選擇專業(yè)的詞
- 選擇的詞要能表達清楚信息捶闸,比如樹的高度,就可以用 height 而不是 size拖刃。
- 避免泛泛的名字(或者說要知道什么時候使用它)
- 好的名字應(yīng)當(dāng)描述變量的目的或者它所承載的值删壮。
- 比如 tmp,如果這個變量的唯一目的就是臨時存儲兑牡,它的整個生命周期只在幾行代碼之間央碟,這個變量沒有其他職責(zé),不會被傳到其他函數(shù)中國或者被重置以反復(fù)使用发绢,那么就可以使用 tmp硬耍, 但是如果變量最重要的目的不是臨時存儲垄琐,那么就應(yīng)該用一個可以表示變量意義的名字來代替 tmp ,這樣會更加具有描述性经柴。
- 用具體的名字代替抽象的名字
- 使用前綴或后綴來給名字附帶更多信息
- 比如變量如果表示時間狸窘,可以加上單位來讓變量表示更加清晰。
- 決定名字的長度
- 如果變量作用域比較小坯认,可以不用附帶太多信息翻擒,名字長度可以短一些。
- 如果名字中的某些單詞可以拿掉而不會損失任何信息牛哺,那么久可以丟掉這些沒用的詞陋气。
- 如果變量作用域比較大,可以采用比較長的名字引润,易于理解巩趁。
- 利用名字的格式來表達含義
- 有目的地使用大小寫。
- 不會誤解的名字
- 很多英語單詞在用來編程時是具有多義性的淳附,在命名的時候议慰,需要考慮這個名字是否會被誤解為另外一種意思,好的名字是不會被誤解的奴曙。
審美藝術(shù)
養(yǎng)眼代碼的原則
- 選擇一個有意義的順序别凹,并且始終一致地使用它。
- 讓相似的代碼看上去相似洽糟。比如可以采用列對齊的方式來排列參數(shù)炉菲,讓代碼看上去更清晰易讀。但是這樣也存在維護困難的問題坤溃,所以要慎重考慮拍霜。
- 把相關(guān)的代碼行分組,形成代碼塊浇雹。比如輸入沉御、實現(xiàn)、輸出就可以分成不同的代碼塊昭灵。
關(guān)鍵思想:一致的風(fēng)格比“正確”的風(fēng)格更加重要吠裆。
注釋藝術(shù)
關(guān)鍵思想:
- 注釋的目的是盡量幫助讀者了解得和作者一樣多。
- 不要為那些從代碼本身就能快速推斷的事實寫注釋烂完。
什么時候加注釋
- 可以為代碼中的瑕疵加注釋试疙,比如TODO、FIXME等抠蚣。
- 可以用注釋來總結(jié)代碼塊祝旷,易于讀者理解。
加注釋的要點
關(guān)鍵思想:注釋應(yīng)當(dāng)有很高的信息/空間率。
- 避免使用不明確的代詞怀跛,比如 it距贷。
- 精確描述函數(shù)的行為。
- 聲明代碼的高層次意圖吻谋,而非明顯的細節(jié)忠蝗。
- 用含義豐富的詞來使注釋更加簡潔。
控制流藝術(shù)
關(guān)鍵思想:把條件漓拾、循環(huán)以及其他對控制流的改變做的越“自然“越好阁最,運用一種方式使讀者不用停下來重讀你的代碼。
原則:
- 在寫一個比較時骇两,比較的左側(cè)表達式的值更傾向于不斷變化速种,比較的右側(cè)表達式的值更傾向于常量。
比如:while(bytes_received < bytes_expected)
比while(bytes_expected > bytes_received)
更易讀懂低千。 - 在寫
if/else
語句的語句塊時配阵,if 中國盡量先處理正確的、簡單的情況示血。比如闸餐,用if(debug)
而不是if(!debug)
- 盡量使用線性的代碼,避免深層次的嵌套矾芙。
表達式藝術(shù)
關(guān)鍵思想:把超長的表達式拆分成更容易理解的小塊。
方法:
- 引入解釋變量來代表子表達式近上,幫助讀者理解長表達式的意思剔宪。
- 用德摩根定理來操作邏輯表達式,比如壹无,
if(!(a && b))
可以變?yōu)?code>if(!a || b)葱绒。
變量藝術(shù)
原則
- 減少變量,比如一個臨時變量只用過一次斗锭,就沒有必要聲明這個變量地淀,因為它沒有壓縮任何冗余代碼。
- 縮小變量的作用域岖是,變量的作用域越大帮毁,越難掌握在哪里會用到這些變量,有可能會出現(xiàn)局部變量改變?nèi)肿兞康那闆r豺撑。
- 那些只設(shè)置一次值得變量烈疚,比如const、final等聪轿,可以 讓代碼更容易理解爷肝。
一次只做一件事的藝術(shù)
關(guān)鍵思想:應(yīng)該把代碼組織得一次只做一件事情。
流程:
- 列出代碼所做的所有任務(wù)。
- 盡量把這些任務(wù)拆分到不同的函數(shù)中灯抛〗鹕猓或者至少是代碼中的不同的段落中。
把想法變成代碼
流程:
- 假設(shè)你面前有一個人对嚼,對著他清楚地描述代碼要做什么夹抗,它的邏輯是什么。
- 注意描述中所用的關(guān)鍵詞和短語猪半。
- 寫出與描述所匹配的代碼兔朦。
Tips:如果需要,可以買一只小黃鴨磨确,讓它聽你描述沽甥。
少寫代碼的藝術(shù)
關(guān)鍵思想:最好讀的代碼就是沒有代碼。
避免寫新代碼的原則:
- 從項目中消除不必要的功能乏奥,不要過度設(shè)計摆舟。
- 重新考慮需求,解決版本最簡單的問題邓了,只要能完成工作就行恨诱。
- 多讀標(biāo)準庫中的API,保持對它們的熟悉程度。
測試與可讀性
關(guān)鍵思想:測試應(yīng)當(dāng)具有可讀性敛瓷,以便于其他程序員可以舒服地改變或者增加測試茧痕。
改進測試的要點:
- 測試的輸入/輸出最好可以用一行代碼來描述。
- 測試失敗后發(fā)出的錯誤信息要易于讓你去跟蹤并修正這個bug厕鹃。
- 使用最簡單并且能夠完整運用代碼的測試輸入。
- 給測試函數(shù)取一個有完整描述性的名字乍丈。