類命名
Kent Beck 提出其中大多數(shù)的規(guī)則。Kent Beck 的《Smalltalk Best Practice Pattern》是我
至今為止讀過的所有書里面最符合我審美觀點(diǎn)的書籍?淵博的知識和春秋的筆法。
簡單超類名?傳達(dá)設(shè)計(jì)目的
命名總要受各種因素的影響。你想把名字取得盡量短,易于輸入、格式化、容易說出口。
同時(shí),你也想讓名字盡可能包含更多的信息,這樣讀者就能夠更快地理解名字所包含的實(shí)際
內(nèi)容。你可能取一些盡量為人所熟悉的名字,這樣在名字中就能傳遞更多的一起經(jīng)驗(yàn)。同
時(shí),你也想讓名字盡量唯一,別人的代碼命名就不會和你重復(fù)。
Kent Beck 給出的第一個(gè)規(guī)則就是不要縮寫??s寫對輸入(20 年內(nèi)10-100 次)的考慮
多余對理解(20 年內(nèi)1000-10000 次)的考慮。理解縮寫詞需要兩步,第一步理解這些縮寫
代表的詞語,第二步采取理解這些詞語所代表的意義。
對一個(gè)大層次的根類命名是個(gè)重大的決策。在未來的20 年中,人們可能不斷地使用
你所給出的名字。你必須不犯錯(cuò)誤。
人們通常在命名超類時(shí)加上各種各樣的修飾,富有計(jì)算機(jī)科學(xué)意義、給人深刻印象但最
終卻沒有意義的單詞,如Object,Thing,Component,Part,Manager,Entity 或Item。
你在創(chuàng)建一個(gè)詞匯表,而不是寫一個(gè)程式。暫時(shí)做一回詩人。簡單、生氣勃勃、容易記
憶遠(yuǎn)遠(yuǎn)比說出全部內(nèi)容更有效。規(guī)則:
Name a superclass with a single word that conveys its purpose in the design。
(用一個(gè)單詞命名超類,傳達(dá)他的設(shè)計(jì)目的),好的例子包括:
Number 、Collection、Magnitude、Model
全稱子類名?區(qū)分異同
命名類的一種方法是給一個(gè)唯一的名字。唯一的名字能讓你用用最短的信息表達(dá)最多
的信息。
這對于通用術(shù)語來說是對的。Array 是Collection 的一個(gè)子類,因?yàn)榻^大多數(shù)人都知道
“Array“意味著什么。
但在絕大多數(shù)情況下,類繼承的層次結(jié)構(gòu)對于理解你的代碼十分重要,特別是個(gè)子類
概念上是超類的變種同時(shí)又和超類共享實(shí)現(xiàn)的情況。你需要傳遞兩部分信息:
1.新類怎么相同,及
2.新類怎么不同
要表達(dá)相同,你能借用超類的名字。這不一定是個(gè)直接的子類和父類關(guān)系,層次上
有一定距離也無妨。要表達(dá)不同,你需要一個(gè)單詞確切地強(qiáng)調(diào)新類為什么不是超類的理由。
所以,有規(guī)則:
Name subclasses in your hierarchies by prepending on an adjective to the superclass
name。
(在超類名字前加上內(nèi)容命名你層次中的子類。)
例子:
BigInteger 是個(gè)能表達(dá)非常大非常大數(shù)字的整數(shù)。
方法命名?揭示意圖
為什么好的代碼總有非常多簡單的方法,代碼可能只有一行,譬如:
class ParagraphEditor。。。。
public void highlight(aRectangle:Rectangle){
reverse(aRectangle);
}
這個(gè)highlight 只是分派到reverse,為什么還需要?
關(guān)鍵在于Communication。因?yàn)橛辛诉@個(gè)方法,以后的代碼就能用highlight 來說話。
我要加亮一個(gè)區(qū)域,我就highlight 他。
你當(dāng)然能直接使用reverse,結(jié)果是相同的。但所有調(diào)用代碼都揭示了實(shí)現(xiàn)?“我通
過反轉(zhuǎn)一個(gè)矩形來加亮他“。
代碼應(yīng)當(dāng)揭示意圖,他另外的好處是能更方便通過繼承修整。如果你想要一個(gè)
ParagraphEditor 用顏色加亮,那么只需繼承ParagraphEditor 并覆蓋highlight 即可。所以:
communicate what is to be done rather than how it is to be done。
傳達(dá)你要做什么(接口)而不是你怎么做(實(shí)現(xiàn))。
實(shí)例(臨時(shí))變量命名?暗示角色
所有實(shí)例變量傳達(dá)的信息包括兩部分:
1.什么是他的目的?
2.他怎么被使用?
一個(gè)變量的目的或說他擔(dān)當(dāng)?shù)慕巧珜ψx者非常重要,因?yàn)樗軌蛘_地引導(dǎo)讀者的注
意力。一般,你在閱讀代碼時(shí)腦袋里總有一個(gè)目的。如果你理解變量的角色,而這個(gè)角色和
你的目的無關(guān),那么你能直接跳過使用該變量的無關(guān)代碼。如果發(fā)現(xiàn)該變量的角色和你的
目的有關(guān),那么你就能馬上縮小你的閱讀范圍?那些引用此變量的相關(guān)代碼。
一個(gè)變量怎么被使用和發(fā)送給他什么消息通常是他的“類型“。理解類型并非不重要。
不過,對于實(shí)例變量來說,你能夠了解這個(gè)變量所擔(dān)當(dāng)角色的唯一地方就是他的名字。如果
一個(gè)Point 中有兩個(gè)實(shí)例變量叫做int1、int2 而并非x、y,那么在你理解哪一個(gè)是橫向坐標(biāo),
哪一個(gè)是縱向坐標(biāo)前,你可能要都上一堆代碼。更何況你還要閱讀和之相關(guān)的非常多代碼。而
變量的類型非常容易從他聲明、傳遞給他的消息看出來。所以:
Name instance variable for the role they play in the computation。Make the name plural
if the variable will hold a Collection。
(用計(jì)算中實(shí)例變量所承擔(dān)的角色對他命名。如果變量持有一個(gè)集合,使用復(fù)數(shù)。)
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點(diǎn)擊舉報(bào)。