Java如何給變量取合適的命名
一.變量命名風(fēng)格
變量命名風(fēng)格通常會(huì)根據(jù)不同的變量類型來(lái)區(qū)分,以Java語(yǔ)言為例,根據(jù)變量類型不同有兩種命名風(fēng)格:
1)類成員變量、局部變量
類成員變量、局部變量通常采用駝峰命名風(fēng)格,如下:
String userName;
2)靜態(tài)成員變量、枚舉值、常量
靜態(tài)成員變量、枚舉值、常量通常采用所有字母大寫、多個(gè)單詞以英文下劃線連接,如:
public static final int MAX_YEARS = 25;// 建議枚舉類都以Enum結(jié)尾enum ColorEnum { RED(0, '紅色'), YELLOW(1, '黃色'), GREEN(2, '綠色'), WHITE(3, '白色'), BLACK(4, '黑色'); private int code; private String name; Color(int code, String name) { this.code = code; this.name = name; }}
二.變量命名最高境界
在函數(shù)命名那篇中我們說(shuō)的函數(shù)命名最高境界是見(jiàn)字如面,那么對(duì)于變量命名來(lái)說(shuō),最高境界是什么呢? 我認(rèn)為是:自解釋,即'代碼即注釋'。
為什么這么說(shuō)呢,因?yàn)橥ǔ?lái)說(shuō)一個(gè)函數(shù)是會(huì)有函數(shù)注釋的,即使函數(shù)名字取的不好,如果注釋寫的比較清楚,對(duì)于后續(xù)維護(hù)人員來(lái)說(shuō)也是了解函數(shù)具體功能的一種方式。
而變量則不同,在一個(gè)工程里面,變量的數(shù)量遠(yuǎn)遠(yuǎn)大于函數(shù)的數(shù)量,所以不太可能對(duì)于每個(gè)變量都去寫注釋,所以如果一個(gè)工程的變量命名很糟糕,那么對(duì)于后續(xù)維護(hù)人員來(lái)說(shuō)將是毀滅性的打擊,因?yàn)槊孔x到一個(gè)變量,可能就需要去猜測(cè)變量的含義,我想沒(méi)有哪個(gè)人愿意讀到這樣的代碼,永遠(yuǎn)記住一點(diǎn):'代碼是寫給人看的,不是寫給機(jī)器看的'。
譬如下面這段代碼的命名就非常糟糕:
ppn = (cpn > 1) ? (cpn - 1) : cpn;npn = (cpn < tpn) ? (cpn + 1) : tpn;p = new Page(ppn, cpn, npn, tpn);
上面這段代碼估計(jì)只有原作者清楚地知道各個(gè)變量的含義是啥了,
如果修改為下面這種寫法,可讀性會(huì)好很多,并且一目了然,很容易知道其大概意圖是計(jì)算分頁(yè)信息:
prePageNum = (curPageNum > 1) ? (curPageNum - 1) : curPageNum;nextPageNum = (curPageNum < totalPageNum) ? (curPageNum + 1) : totalPageNum;page = new Page(prePageNum, curPageNum, nextPageNum, totalPageNum);
三.變量命名最佳實(shí)踐
1)采用名詞或者形容詞來(lái)命名變量
變量一般情況下建議使用名詞、名字組合或者形容詞,因?yàn)樽兞恳话阈稳莸氖且环N事物或者事物的屬性,所以用名詞或者名詞組合更容易讓人理解,而形容詞一般用于bool類型的變量。
2)避免使用單字母變量,盡量細(xì)化變量含義
在程序中,盡量避免使用單字母變量,唯一可以接受使用單字母變量的場(chǎng)景只有for循環(huán),不過(guò)還是不太推薦在for循環(huán)中使用單字母變量(用pos、index比f(wàn)or循環(huán)的i、j、k要好很多)。
舉個(gè)例子,比如下面這行代碼:
double calConeVolume(double b, double d) {return Math.PI * b * b * d / 3;}
咋一看這個(gè)函數(shù)參數(shù)感覺(jué)挺清晰,但是一細(xì)看,b是什么?d又是什么?如果我要用這個(gè)函數(shù),該怎么傳參?估計(jì)大部人是一臉懵逼狀,只能進(jìn)去看實(shí)際的函數(shù)實(shí)現(xiàn)才知道b是圓錐體半徑,d是圓錐體高度;
那么怎么優(yōu)化這段代碼命名呢?其實(shí)很簡(jiǎn)單,稍微細(xì)化一下變量含義,讓變量名自己去表達(dá)實(shí)際意圖:
double calConeVolume(double radius, double height) {return Math.PI * radius * radius * height / 3;}
3)變量命名前后用詞需統(tǒng)一
在同一個(gè)工程或者一個(gè)場(chǎng)景下,變量命名風(fēng)格需前后統(tǒng)一,比如total和sum都能表示總計(jì)的意思,那么所有需要用到'總計(jì)'含義的地方要么全部使用total、要么全部使用sum。
保持前后命名風(fēng)格統(tǒng)一是保證工程代碼良好可讀性的關(guān)鍵保證。
4)集合變量用類型或者復(fù)數(shù)s作為后綴
在java中,有很多集合,比如List、Map、Set等,那么集合變量該怎么命名呢?
一般可采取兩種方式:
使用復(fù)數(shù)s結(jié)尾
List<Student> students = new ArrayList<>();
用集合類型作為后綴
List<Student> studentList = new ArrayList<>();
上面兩種方式均可,沒(méi)有比較明顯的偏好,根據(jù)實(shí)際場(chǎng)景決定。第一種方式相對(duì)更簡(jiǎn)潔,第二種在局部作用域里面有多種相關(guān)的集合變量時(shí)區(qū)分度更大,比如:
List<Student> studentList = new ArrayList<>();Map<Long, Student> studentMap = Maps.newHashMap();for (Student stu : studentList) { studentMap.put(stu.getId, stu);}
我的建議是如果局部作用域只有一種類型的集合,那么推薦使用復(fù)數(shù)形式;如果局部作用域有多個(gè)相關(guān)的集合類型,那么推薦用類型結(jié)尾。
5)禁止使用is作為bool類型的類成員變量前置
在java中,禁止用is作為bool類型的類成員變量的前綴,因?yàn)閕s作為前綴會(huì)導(dǎo)致序列化/反序列出現(xiàn)問(wèn)題,阿里的java代碼規(guī)范中也明確提到了這一點(diǎn),所以在寫代碼的時(shí)候最好還是遵守公認(rèn)的規(guī)范,不然哪天說(shuō)不定就踩坑了。
6)盡量避免使用縮寫進(jìn)行命名
有些時(shí)候,變量名可能有點(diǎn)長(zhǎng),不利于代碼可讀性,因此很多時(shí)候在寫代碼的時(shí)候喜歡用縮寫來(lái)命名,但這個(gè)不是一個(gè)好的習(xí)慣,除非使用的縮寫是大家都會(huì)使用的約定俗稱的縮寫。
比如下面這個(gè)命名:
int averageStudentAge; => int avgStudentAge;
因?yàn)閍vg大家都知道是average的縮寫,所以這么寫問(wèn)題不大,不會(huì)引起歧義;
但是下面這種縮寫命名:
restmpcnt
就不是好的縮寫命名,因?yàn)椴煌娜碎喿x可能會(huì)有不同的理解:
res => response、resource、resulttmp => temporary、templatecnt => count、content、context
附上一些約定俗稱的縮寫:
全稱 縮寫 identification id average avg maximum max minimum min buffer buf error err message msg image img length len library lib password pwd position pos data transfer object dto view object vo
7)拋棄掉flag變量
國(guó)內(nèi)一些早期的教材上,到處充斥著各種flag風(fēng)格的變量,這種命名方式對(duì)于大型工程簡(jiǎn)直就是噩夢(mèng),比如:
int flag = getDoctorFlag(doctorId);if (flag == 1) {//....}
看到這段代碼,讀者會(huì)有疑問(wèn)flag變量的含義是什么?flag值為1的時(shí)候又代表什么含義?是醫(yī)生的值班/在崗狀態(tài)、還是醫(yī)生的身體狀態(tài)?估計(jì)讀者的內(nèi)心是崩潰的。
如果優(yōu)化成下面這種形式:
DutyStatus doctorDutyStatus = getDoctorDutyStatus(doctorId);if (doctorDutyStatus == DutyStatus.ONLINE) {// ...}
就比上面的形式清晰多了,很容易看出來(lái)判斷的是醫(yī)生的值班/在崗狀態(tài)。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. React+umi+typeScript創(chuàng)建項(xiàng)目的過(guò)程2. XML入門的常見(jiàn)問(wèn)題(二)3. 無(wú)線標(biāo)記語(yǔ)言(WML)基礎(chǔ)之WMLScript 基礎(chǔ)第1/2頁(yè)4. ASP.NET Core 5.0中的Host.CreateDefaultBuilder執(zhí)行過(guò)程解析5. SharePoint Server 2019新特性介紹6. html清除浮動(dòng)的6種方法示例7. ASP調(diào)用WebService轉(zhuǎn)化成JSON數(shù)據(jù),附j(luò)son.min.asp8. ASP中常用的22個(gè)FSO文件操作函數(shù)整理9. .Net core 的熱插拔機(jī)制的深入探索及卸載問(wèn)題求救指南10. 讀大數(shù)據(jù)量的XML文件的讀取問(wèn)題
