每一個程序員都應該掌握一套命名的方法論

俗話說,隔行如隔山,異步君的朋友曾天真地問我桌面上花花綠綠的“字母”是什麼?當我告訴她,沒有這些“字母”,就沒有她每天看的微博熱搜和小哥哥美照。

她:“???”

把代碼理解爲“字母”是外行鬧笑話,那同行是不是就能理解彼此?其實不然,對程序員來說,最痛苦的事情不是修BUG,看其他人寫的代碼更痛苦。

特別是看沒註釋的代碼,恨不得給同事一招乾坤大挪移,把他寫代碼時的腦子,移給自己。

“沒註釋的代碼就像小孩沒娘,說來話長”,在寫代碼時不規範命名,就好比設計師圖一時爽,新建了一大堆未命名-1.psd,未命名-2.psd……辛苦製圖大半天,交稿之時兩瞪眼。

編程也是一樣,代碼註釋做的好,可以大幅提升後期的編程效率,但一些小白程序員做的奇葩命名惹得大夥兒叫苦不迭——

實習生搞APP開發搞的滿身大汗,問咋了?他說我明明寫了main方法,爲什麼運行不了?一看代碼,驚了!main寫成了mian,更無語的是:蘋果手機命名是apple_sj,Android手機是android_sj……也不算太差,我見過命名是pingguo sj,anzhuo sj……

前端有一段代碼是20多個按鈕,根據不同的狀態,展示不同的按鈕組合……然後每個按鈕是一個變量表示其顯示還是隱藏,然後就看到了show1,show2,show3……show22,你以爲這是全部嘛?錯,其中一個show17竟然叫做shoe17……我……

曾接觸某個政府網站代碼,一溜的變量從a1遞增到a4,然後定義一個數組叫a5,第一個變量叫a6,第二個變量叫a7,數組長度叫a8,然後又定義其他的變量叫a9……其實,這樣的變量名有可能是後期替換的,增加閱讀難度。

在這裏插入圖片描述

每一個程序員都應該掌握一套命名的方法論,合理正確有條理的規劃這些編程內容,異步君特地推薦——《代碼精進之路》!

一、命名的力量

在程序員的工作中,大部分的時間都在閱讀和理解代碼,好的命名能夠讓代碼的概念清晰,增加代碼的表達力;詞不達意的命名會破壞我們思考的連貫性,分散有限的注意力。

命名其重要性往往被低估。而所謂的工匠精神,往往就是體現在細節之處,就日本的“煮飯仙人”50年專注於做好1碗米飯。一個名字雖然並不影響程序的執行,但是卻對代碼的表達力和可讀性有着重要的影響。

名爲萬物之始,萬物始於無名,道生一,一生二,二生三,三生萬物。

——《易經》

人名、企業名…命名有着巨大的力量。

在阿里巴巴初創的時期,馬雲想做一個國際化的電子商務網站,要起一個全球化的名字。有一天,他在舊金山的街上發現阿里巴巴這個名字蠻有意思的,正在思考時,一名服務員送咖啡過來。馬雲問他:“你知道阿里巴巴嗎?”他說:“當然知道了,就是open seasame(芝麻開門)”。

然後馬雲在街上找了來自不同國家的數十個人,問他們知道阿里巴巴嗎?他們大多能講到芝麻開門。在英文單詞裏,“a”排名又在第一位。而且大多數人一聽(看)到阿里巴巴這個名字,都會感到奇怪,這樣足以給人留下深刻的印象。

在Java企業級應用開發的歷史上,也有一段和命名有關的有趣歷史。在2000年左右,EJB(Enterprise Java Bean)大行其道,這讓Martin Fowler、Rebecca Parsons和Josh MacKenzie等人感到很困惑。

後來他們發現人們之所以不願意在他們的系統中使用普通的Java對象,是因爲其缺少一個酷炫的名字,因此他們在一次會議上給普通的Java對象起了個名字——POJO(Plain Old Java Object)。

