我有一個(gè)夢(mèng)想乍恐,我寫的代碼评疗,可以像詩歌一樣優(yōu)美。
我有一個(gè)夢(mèng)想茵烈,我做的設(shè)計(jì)百匆,能恰到好處,既不過度呜投,也無不足加匈。
整潔面向?qū)ο蠓謱蛹軜?gòu) (Clean Object-oriented and Layered Architecture存璃, COLA )
本書的結(jié)構(gòu)本書共分為三大部分:技藝部分、思想部分和實(shí)踐部分雕拼。
命名其實(shí)很難
命名為什么難呢纵东?因?yàn)槊倪^程本身就是一個(gè)抽象和思考的過程,在工作中啥寇,當(dāng)我們不能給一個(gè)模塊偎球、一個(gè)對(duì)象、一個(gè)函數(shù)辑甜,甚至一個(gè)變量找到合適的名稱的時(shí)候衰絮,往往說明我們對(duì)問題的理解還不夠透徹,需要重新去挖掘問題的本質(zhì)栈戳,對(duì)問題域進(jìn)行重新分析和抽象岂傲,有時(shí)還要調(diào)整設(shè)計(jì)和重構(gòu)代碼。因此子檀,好的命名是我們寫出好代碼的基礎(chǔ)镊掖。
Martin Fowler也表示過,他最喜歡的一句諺語是:“在計(jì)算機(jī)科學(xué)中有兩件難事:緩存失效和命名褂痰。(There are only two hard things in Computer Science: cache invalidationand naming things.)
- 變量名
變量名應(yīng)該是名詞亩进,能夠正確地描述業(yè)務(wù),有表達(dá)力缩歪。 - 函數(shù)名
函數(shù)命名要具體归薛,空泛的命名沒有意義。例如匪蝙,processData()就不是一個(gè)好的命名主籍,因?yàn)樗械姆椒ǘ际菍?duì)數(shù)據(jù)的處理,這樣的命名并沒有表明要做的事情逛球,相比之下千元,validateUserCredentials()或者eliminateDuplicateRequests()就要好許多。函數(shù)的命名要體現(xiàn)做什么颤绕,而不是怎么做幸海。 - 類名
實(shí)體類承載了核心業(yè)務(wù)數(shù)據(jù)和核心業(yè)務(wù)邏輯,其命名要充分體現(xiàn)業(yè)務(wù)語義奥务,并在團(tuán)隊(duì)內(nèi)達(dá)成共識(shí)物独,如Customer、Bank和Employee等氯葬。
輔助類是輔佐實(shí)體類一起完成業(yè)務(wù)邏輯的挡篓,其命名要能夠通過后綴來體現(xiàn)功能。例如溢谤,用來為Customer做控制路由的控制類CustomerController瞻凤、提供Customer服務(wù)的服務(wù)類CustomerService憨攒、獲取數(shù)據(jù)存儲(chǔ)的倉儲(chǔ)類CustomerRepository世杀。 - 包名
包(Package)代表了一組有關(guān)系的類的集合阀参,起到分類組合和命名空間的作用。包名應(yīng)該能夠反映一組類在更高抽象層次上的聯(lián)系瞻坝。例如蛛壳,有一組類Apple、Pear所刀、Orange衙荐,我們可以將它們放在一個(gè)包中,命名為fruit浮创。
保持一致性
每個(gè)概念對(duì)應(yīng)一個(gè)詞忧吟,并且一以貫之。例如斩披,fetch溜族、retrieve、get垦沉、find和query都可以表示查詢的意思煌抒,如果不加約定地給多個(gè)類中的同種查詢方法命名,你怎么記得是哪個(gè)類中的哪個(gè)方法呢厕倍?同樣寡壮,在一段代碼中,同時(shí)存在manager讹弯、controller和handler蔚出,會(huì)令人感到困惑稳懒。因此在項(xiàng)目中,作者通常按照表1-1所示的約定,保持命名的一致性师骗。
多使用對(duì)仗詞
- add/remove
- increment/decrement
- open/close
- begin/end
- insert/delete
- show/hide
- create/destroy
- lock/unlock
- source/target
- first/last
- min/max
- start/stop
- get/set
- next/previous
- up/down
- old/new
小心注釋
如果注釋是為了闡述代碼背后的意圖,那么這個(gè)注釋是有用的缅帘;如果注釋是為了復(fù)述代碼功能磷杏,那么就要小心了,這樣的注釋往往意味著“壞味道”(在Martin Fowler的《重構(gòu):改善既有代碼的設(shè)計(jì)》一書中庇楞,注釋就是“壞味道”之一)榜配,是為了彌補(bǔ)我們代碼表達(dá)能力的不足。就像Brian W.Kernighan說的那樣:“別給糟糕的代碼加注釋——重新寫吧吕晌。
1.不要復(fù)述功能
2.要解釋背后意圖