作者: Johnny.Liang 發布時間: 2015-05-28 17:48 閱讀: 3444 次 推薦: 30
筆者從事開發多年,有這樣一種感覺,查看一些開源項目,如SPRing、Apache Common等源碼是一件賞心悅目的事情,究其原因,無外兩點:1)代碼質量非常高;2)命名特別規范(這可能跟老外的英語水平有關)。
要寫高質量的代碼,不是一件容易的事,需要長年累月的鍛煉,是一個量變到質變的過程,但要寫好命名,只需要有比較好的英語語法基礎和一種自我意識即可輕松達到。本博文將會結合本人的開發經驗,總結出若干命名規則,這些命名規則純屬個人的使用習慣,不代表是一種理想的規則,在這里列舉出來,供大家交流討論。
1. 切忌使用沒有任何意義的英語字母進行命名
for(int i=0; i<10; i++) { //...}
這是在很多教java基本語法的書上常見的代碼片斷,作為教學材料,這樣寫無可厚非,但作為真正的代碼編寫,程序員必須要養成良好的習慣,不要使用這種沒有任何含義的命名方式,這里可以使用“index”。
2. 切忌使用拼音,甚至是拼音首字母組合
cishu =5; // 循環的次數zzje = 1000.00; // 轉賬金額
筆者在做代碼檢查的時候,無數次遇到過這樣的命名,使人哭笑不得。
3. 要使用英文,而且要使用準確的英語,無論是拼寫還是語法
4. 方法名的命名,需要使用“動賓結構短語”或“是動詞+表語結構短語”
筆者曾看到過千奇百怪的方法命名,有些使用名詞,有些甚至是“名詞+動詞”,而且,如果賓語是一個對象集合,還是最好使用復數。
createOrder(Order order) //good orderCreate(Order order) //badremoveOrders(List<Order> orders) //good removeOrder(List<Order> order) //bad
5. 對于常見的“增刪改查”方法,命名最好要謹慎
6. 寧愿方法名冗長,也不要使用讓人費解的簡寫
筆者曾經遇到一個方法,判斷“支付賬戶是否與收款賬戶相同”,結果我看到一個這樣的命名:
checkIsOrderingAccCollAccSame(...)
很難理解,我馬上把它改為:
isOrderingAccountSameAsCollectionAccount(...)
雖然有點長,但非常容易閱讀,而且這種情況總是出現得比較少。
7. 如果你在設計業務系統,最好不要使用技術化的術語去命名
筆者曾經工作的公司曾經制訂這樣的命名規則,接口必須要以“I”開頭,數據傳輸對象必須以“DTO”作為后綴,數據訪問對象必須以“DAO”作為后綴,領域對象必須以“DO”作為后綴。我之所以不建議這種做法,是希望設計人員從一開始就引導開發人員,要從“業務”出發考慮問題,而不要從“技術”出發。所以,接口不需要非得以“I”開頭,只要其實現類以“Impl”結尾即可(注:筆者認為接口是與細節無關的,與技術無關,但實現類是實現相關的,用技術化術語無可口非);而數據傳輸對象,其實無非就是保存一個對象的信息,因此可以用“**Info”,如CustomerInfo;領域對象本身就是業務的核心,所以還是以其真實名稱出現,比如Account、Customer;至于“DAO”,這一個詞來源于J2ee的設計模式,筆者在之前的項目使用“***Repository”命名,意味“***的倉庫”,如AccountRepository,關于“Repository”這個詞的命名,是來源于Eric Evans的《Domain-Driven Design》一書的倉庫概念,Eric Evans對Repository的概念定義是:領域對象的概念性集合,個人認為這個命名非常的貼切,它讓程序員完全從技術的思維中擺脫出來,站在業務的角度思考問題。說到這里,可能有人會反駁:像Spring、Hibernate這些優秀的框架,不是都在用“I”作為接口開頭,用“DAO”來命名數據訪問對象嗎?沒錯!但千萬別忽略了語義的上下文,Spring、Hibernate框架都是純技術框架,我這里所說的場景是設計業務系統。
8. 成員變量不要重復類的名稱
例如,很多人喜歡在Account對象的成員變量中使用accountId,accountNumber等命名,其實沒有必要,想想成員變量不會鼓孤立的存在,你引用accountId,必須是account.accountId,用account.id已經足夠清晰了。
“勿以善小而不為,勿以惡小而為之”、“細節決定成敗”,有太多的名言告訴我們,要注重細節。一個優秀的程序員,必須要有堅實的基礎,而對于命名規則這樣容易掌握的基礎,我們何不現行?
新聞熱點
疑難解答