代碼中的命名

代碼中的命名

周偉光

2012-10-15

 

子曰:名不正則言不順。

 

       提到代碼裏面的命名,大家首先想到匈牙利命名法,駱駝命名法,.net命名規範,C/C++命名規範等。而本文中的命名,主要解決代碼可讀性的問題。

 

 

 

Bad Small

       當我接手一個新系統的時候,命名不規範讓我十分頭疼,改也不是,不改也不是。最好的結果就是,大家都能注意,不要把這些問題繼承給其他程序員。

單詞拼寫錯誤

       單詞拼寫錯誤,是最常見的“壞味”,最容易嗅到的。換句話說,是最臭的。我想,這個大家都應該聞到過。我們或多或少的,都吃過他的虧。如,我同事的代碼,讓我改。他寫了一大堆,我也沒時間全看。而現在客戶讓我馬上處理一個和Order相關的問題,我於是開始搜索Order這個單詞,結果找不到。怎麼辦,只能一個一個文件去“人肉”。最後發現,他把Order拼成了Ordre。這是簡單的例子,雖然拼寫錯了,但程序還是可以運行。再複雜一點的,還有.net裏面的反射。我這次可能要通過反射,或者在Configure文件裏配置,去調用我同事的代碼,我當然會正確的使用Order這個詞,但是我同事源代碼裏用了Ordre,於是就產生Bug了。

詞性誤用

       很多時候,很多人並不把它當作一個錯誤。經常看到這樣一個命名,叫IsReleased,乍一看,這應該是個屬性,但它卻偏偏是一個函數。可是函數應該是動詞呀,應該叫GetIsReleased

       正確詞性應該是這樣的:命名空間(.Net),類等用名詞;函數用動詞;屬性(Property)和域(Field)用名詞和形容詞。

單複數

       單複數也是我們中國人常見的錯誤。單複數的誤用,會對理解程序造成很大的障礙。我經常遇到,數組變量是個單數詞。

       一般單複數不同形的,數組裏應該使用負數形式。單複數同形的,可以加上後綴以示區別。如SheepList等。

縮寫

       縮寫是很傷可讀性的。一般形況,應該儘量避免。縮寫應該只限定在常用的,大家能理解的詞。而且,縮寫應該符合語言的規範。縮寫,這裏指英文縮寫。分爲兩種,首字母縮寫詞(Acronym)和其他縮寫詞。常用的首字母縮寫詞,都是可以用的,如URLHTMLIO等。而其他的縮寫詞,最好不要用了。如Department可以寫成Dpt,也可以寫成Dept,那如果你要用縮寫,就一點規範也沒有了。你知道Dpt,我也知道,但是換個人呢,他還知道DptDepartment麼?不過,也不是所有的都不能用。出現ID的地方,你還非得用ID不可,你如果用Identity,會很奇怪的。還有OK也是可以用的,這個全世界人民都知道,連不認識字的老太太都知道。我個人覺得,像Dpt這種字典裏查不出來的,就不要用了。

       首字母縮寫詞(Acronym),在使用的時候,不要自己造詞!我就見過,有人把中國人民銀行縮寫成了PBOC。我當時一看,就知道錯了。我心想,你還是大陸人麼? People’sRepublic of ChinaPeople’s Bankof China,全稱結構一樣的,差了一個詞而已。前者的簡稱,都應該知道是PRC吧,推導一下,就知道後者的簡稱應該是PBC了。那,我是不是馬上給他改了呢?不,如果我貿然改了,我也是自己造詞。怎麼辦?這個時候,需要去央行的網站看一下,看看官方說法。我查了官網,確定我是對的,纔給他改過來的。看了上面的例子,你也許認爲,O都是要拿掉的。那再舉一例,中華民國又叫ROC了。所以,沒有把握還是去查資料吧。

詞不達意

詞不達意,也分不同的情況。誤用了意思有欠準確的英語單詞是一種。還有一種,可能只表達了部分的意思。如一個函數,有兩個功能。這時,已經不是一個簡單的命名的問題了。最好把這個函數分成兩個。

不符合語言習慣

       我以前寫過一個函數,叫ChangeName。後來,我發現這樣寫不對,改成了Rename。同樣的一個問題是,別人來找重命名這部分的代碼的時候,十之八九,會用Rename這個關鍵詞。我不能讓別人找不到吧。

亡羊補牢

《戰國策》:“見兔而顧犬,未爲晚也;亡羊而補牢,未爲遲也。”

 

       對於亡羊補牢,大家有兩種態度,有人說,亡羊補牢,爲時未晚。有人說,亡羊補牢,爲時已晚。歷史上,有改名的,也有不改名的。美國的印第安人,人家明明不是印度人,英國人硬說人家是Indians,後來就約定俗成,沒法改了。韓國的首都,漢語叫漢城,叫了這麼多年,結果這兩年突然改成首爾了。你問我改還是不改,我只能學習美國外交部處理釣魚島問題時的回答了:We don't have a position(我們沒有立場)。

       修改命名,其實也是一件危險的事情。我自己就有過血的教訓。程序的成員有全局和局部的。對於局部成員,重命名影響比較小。如一個函數裏面,所定義的變量,你把他的名字改了,他的影響是不會傳遞出去的。

如果是Public成員,就危險了。你要注意三個方面。一、引用到他的地方,也要一起改了。這對於所有項目都在一個解決方案(Solution)裏的情況,問題不大,如果跨解決方案,會麻煩一點。二、反射它的地方,這點就是我經過血的教訓得到的。當時別人拼寫錯了,我給他該對了。結果QA一測,說某個地方本來沒問題,怎麼讓你改出問題了。我找了半天,結果發現,他在某處還反射調用了。反射的地方拼寫也是錯的。兩個都錯,正好“負負得正”了。反射用的是字符串,而不是類名。也就是說,這個問題,只有運行時才能發現。三、Configure文件裏面的配置。其實三和二是同一個問題,單獨提出來,是爲了讓大家查完了代碼裏面的反射,不要忘了還有Configure文件裏面的反射。

還有Protect成員,也作爲Public成員處理。

另外一個容易出錯的,是Internal成員。一般情況Internal成員改名,影響範圍應該只涉及到項目本身。然而,有一種特殊情況,會讓Internal成員改名的影響,超出項目的範圍。Assembly有個屬性,叫InternalVisibleTo,意思就是項目A可以讓項目B訪問其Internal成員。這時,你可以參考上文處理Public成員的方法處理。

修煉

瞭解特定語言命名規範

       .Net程序員可以學習一下《.net設計規範》,Java程序員也自行去找書看。

學習系統API

       我見過一個函數,叫AddNDay。我看了以後,十分頭疼。DateTime裏面,不是有個函數叫AddDays麼。這邊命名成和系統一樣,多好,而且,就應該和系統一樣,一字不差,大小寫都一樣。如果是Java程序,就是addDays

向業務人員諮詢準確的用法

       有些縮寫詞,不要自己去創造,不要發明PBOC。同樣的,一些專業詞彙,更要避免自己去創造。有BA的,儘量請教BA

學好英語

       學好英語,不僅要向普通人那樣學。作爲程序員,還要有針對性的學習。可以看一些英語專業書。用英文的操作系統。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章