編寫高質量的程式碼,從命名入手
筆者從事開發多年,有這樣一種感覺,檢視一些開源專案,如Spring、Apache Common等原始碼是一件賞心悅目的事情,究其原因,無外兩點:1)程式碼質量非常高;2)命名特別規範(這可能跟老外的英語水平有關)。
要寫高質量的程式碼,不是一件容易的事,需要長年累月的鍛鍊,是一個量變到質變的過程,但要寫好命名,只需要有比較好的英語語法基礎和一種自我意識即可輕鬆達到。本博文將會結合本人的開發經驗,總結出若干命名規則,這些命名規則純屬個人的使用習慣,不代表是一種理想的規則,在這裡列舉出來,供大家交流討論。
1.切忌使用沒有任何意義的英語字母進行命名
for(int i=0; i<10; i++) { ... }
這是在很多教Java基本語法的書上常見的程式碼片斷,作為教學材料,這樣寫無可厚非,但作為真正的程式碼編寫,程式設計師必須要養成良好的習慣,不要使用這種沒有任何含義的命名方式,這裡可以使用“index”。
2.切忌使用拼音,甚至是拼音首字母組合
cishu =5; // 迴圈的次數 zzje = 1000.00 // 轉賬金額
筆者在做程式碼檢查的時候,無數次遇到過這樣的命名,使人哭笑不得
3.要使用英文,而且要使用準確的英語,無論是拼寫還是語法
- 名詞單數,必須使用單數英文,如Account、Customer。
- 對於陣列,列表等物件集合的命名,必須使用複數,而且最好按照英文的語法基礎知識使用準確的複數形式,如 List<Account> accounts、Set<Strategy> strategies。
- 對於boolean值的屬性,很多開發人員習慣使用isXXX,如isClose(是否關閉),但這裡有兩點建議:1)最好不要帶“is”,因為JavaBean的規範,為屬性生成get/set方法的時候,會用“get/set/is”,上面的例子,生成get/set方法就會變成“getIsClose/isIsClose/getIsClose”,非常彆扭;2)由於boolean值通常反映“是否”,所以準確的用法,應該是是用“形容詞”,上面的例子,最終應該被改為 closed,那麼get/set方法就是“getClosed/isColsed/setClosed”,非常符合英語閱讀習慣。
4.方法名的命名,需要使用“動賓結構短語”或“是動詞+表語結構短語”
筆者曾看到過千奇百怪的方法命名,有些使用名詞,有些甚至是“名詞+動詞”,而且,如果賓語是一個物件集合,還是最好使用複數:
createOrder(Order order) //good orderCreate(Order order) //bad removeOrders(List<Order> orders) //good removeOrder(List<Order> order) //bad
5.對於常見的“增刪改查”方法,命名最好要謹慎:
- 增加:最常見使用create和add,但最好根據英語的語義進行區分,這有助於理解,create代表建立,add代表增加。比如,要建立一個Student,用createStudent要比用addStudent好,為什麼?想想如果有個類叫Clazz(班級,避開Java關鍵字),現在要把一個Student加入到一個Clazz,Clazz很容易就定義了一個 addStudent(Student student)的方法,那麼就比較容易混淆。
- 修改:常見的有alter、update、modify,個人覺得modify最準確。
- 查詢:對於獲取單個物件,可以用get或load,但個人建議用get,解釋請見第7點的說明,對於不分條件列舉,用list,對於有條件查詢,用search(最好不要用find,find在英文了強調結果,是“找到”的意思,你提供一個“查詢”方法,不保證輸入的條件總能“找到”結果)。
- 刪除:常見的有delete和remove,但刪除建議用delete,因為remove有“移除”的意思,參考Clazz的例子就可以理解,從班級移除一個學生,會用removeStudent。
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已經足夠清晰了。
“勿以善小而不為,勿以惡小而為之”、“細節決定成敗”,有太多的名言告訴我們,要注重細節。一個優秀的程式設計師,必須要有堅實的基礎,而對於命名規則這樣容易掌握的基礎,我們何不現行?
相關文章
- 怎樣編寫高質量的java程式碼Java
- 如何編寫高質量的C#程式碼(一)C#
- iOS 編寫高質量Objective-C程式碼iOSObjectC程式
- [轉]高質量JAVA程式碼編寫規範Java
- 如何編寫高質量和可維護的程式碼
- 編寫高質量程式碼
- iOS 編寫高質量Objective-C程式碼(四)iOSObjectC程式
- iOS 編寫高質量Objective-C程式碼(一)iOSObjectC程式
- iOS 編寫高質量Objective-C程式碼(三)iOSObjectC程式
- iOS 編寫高質量Objective-C程式碼(二)iOSObjectC程式
- iOS 編寫高質量Objective-C程式碼(八)iOSObjectC程式
- iOS編寫高質量Objective-C程式碼(四)iOSObjectC程式
- iOS編寫高質量Objective-C程式碼(二)iOSObjectC程式
- iOS 編寫高質量Objective-C程式碼(五)iOSObjectC程式
- iOS 編寫高質量Objective-C程式碼(六)iOSObjectC程式
- iOS 編寫高質量Objective-C程式碼(七)iOSObjectC程式
- iOS編寫高質量Objective-C程式碼(六)iOSObjectC程式
- 如何編寫高質量的函式 -- 命名/註釋/魯棒篇函式
- 我們應該如何編寫高質量的前端程式碼前端
- 藉助 SublimeLinter 編寫高質量的 JS & CSS 程式碼JSCSS
- 藉助SublimeLinter編寫高質量的JavaScript & CSS程式碼JavaScriptCSS
- 編寫高質量程式碼的思考
- 如何書寫高質量的jQuery程式碼jQuery
- 《Effective JavaScript 編寫高質量JavaScript程式碼的68個有效方法》JavaScript
- iOS 編寫高質量Objective-C程式碼(一)—— 簡介iOSObjectC程式
- 🐒編寫高質量程式碼(手撕程式碼)
- 編寫靈活、穩定、高質量的HTML程式碼的規範HTML
- 編寫靈活、穩定、高質量的CSS程式碼的規範CSS
- [編寫高質量iOS程式碼的52個有效方法](九)塊(block)iOSBloC
- 消除程式碼中的壞味道,編寫高質量程式碼
- 編寫高質量iOS與OS X程式碼的52個有效方法(一)iOS
- 編寫高質量iOS與OS X程式碼的52個有效方法(五)iOS
- 編寫高質量iOS與OS X程式碼的52個有效方法(二)iOS
- 編寫高質量程式碼的十個祕訣
- 如何編寫高質量的函式 -- 敲山震虎篇函式
- 提高程式碼質量:如何編寫函式函式
- 編寫靈活、穩定、高質量的CSS程式碼的規範(推薦收藏)CSS
- 編寫高質量可維護的程式碼:一目瞭然的註釋