欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java如何給變量取合適的命名

 更新時(shí)間:2020年10月27日 10:08:58   作者:Matrix海子  
這篇文章主要介紹了Java如何給變量取合適的命名,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

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

  變量命名風(fēng)格通常會(huì)根據(jù)不同的變量類(lèi)型來(lái)區(qū)分,以Java語(yǔ)言為例,根據(jù)變量類(lèi)型不同有兩種命名風(fēng)格:

1)類(lèi)成員變量、局部變量

  類(lèi)成員變量、局部變量通常采用駝峰命名風(fēng)格,如下:

String userName;

2)靜態(tài)成員變量、枚舉值、常量

  靜態(tài)成員變量、枚舉值、常量通常采用所有字母大寫(xiě)、多個(gè)單詞以英文下劃線(xiàn)連接,如:

public static final int MAX_YEARS = 25;
​
// 建議枚舉類(lèi)都以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)為是:自解釋?zhuān)?代碼即注釋"。

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

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

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

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

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

  如果修改為下面這種寫(xiě)法,可讀性會(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類(lèi)型的變量。

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)集合變量用類(lèi)型或者復(fù)數(shù)s作為后綴

  在java中,有很多集合,比如List、Map、Set等,那么集合變量該怎么命名呢?

  一般可采取兩種方式:

使用復(fù)數(shù)s結(jié)尾

List<Student> students = new ArrayList<>();

用集合類(lèi)型作為后綴

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);
}

  我的建議是如果局部作用域只有一種類(lèi)型的集合,那么推薦使用復(fù)數(shù)形式;如果局部作用域有多個(gè)相關(guān)的集合類(lèi)型,那么推薦用類(lèi)型結(jié)尾。

5)禁止使用is作為bool類(lèi)型的類(lèi)成員變量前置

  在java中,禁止用is作為bool類(lèi)型的類(lèi)成員變量的前綴,因?yàn)閕s作為前綴會(huì)導(dǎo)致序列化/反序列出現(xiàn)問(wèn)題,阿里的java代碼規(guī)范中也明確提到了這一點(diǎn),所以在寫(xiě)代碼的時(shí)候最好還是遵守公認(rèn)的規(guī)范,不然哪天說(shuō)不定就踩坑了。

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

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

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

int averageStudentAge; => int avgStudentAge;

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

  但是下面這種縮寫(xiě)命名:

res
tmp
cnt

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

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

  附上一些約定俗稱(chēng)的縮寫(xiě):

全稱(chēng) 縮寫(xiě)
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í)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Mybatis查詢(xún)數(shù)據(jù)的項(xiàng)目實(shí)現(xiàn)

    Mybatis查詢(xún)數(shù)據(jù)的項(xiàng)目實(shí)現(xiàn)

    MyBatis通過(guò)XML配置文件或注解,把Java對(duì)象映射到對(duì)應(yīng)的數(shù)據(jù)庫(kù)表中,實(shí)現(xiàn)對(duì)象關(guān)系和數(shù)據(jù)關(guān)系的互相轉(zhuǎn)換,從而使得Java應(yīng)用程序能夠更簡(jiǎn)單的操作和讀取數(shù)據(jù)庫(kù),本文就詳細(xì)的介紹一下如何實(shí)現(xiàn),感興趣的可以了解一下
    2023-09-09
  • Java學(xué)習(xí)-打印1-1000以?xún)?nèi)的水仙花數(shù)代碼實(shí)例

    Java學(xué)習(xí)-打印1-1000以?xún)?nèi)的水仙花數(shù)代碼實(shí)例

    這篇文章主要介紹了Java打印1-1000以?xún)?nèi)的水仙花數(shù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • springcloud-feign調(diào)用報(bào)錯(cuò)問(wèn)題

    springcloud-feign調(diào)用報(bào)錯(cuò)問(wèn)題

    這篇文章主要介紹了springcloud-feign調(diào)用報(bào)錯(cuò)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Spring如何使用@Indexed加快啟動(dòng)速度

    Spring如何使用@Indexed加快啟動(dòng)速度

    這篇文章主要介紹了Spring如何使用@Indexed加快啟動(dòng)速度,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • java組件commons-fileupload實(shí)現(xiàn)文件上傳

    java組件commons-fileupload實(shí)現(xiàn)文件上傳

    這篇文章主要介紹了java借助commons-fileupload組件實(shí)現(xiàn)文件上傳,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • 使用jdk7的nio2操作文件拷貝和剪切示例

    使用jdk7的nio2操作文件拷貝和剪切示例

    使用jdk7的NIO2進(jìn)行文件或文件夾的拷貝移動(dòng)操作??梢宰詣?dòng)創(chuàng)建路徑,差異化更新文件,簡(jiǎn)單的出錯(cuò)重連機(jī)制
    2014-01-01
  • Java創(chuàng)建非阻塞的HTTP服務(wù)器的實(shí)現(xiàn)

    Java創(chuàng)建非阻塞的HTTP服務(wù)器的實(shí)現(xiàn)

    本文主要介紹了Java創(chuàng)建非阻塞的HTTP服務(wù)器的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-04-04
  • spring事務(wù)的propagation傳播屬性示例詳解

    spring事務(wù)的propagation傳播屬性示例詳解

    這篇文章主要為大家介紹了spring事務(wù)的propagation傳播屬性示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • Java變量的初始化及靜態(tài)方法的實(shí)現(xiàn)

    Java變量的初始化及靜態(tài)方法的實(shí)現(xiàn)

    這篇文章主要介紹了Java變量的初始化及靜態(tài)方法的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • 淺談java監(jiān)聽(tīng)器的作用

    淺談java監(jiān)聽(tīng)器的作用

    這篇文章主要介紹了淺談java監(jiān)聽(tīng)器的作用,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09

最新評(píng)論