當時的EJB在開發和部署上給開發者帶來了沉重的負擔,POJO概念的提出很快得到了開發者的擁護。Spring等一系列輕量級框架的誕生,很快終結了EJB的統治地位,因此在一定程度上,POJO這個名字加速了EJB的消亡。

二、命名其實很難

命名的過程是一個抽象和思考的過程。

在工作中,當我們不能給一個模塊、一個對象、一個函數,甚至一個變量找到合適的名稱的時候,往往說明我們對問題的理解還不夠透徹,需要重新去挖掘問題的本質,對問題域進行重新分析和抽象,有時還要調整設計和重構代碼。因此,好的命名是我們寫出好代碼的基礎。

就像Stack Overflow的創始人Joel Spolsky所說:

“起一個好名字應該很難,因爲一個好名字需要把要義濃縮在一到兩個詞中。"

Creating good names is hard, but it should be hard, because a great name captures essential meaning in just one or two words.

此外,Martin Fowler也表示,他最喜歡的諺語是:

在計算機科學中有兩件難事:緩存失效和命名。There are only two hard things in Computer Science: cache invalidation and naming things.

三、有意義的命名

代碼即文檔,可讀性好的代碼應該有一定的自明性,也就是不借助註釋和文檔,代碼本身就能顯性化地表達開發者的意圖。這種自明性在很大程度上依賴於我們對問題域的理解,以及命名是否合理。

通常,如果你無法想出一個合適的名字,很可能意味着代碼“壞味道”、設計有問題。這時可以思考一下:是不是一個方法裏實現了太多的功能?或者類的封裝內聚性不夠?又或者是你對問題的理解還不夠透徹,需要獲取更多的信息?

1.變量名

變量名應該是名詞,能夠正確地描述業務,有表達力。如果一個變量名需要註釋來補充說明,那麼很可能說明命名就有問題。

  1. int elapsedTimeInDays;

觀察上面的命名,我們只能從註釋中知道變量d指的是什麼。如果沒有註釋,閱讀代碼的人爲了知道d的含義,就不得不去尋找它的實例以獲取線索。如果我們能夠按照下面這樣的方式命名這個變量,閱讀代碼的人就能夠很容易地知道這個變量的含義。

  1. int elapsedTimeInDays;

類似的還有魔術數,數字86400應該用常量SECONDS_PER_DAY來表達;每頁顯示10行記錄的,10應該用PAGE_SIZE來表達。

這樣做還有一個好處,即代碼的可搜索性,在代碼中查找PAGE_SIZE很容易,但是想找到10就很麻煩了,它可能是某些註釋或者常量定義的一部分,出現在不同作用的各種表達式中。

2.函數名

函數命名要具體,空泛的命名沒有意義。

例如,processData()就不是一個好的命名,因爲所有的方法都是對數據的處理,這樣的命名並沒有表明要做的事情,相比之下,validateUserCredentials()或者eliminateDuplicateRequests()就要好許多。

函數的命名要體現做什麼,而不是怎麼做。假如我們將僱員信息存儲在一個棧中,現在要從棧中獲取最近存儲的一個僱員信息,那麼getLatestEmployee()就比popRecord()要好。

因爲棧數據結構是底層實現細節,命名應該提升抽象層次、體現業務語義。合理的命名可以使你省掉記住“出棧”的腦力步驟,你只需要簡單地說“取最近僱員的信息”。

3.類名

類是面向對象中最重要的概念之一,是一組數據和操作的封裝。對於一個應用系統,我們可以將類分爲兩大類:實體類和輔助類。

實體類承載了核心業務數據和核心業務邏輯,其命名要充分體現業務語義,並在團隊內達成共識,如Customer、Bank和Employee等。

