不知道你們還記不記得《家有兒女》裏有這麼一段經典臺詞:「我叫夏雪」,「我叫夏雨」,「我叫夏冰雹」。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
list裏存的是什麼flex
常量」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呢?親自試過以後相信你會回來點讚的。
類名和方法名
類名和方法名也要遵循上面的規範,除此以外,它們還有各自的規範:、
方法名應該是動詞,好比,saveXXX、deleteXXX
要專注
假如你在不一樣的類中,分別定義了方法getXXX、fetchXXX和findXXX,我要調用的時候怎麼知道某個類中應該使用哪一種方法?因此,爲何不都用getXXX的形式呢?這樣不管是對寫代碼的人仍是對調用的人來講都是莫大的喜訊。
適當添加語境
當你一些變量:firstName、lastName、street、houseNumber、city、state、zipcode。咱們能夠很輕易的判斷出,他們組合在一塊兒表示一個地址。那麼把state單獨拿出來呢?你還能知道它是什麼意思嗎?這時,咱們能夠把變量命名爲addrState、addrFirstName……這樣即使單獨看某個變量,也會理解它要表達什麼。固然更好的方法是定義一個名爲Address的類,把這些變量放到類中,事實上咱們也都是這樣作的。
固然,有時候也不能添加一些無心義的語境。咱們要開發一個「畫圖」的應用,那在每一個類名前加Drawing可不是什麼好主意。
結語
命名並不能算是什麼技術,而是一種寫代碼的習慣,但這種習慣有可能會決定你做爲一名程序員給人的第一印象。因此,養成一個好的命名習慣,也是對本身形象的維護。同時還能讓本身的生命安全更有保障(避免被同事……
本文分享自微信公衆號 - 代碼潔癖患者(Jackeyzhe2018)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。