怎樣的變數命名,才顯得有文化?

李中凱發表於2020-09-14

There are only two hard things in Computer Science: cache invalidation and naming things.
電腦科學領域只有兩大難題:快取失效和命名。
-- Phil Karlton

相信不少程式設計師都為變數命名這個問題傷透了腦筋。變數名太短了別人看不懂,太長了又顯得囉嗦,不長不短又考驗詞彙量,一不留神就跟已有變數名重複。取得一手好名字確實是一個挑戰,也是一門藝術。今天我們就來聊聊,到底要怎樣命名,才能顯示出水平?

不同的程式語言有不同的具體命名規範,通常包含在語言的風格指南里。本文不打算討論各種語言的程式碼風格問題,只討論跟具體語言無關的命名準則。

為什麼需要命名規範

從本質上來說,變數名只是個識別符號,用於表示記憶體中的一個地址或者資料。按理說只要符合程式語言的語法規則,無論怎麼命名都不會影響程式碼的執行結果。那為什麼我們還要強調命名規範呢?記得有人說過,程式碼首先是給人看的,其次才是計算機。程式碼在執行前,通常要經過作者深思熟慮的編寫,甚至同行評審(code review)過後,確保沒有明顯的問題才會交給計算機執行。計算機只負責編譯執行,才不管你的程式碼寫得好不好看,有沒有邏輯問題,擴充套件性如何等等。從這個角度說,良好的命名規範可以提高程式碼質量,減少軟體缺陷。

良好的命名具有自文件的作用,看變數名就知道代表什麼含義。無論對於團隊成員協作還是自己維護程式碼,都很有意義。否則就會出現下面這種尷尬的局面:

image

什麼是好的命名

在生活中,漂亮的人名讓人賞心悅目,還有著豐富的含義,讓人印象深刻。雖然說給變數命名不需要這麼高的文學水準,但是也要具備一些基本的要素。個人認為,好的變數名通常具備以下幾個特點。

  • 符合程式碼風格
    比如大小寫要求,使用特定的字元表示特殊的含義,等等。這些按照特定語言的規範和團隊規範來就行了。

  • 長短適中
    變數名不宜過短,也不宜過長。早些年編輯器不夠發達,為了少打幾個字母,能省則省,變數名往往很簡短,喜歡用各種縮寫。要是使用約定俗成的縮寫還好,最怕那些用拼音首字母縮寫的,看程式碼就像猜謎語。現在 IDE 如此強大,自動補全功能已經很完善了,完全沒必要為了省那幾個字母讓其他人看得一頭霧水。當然,也不是說越長越好,比如

function iCanNotReadTheNumberSoIWriteThisFunctionToTransformStringsToNumber() {}

這有點誇張了。記住一個原則:在足夠表達含義的前提下儘量簡短。

  • 有意義的單詞
    變數名最好是一個有意義的單詞,用來表示特定的含義,比如動作、屬性、資料等。當然,這也不是絕對的。比如在for迴圈裡用的i變數,已經約定俗成了,屬於作用域範圍很小的區域性變數,用完即丟。這種情況可以使用簡潔的命名。

  • 有具體的含義
    除了要有意義,還需要含義儘量具體。比如dataitemlist等,雖然也能用,但是含義太泛了,不夠具體。更好的名字是userProfileorderItembookList等,一眼就能看出所代表的業務模型。

  • 詞性準確
    屬性、方法、類等命名所採用的詞性也有講究。方法(函式)通常代表了一個動作或者狀態判斷,所以應該用動詞、系表結構、介詞短語或者動賓結構。比如renderisPrototypeOftoStringgetOrders等。說到這裡可能有人覺得有點裝X了,是不是要把英語老師請過來?其實也不必過分解讀,只要記住一個原則就行了,那就是方法代表了一個操作。這樣你就不會用一個名詞當做方法名。屬性名通常使用名詞,形容詞,動詞過去式等。類名基本用名詞,代表了一種業務模型。

  • 純英文
    這點沒辦法,誰讓發明程式設計的人是說英語的呢。雖然從程式設計語法上來說,有時候也能用非英文做識別符號,但是最好儘量避免這種不倫不類的做法。比如有人喜歡用拼音,甚至拼音和英語混著用。個別情況下可以用拼音,那是實在找不到對應的英文單詞了。大部分情況下,用純英文單詞顯得比較專業,以及,比較有文化(逼格)。還有就是,不要用中式英語!我見過太多的isModifyisDelete這種表達方式了,看得我尷尬癌都犯了。這種寫法,內部幾個人的專案也就罷了,如果是開源專案,拿出去都丟人啊!

以我多年的搬磚經驗,見過一些在命名方面比較講究的框架和庫,比如微軟的 .Net Framework,C# 的命名,用詞準確、精煉,看起來就很舒服。還有就是 Vue.js,API 命名也相當優雅。那幾個鉤子函式,createdmounteddestroyedactivatederrorCaptured等等,簡潔而不失準確,詞義相當到位。而相比之下,React 就稍差了。什麼componentDidMountcomponentWillMountshouldComponentUpdate……這一看就沒什麼文化嘛,表義有餘而精煉不足。

保命環節

好了,裝X到此結束。以上純屬個人觀點,請各位看官酌情而噴。本文只是從編碼規範方面談談自己的看法,不涉及任何技術層面的東西。有人會說,真正的高手還在乎這些嗎?操起鍵盤就是幹,完成需求就好了,程式碼寫那麼漂亮有什麼用?

image

有些人覺得程式碼寫得越晦澀難懂,越能顯示出水平。對此我只能說,打擾了!個人認為,只要程式碼還需要人閱讀(哪怕只有自己一個人),就應該對可讀性有點追求,把程式碼當成一件藝術品來看待。

其實看到這裡,很多人心裡有點犯難了。上面說得是有點道理,可是我英語很菜,詞彙量完全不夠用啊,怎麼辦?此處應該有英語培訓廣告……(金主記得來找我)

別害怕,程式設計都能學會,還怕幾個英語單詞?詞彙量不夠,不是有有道詞典嗎?再不濟用百度也行吧。總之,英語不好不能拿來當藉口喲。

這個圖的資訊量太大了,你們猜猜是什麼

相關文章