總結(jié)看完《代碼整潔之道》這本書之后得到的CheckList,可以用來指導(dǎo)之后的代碼review和重構(gòu)台腥。
命名
- 名副其實(shí)宏赘,替換更好的名字
- 使用有意義的變量名
- 用可搜索的名字
- 類名使用名詞,方法名使用動詞黎侈,方法名+參數(shù)使用動詞短語
- 一個概念一個詞
- 良好的描述技巧察署,共同的文化背景峻汉。
函數(shù)
- 函數(shù)要短小贴汪。一個函數(shù)只含有一個if-else
- 只做一件事
- 一個函數(shù)一個抽象層級。
- 描述性的名稱嘶是。
- 參數(shù)越少越好。
- 使用異常代替錯誤碼蛛碌。
- 消除重復(fù)聂喇,提取出公共方法。
- 持續(xù)打磨蔚携,精益求精。
注釋
- 注釋是代碼表達(dá)的失敗
- 一般注釋都不會得到維護(hù)酝蜒。
格式
- 單個文件(class)的最大限制是500行誊辉,多數(shù)應(yīng)該小于200行。
- 像報(bào)紙一樣亡脑,先給出大綱堕澄,再逐個給出細(xì)節(jié)實(shí)現(xiàn)。
- 不同概念的代碼塊用空格區(qū)分開蛙紫。
- 減少不必要的空行或注釋分散注意力拍屑。
- 團(tuán)隊(duì)內(nèi)使用統(tǒng)一的IDEA格式器,避免代碼風(fēng)格不一致坑傅。
對象和數(shù)據(jù)結(jié)構(gòu)
對象暴露行為僵驰,隱藏?cái)?shù)據(jù)(Service類)。數(shù)據(jù)結(jié)構(gòu)暴露數(shù)據(jù)蒜茴,沒有明顯的行為(DTO類).
遵守德墨忒爾律,模塊不應(yīng)該了解它所操作對象的內(nèi)部情形浆西。
比如這樣的代碼:
final String outputDir = ctxt.getOptions().getScratchDir().getAbsolutePath()
可以修改為:
Options opts = ctxt.getOptions();
File scratchFile = opts.getScratchDir();
final String outputDir = scratchFile.getAbsolutePath();
這樣的代碼依然不好粉私,只是要獲取outputDir而已,為什么這個函數(shù)要關(guān)心Options和File對象近零?
所以更好的實(shí)現(xiàn)方式是,把獲取outputDir的實(shí)現(xiàn)交給ctxt封裝起來秒赤。
String outputDir = ctxt.getOutputDir();
錯誤處理
使用異常而不是返回碼,可以避免很多冗余的檢查憎瘸。
避免使用可控異常入篮,這違反了開閉原則,當(dāng)?shù)讓訉?shí)現(xiàn)新增一種異常的時候幌甘,上層代碼也要跟著一起修改。
publc String getSomething throws NullPointException(){};
給出異常的上下文環(huán)境锅风,否則拋出的異常沒有任何意義酥诽。
依照需要定義異常代理類。通過代理類來處理各種異常情況皱埠。
定義常規(guī)流程肮帐,使用策略模式來處理異常情況。
別返回null值训枢,使用空的對象或容器來代替,避免if判斷和空指針異常忘巧。
邊界
封裝對于第三方接口和類的調(diào)用恒界,這樣就把可能的改動限制在封裝對象內(nèi)部,避免第三方接口的修改對自身系統(tǒng)帶來的過分影響砚嘴。
或者可以使用Adapter模式涩拙,將我們的接口轉(zhuǎn)換為第三方提供的接口,這樣也實(shí)現(xiàn)了對第三方接口的包裝耸采。
類
類應(yīng)該短小兴泥,體現(xiàn)出來就是一個類應(yīng)該只有一個權(quán)責(zé),當(dāng)你發(fā)現(xiàn)無法準(zhǔn)確定義一個類的name時洋幻,就該拆分這個類了郁轻。
單一權(quán)責(zé)原則認(rèn)為文留,一個類有且只有一條修改的理由好唯。
什么是高內(nèi)聚?一個類內(nèi)部應(yīng)該只有少數(shù)變量骑篙,這些變量在所有函數(shù)中都被使用到。保持高內(nèi)聚就會得到很多短小的類森书。
面向修改編程靶端,將系統(tǒng)的修改設(shè)計(jì)為新增擴(kuò)展類(開閉原則)。