代碼潔癖系列(二):命名的藝術

不知道你們還記不記得《家有兒女》裏有這麼一段經典臺詞:「我叫夏雪」,「我叫夏雨」,「我叫夏冰雹」。java

        

劉星本身給本身起的名字承包了我全部笑點。但仔細想一想這名字取的居然還挺不錯,不但有意義,還和夏雨夏雪的名字相呼應。程序員

回到主題,在咱們的代碼裏,命名是隨處可見的,好比給包命名,給類命名,方法名,參數名,變量名等等。那麼什麼樣的命名纔算是好的命名呢。這就是咱們今天要討論的。安全


名副其實微信

首先仍是要強調這一點,我讀過的糟糕的代碼有一個共同的特色,那就是代碼中存在大量隨意的,無心義的命名。好比:表示消耗多少小時的變量命名爲h,同做用域中還有一個想要表示「小時」相關的變量直接命名爲h1,一個List類型的變量就命名爲list。讀這種代碼不會使人開心,同時寫這種代碼的程序員的人身安全是沒法保證的。編輯器

public List<String> getThem() {
   List<String> list = new ArrayList<>();
   for (String key : keys) {
       if (theMap.get(key) == 1) {
           list.add(key);
       }
   }
   return list;
}


讀一下上面這段代碼,能看出有什麼問題嗎?或者說看完有人明白這段代碼要作什麼嗎?學習

我先來講一下個人問題:fetch


 getThem是get什麼?



list裏存的是什麼flex



 keys指的是什麼,爲何遍歷它



常量」1「的意義是什麼spa



這幾個問題可能只有寫這段代碼的人才能解釋(沒錯,就是我寫的)。因此我來給你們解釋一下,不過我不想一一回答上面的問題,我把代碼重寫一遍,看看還會不會有這樣的問題。.net

public List<String> getPaidOrderIds() {
   List<String> paidOrderIds = new ArrayList<>();
   for (String orderId : orderIds) {
       if (orderStatus.get(orderId) == OrderConstatn.PAID) {
           paidOrderIds.add(orderId);
       }
   }
   return paidOrderIds;
}


怎麼樣,上面的問題都清楚了嗎,若是不清楚能夠私下和我聯繫,我會給你推薦一個很是好的英語學習軟件。

這就是名副其實的重要性。


避免誤導

命名過程當中要注意的第二點就是要避免名稱對別人產生誤導,例如上面代碼中paidOrderIds這個變量,若是咱們命名成paidOrderIdList呢,看起來彷佛沒什麼問題,可是若是這個變量是Set類型或者其餘類型呢?命名爲xxxList還合適嗎,別人讀代碼的時候會下意識的認爲這是個List類型的變量(儘可能避免名稱中出現類型的名字)。

另外一點容易產生誤導的是數字和字母相像的狀況,好比,我命名一個變量叫作O1,在編輯器裏就很難分辨是O1仍是01,若是我寫一個這樣的表達式


O0=l1;


    估計別人會覺得我發明了什麼新的語言吧。

第三點是要避免區別較小的兩個名稱,好比XYZContinentController和XYZCentinentController這樣的命名,對於讀代碼的人來講簡直就是災難,對於寫代碼的人來講也存在很大的風險。(爲何不是災難?由於大部分人都是Ctrl+C/Ctrl+V的,這樣就減少一些出錯的概率。看來善用Ctrl+C/Ctrl+V仍是頗有必要的)


作有意義的區分

編譯器要求咱們在同一個區域內不能重複命名。那麼有的程序員就會寫出a1,a2,a3……這樣的命名,這看起來很爛,誰也不知道它們有什麼區別。再舉過來一個栗子,一個包中有兩個類,Product和ProductInfo,這時讓你查一下商品名稱,你知道要去哪一個類裏找嗎?事實證實,這樣的命名與a1,a2,a3之流別無二致。

既然要作區分,爲何不作些有意義的區分呢,一個類叫作Product,表示商品信息,另外一個叫作ProductStocks表示商品的庫存信息。這樣是否是更清晰一點呢,固然,我這裏只是舉個栗子,實際上可能不須要這樣定義。


別隨意使用簡寫

不要隨意使用簡寫,除非是你們都知道的簡寫。好比美國的命名寫成US,你們均可以理解,而若是generateCode寫成genCode就使人費解了。


使用能夠被搜索的名稱

像咱們在一開始的那段代碼,爲何要把常量「1」寫成OrderConstatn.PAID,不只是爲了可讀,也是爲了可搜索,試想,若是你要找這段代碼,去搜索數字1,會有多少結果?搜索PAID呢?親自試過以後相信你會回來點讚的。


類名和方法名

類名和方法名也要遵循上面的規範,除此以外,它們還有各自的規範:、


   類名不該該是動詞,避免使用Data、Info這樣的詞彙



  方法名應該是動詞,好比,saveXXX、deleteXXX


要專注

假如你在不一樣的類中,分別定義了方法getXXX、fetchXXX和findXXX,我要調用的時候怎麼知道某個類中應該使用哪一種方法?因此,爲何不都用getXXX的形式呢?這樣不管是對寫代碼的人仍是對調用的人來講都是莫大的喜訊。

適當添加語境

當你一些變量:firstName、lastName、street、houseNumber、city、state、zipcode。咱們能夠很輕易的判斷出,他們組合在一塊兒表示一個地址。那麼把state單獨拿出來呢?你還能知道它是什麼意思嗎?這時,咱們能夠把變量命名爲addrState、addrFirstName……這樣即使單獨看某個變量,也會理解它要表達什麼。固然更好的方法是定義一個名爲Address的類,把這些變量放到類中,事實上咱們也都是這樣作的。


固然,有時候也不能添加一些無心義的語境。咱們要開發一個「畫圖」的應用,那在每一個類名前加Drawing可不是什麼好主意。


結語

命名並不能算是什麼技術,而是一種寫代碼的習慣,但這種習慣有可能會決定你做爲一名程序員給人的第一印象。因此,養成一個好的命名習慣,也是對本身形象的維護。同時還能讓本身的生命安全更有保障(避免被同事……

END
往期精彩回顧
代碼潔癖系列(一):什麼是整潔代碼



本文分享自微信公衆號 - 代碼潔癖患者(Jackeyzhe2018)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索