輔助類是輔佐實體類一起完成業務邏輯的,其命名要能夠通過後綴來體現功能。例如,用來爲Customer做控制路由的控制類CustomerController、提供Customer服務的服務類CustomerService、獲取數據存儲的倉儲類CustomerRepository。

對於輔助類,儘量不要用Helper、Util之類的後綴,因爲其含義太過籠統,容易破壞SRP(單一職責原則)。比如對於處理CSV,可以這樣寫:

  1. CSVHelper.parse(String)2.               CSVHelper.create(int[])但是我更建議將CSVHelper拆開:1.     CSVParser.parse(String)2.                CSVBuilder.create(int[])
    

4.包名

包(Package)代表了一組有關係的類的集合,起到分類組合和命名空間的作用。在JavaScript的早期階段,因爲缺乏明確的分包機制,導致程序(特別是大型程序)很容易陷入混亂。

包名應該能夠反映一組類在更高抽象層次上的聯繫。例如,有一組類Apple、Pear、Orange,我們可以將它們放在一個包中,命名爲fruit。

包的命名要適中,不可太抽象,不能太具體。

此處以上面提到的水果作爲例子,如果包名過於具體,比如Apple,那麼Pear和Orange放進該包中就不恰當了;如果報名太抽象,稱爲Object,而Object無所不包,這就失去了包用來限定範圍的作用。

5.模塊名

模塊(Module)主要是指Maven中的Module,相對於包,模塊的粒度更大,通常一個模塊中包含了多個包。

在Maven中,模塊名就是一個座標: <groupId, artifactId>。一方面,其名稱保證了模塊在Maven倉庫中的唯一性;另一方面,名稱要反映模塊在系統中的職責。

例如,在COLA架構中,模塊代表着架構層次,因此,對任何應該遵循COLA規範的應用都有着xxx-controller、xxx-app、xxx-domain和xxx-Infrastructure這4個標準模塊。

四、命名工具

當你不知道如何優雅地給變量命名時,可以使用命名工具,快速搜索大型項目中的變量命名,看其他大型項目源碼是如何命名的,哪些變量名的使用頻率高。特別是對於英語非母語的我們,命名工具會非常有用。

我們可以在IDE中安裝一個搜索插件,便於搜索海量的互聯網上的開源代碼。舉例說明,作者一般會安裝一個叫作OnlineSearch的插件,插件裏自帶了像SearchCode這樣的代碼搜索工具,也可以自己配置像Codelf這樣的代碼搜索工具。

在這裏插入圖片描述

OnlineSearch插件

《代碼精進之路 從碼農到工匠》
在這裏插入圖片描述
張建飛 著

代碼精進教程,程序員代碼整潔之道;

追求卓越和工匠精神,提高程序員的自我修養;

阿里巴巴集團高級技術專家多年經驗積澱之作,衆多業內大咖聯合推薦,寫代碼不僅是技術,更是一門技藝!

  1. 全面講解編程技藝與方法,幫助讀者培養編程習慣;2. 培養技術人員的思想素養,分享多年技術管理心得;3. 深度揭祕阿里巴巴團隊在複雜度治理方面的探索實踐;4. 重點介紹,開源框架COLA架構及其企業級應用——“工匠平臺”

每一個程序員都應該掌握一套命名的方法論:瞭解如何給軟件製品(Artifact,包括Module、Package、Class、Function和Variable)命名。

如何寫註釋,如何讓代碼自明地表達自己,以及如何保持命名風格的一致性,異步君保證,這樣做,不僅能使你走上代碼精進之路,更能助你走上職場進階之路!

如何獲得:關注異步圖書微信公衆號,在同名文章中點擊在看+參與話題留言+轉發本文至朋友圈,2月20日,異步君將抽取2名讀者贈送《代碼精進之路 從碼農到工匠》。

今日互動話題:

“分享你遇到過什麼樣的奇葩命名”

發佈了520 篇原創文章 · 獲贊 292 · 訪問量 88萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章