
正名者,辨正名分也。
這一篇,我們簡(jiǎn)短聊一個(gè)很多人不屑于聊的話題,程序中的命名問題。
也就是說,我們?cè)趯懗绦虻臅r(shí)候,一個(gè)函數(shù)、變量、類、名空間、文件到底應(yīng)該如何辨正名分。
這個(gè)問題看似不值一提,可在大叔眼里,命名非常重要,名字好壞有可能決定程序的命運(yùn)。
什么!什么!沒這么嚴(yán)重吧?

-1- 正名很重要
古人云:“立品為先,字如其人”。
意思是,先端正做人,再端正寫字,通過寫字能夠影射出一個(gè)人的性格、心理、能力。
寫程序也類似,通過代碼中的命名也能夠看出一個(gè)程序員的修養(yǎng)與功底。欲正其名,先正其心,一個(gè)連變量名都起不好的程序員,很難寫出漂亮的代碼。
《論語(yǔ)·子路》篇有“名不正則言不順,言不順則事不成”之說。名分不當(dāng)、名實(shí)不符,說話就不合理,事情就很難辦成。
程序既然是由編程語(yǔ)言表達(dá)的,名不正也會(huì)導(dǎo)致言不順。命名不恰當(dāng),會(huì)造成大問題。如果你無(wú)法想出一個(gè)合適的名字,也許意味著你的設(shè)計(jì)有問題,需要加以重視。
試著想一想,假如把高級(jí)語(yǔ)言程序中的關(guān)鍵字、保留字、邏輯運(yùn)算符號(hào)統(tǒng)統(tǒng)去掉,可不就剩下你那些命名了嗎?這么大體量的內(nèi)容,怎能不重要?
著名的問題調(diào)查網(wǎng)站Quora,曾經(jīng)問過程序員覺得最難的事情是什么,經(jīng)過大量反饋,命名占卻了一半。
可見,命名是普遍問題,是難問題,是大問題。

那么,如何處理好這個(gè)問題呢?
大叔認(rèn)為:欲正其名,必使其從類、符實(shí)、達(dá)意、守一,別無(wú)它法。
什么意思?讓我們分而敘之。
-2-?從其類
所謂從其類,是說名字要能準(zhǔn)確表達(dá)事物類別。
不需解釋,這個(gè)名字是成員變量、是類、是方法、是函數(shù),是單例、是集合、一目了然。
表達(dá)類別的習(xí)慣有很多,例如,用'm_'表達(dá)成員變量,‘f_'表明函數(shù),前綴'_'表明私有,匈牙利命名法中把變量類型冠以名字。
這里不多累述,標(biāo)準(zhǔn)習(xí)慣實(shí)在太多,無(wú)論通用的還是公司自己制定的,統(tǒng)一即可。
-3- 符其實(shí)
所謂符其實(shí),是說名字要能夠符合事物的真實(shí)性。
既要簡(jiǎn)短,又無(wú)歧義;
要做到簡(jiǎn)短就要:
1)無(wú)多余表達(dá)
例如: isPageRedirectInCurrentWorkflow
如果沒有Other Workflow的情況,InCurrentWorkflow就是多余的。
如果上下文就是表達(dá)Page Redirect,PageRedirect就是多余的。
例如: getAllCustomers
如果沒有Partial Customers, All就是多余的。
例如:labelString
如果是表達(dá)label字符串,String是多余的。
2)無(wú)重復(fù)表達(dá)
例如:類Customer的實(shí)例方法getCustomerName
getName即可,不必重復(fù)Customer
-4-?達(dá)其意
所謂達(dá)其意,是說名字要準(zhǔn)確表達(dá)意圖。
命名常會(huì)用動(dòng)詞、形容詞來(lái)加以修飾,選好修飾詞也很重要。
“鳥宿池中樹,僧敲月下門?!?
唐代詩(shī)人賈島,為了斟酌“推”“敲”二字,行路中都在思考。準(zhǔn)確表達(dá)命名的意圖,也需要有推敲的精神。
例如:isXXX常用來(lái)判別變量是否是XXX類型。isShouldPay就不恰當(dāng),shouldPay即可;isInRange也不恰當(dāng), inRange即可。
例如:用getXXX, readXXX, fetchXXX, loadXXX要看行為的主體,有沒有讀取的過程,有沒有網(wǎng)絡(luò)傳輸,有沒有加載的意圖。
例如:少用when, if這些詞。getPaymentPlanSchedulesWhenModification就是很丑的名字,可以用getModifiedPaymentPlan。
有些行業(yè)性軟件,長(zhǎng)久以來(lái)已經(jīng)形成了些慣用的叫法,類似于行內(nèi)話,最好能夠參考行業(yè)慣例。
-5-?守其一
所謂守其一,是說名字要前后一致保持統(tǒng)一。
既是習(xí)慣的統(tǒng)一,也是情志的統(tǒng)一。
這一點(diǎn)非常重要,也是最常出的問題所在。即使命名不準(zhǔn)確,也比前后不統(tǒng)一、混亂無(wú)章好。
例如:表達(dá)某個(gè)集合數(shù)據(jù),有時(shí)候用data,有時(shí)候用items,有時(shí)候用list,有時(shí)候用collection,這就糟了。
命名的一致性,是代碼整潔的基礎(chǔ),也能體現(xiàn)程序員修養(yǎng)的地方。
君子尚德,對(duì)內(nèi)有誠(chéng)的一面:言行一致,情志一致。對(duì)外有敬的一面:為人著想,不蔓不枝。
今天叫個(gè)貓,明天叫個(gè)咪,在這里不行。
事無(wú)巨細(xì),欲寫出漂亮的代碼,要先從好的命名開始。
望諸君三思而命名。
-2018.07.04 蘭山 -