溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java變量命名怎么取名

發(fā)布時(shí)間:2020-10-28 15:36:18 來源:億速云 閱讀:320 作者:Leah 欄目:開發(fā)技術(shù)

本篇文章給大家分享的是有關(guān)Java變量命名怎么取名,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

一.變量命名風(fēng)格

  變量命名風(fēng)格通常會(huì)根據(jù)不同的變量類型來區(qū)分,以Java語言為例,根據(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ù)命名那篇中我們說的函數(shù)命名最高境界是見字如面,那么對(duì)于變量命名來說,最高境界是什么呢? 我認(rèn)為是:自解釋,即"代碼即注釋"。

  為什么這么說呢,因?yàn)橥ǔ碚f一個(gè)函數(shù)是會(huì)有函數(shù)注釋的,即使函數(shù)名字取的不好,如果注釋寫的比較清楚,對(duì)于后續(xù)維護(hù)人員來說也是了解函數(shù)具體功能的一種方式。

  而變量則不同,在一個(gè)工程里面,變量的數(shù)量遠(yuǎn)遠(yuǎn)大于函數(shù)的數(shù)量,所以不太可能對(duì)于每個(gè)變量都去寫注釋,所以如果一個(gè)工程的變量命名很糟糕,那么對(duì)于后續(xù)維護(hù)人員來說將是毀滅性的打擊,因?yàn)槊孔x到一個(gè)變量,可能就需要去猜測變量的含義,我想沒有哪個(gè)人愿意讀到這樣的代碼,永遠(yuǎn)記住一點(diǎn):"代碼是寫給人看的,不是寫給機(jī)器看的"。

  譬如下面這段代碼的命名就非常糟糕:

ppn = (cpn > 1) ? (cpn - 1) : cpn;
npn = (cpn < tpn) &#63; (cpn + 1) : tpn;
p = new Page(ppn, cpn, npn, tpn);

  上面這段代碼估計(jì)只有原作者清楚地知道各個(gè)變量的含義是啥了,

  如果修改為下面這種寫法,可讀性會(huì)好很多,并且一目了然,很容易知道其大概意圖是計(jì)算分頁信息:

prePageNum = (curPageNum > 1) &#63; (curPageNum - 1) : curPageNum;
nextPageNum = (curPageNum < totalPageNum) &#63; (curPageNum + 1) : totalPageNum;
page = new Page(prePageNum, curPageNum, nextPageNum, totalPageNum);

三.變量命名最佳實(shí)踐

1)采用名詞或者形容詞來命名變量

  變量一般情況下建議使用名詞、名字組合或者形容詞,因?yàn)樽兞恳话阈稳莸氖且环N事物或者事物的屬性,所以用名詞或者名詞組合更容易讓人理解,而形容詞一般用于bool類型的變量。

2)避免使用單字母變量,盡量細(xì)化變量含義

  在程序中,盡量避免使用單字母變量,唯一可以接受使用單字母變量的場景只有for循環(huán),不過還是不太推薦在for循環(huán)中使用單字母變量(用pos、index比for循環(huán)的i、j、k要好很多)。

  舉個(gè)例子,比如下面這行代碼:

double calConeVolume(double b, double d) {
return Math.PI * b * b * d / 3;
}

  咋一看這個(gè)函數(shù)參數(shù)感覺挺清晰,但是一細(xì)看,b是什么?d又是什么?如果我要用這個(gè)函數(shù),該怎么傳參?估計(jì)大部人是一臉懵逼狀,只能進(jìn)去看實(shí)際的函數(shù)實(shí)現(xiàn)才知道b是圓錐體半徑,d是圓錐體高度;

  那么怎么優(yōu)化這段代碼命名呢?其實(shí)很簡單,稍微細(xì)化一下變量含義,讓變量名自己去表達(dá)實(shí)際意圖:

double calConeVolume(double radius, double height) {
return Math.PI * radius * radius * height / 3;
}

3)變量命名前后用詞需統(tǒng)一

  在同一個(gè)工程或者一個(gè)場景下,變量命名風(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<>();

  上面兩種方式均可,沒有比較明顯的偏好,根據(jù)實(shí)際場景決定。第一種方式相對(duì)更簡潔,第二種在局部作用域里面有多種相關(guān)的集合變量時(shí)區(qū)分度更大,比如:

List<Student> studentList = new ArrayList<>();
Map<Long, Student> studentMap = Maps.newHashMap();
&#8203;
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)問題,阿里的java代碼規(guī)范中也明確提到了這一點(diǎn),所以在寫代碼的時(shí)候最好還是遵守公認(rèn)的規(guī)范,不然哪天說不定就踩坑了。

6)盡量避免使用縮寫進(jìn)行命名

  有些時(shí)候,變量名可能有點(diǎn)長,不利于代碼可讀性,因此很多時(shí)候在寫代碼的時(shí)候喜歡用縮寫來命名,但這個(gè)不是一個(gè)好的習(xí)慣,除非使用的縮寫是大家都會(huì)使用的約定俗稱的縮寫。

  比如下面這個(gè)命名:

int averageStudentAge; => int avgStudentAge;

  因?yàn)閍vg大家都知道是average的縮寫,所以這么寫問題不大,不會(huì)引起歧義;

  但是下面這種縮寫命名:

res
tmp
cnt

  就不是好的縮寫命名,因?yàn)椴煌娜碎喿x可能會(huì)有不同的理解:

res => response、resource、result
tmp => temporary、template
cnt => count、content、context

  附上一些約定俗稱的縮寫:

全稱縮寫
identificationid
averageavg
maximummax
minimummin
bufferbuf
errorerr
messagemsg
imageimg
lengthlen
librarylib
passwordpwd
positionpos
data transfer objectdto
view objectvo

7)拋棄掉flag變量

  國內(nèi)一些早期的教材上,到處充斥著各種flag風(fēng)格的變量,這種命名方式對(duì)于大型工程簡直就是噩夢,比如:

int flag = getDoctorFlag(doctorId);
if (flag == 1) {
//....
}

  看到這段代碼,讀者會(huì)有疑問flag變量的含義是什么?flag值為1的時(shí)候又代表什么含義?是醫(yī)生的值班/在崗狀態(tài)、還是醫(yī)生的身體狀態(tài)?估計(jì)讀者的內(nèi)心是崩潰的。

  如果優(yōu)化成下面這種形式:

DutyStatus doctorDutyStatus = getDoctorDutyStatus(doctorId);
if (doctorDutyStatus == DutyStatus.ONLINE) {
// ...
}

以上就是Java變量命名怎么取名,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI