如何給C#變量取名字
一.變量命名風(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è)單詞以英文下劃線連接,如:
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)?quot;代碼即注釋"。
為什么這么說(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 students = new ArrayList<>();
用集合類(lèi)型作為后綴
List 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ì)使用的約定俗稱的縮寫(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
附上一些約定俗稱的縮寫(xiě):
全稱 | 縮寫(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)。
到此這篇關(guān)于如何給C#變量取名字的文章就介紹到這了,更多相關(guān)C#變量取名字內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#開(kāi)發(fā)微信門(mén)戶及應(yīng)用(1) 微信接口使用
這篇文章主要為大家詳細(xì)介紹了C#開(kāi)發(fā)微信門(mén)戶及應(yīng)用第一篇,微信接口的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06將DataTable轉(zhuǎn)換成List<T>實(shí)現(xiàn)思路及示例代碼
首先,這是我寫(xiě)的一個(gè)通用轉(zhuǎn)換類(lèi),完成此類(lèi)操作。也是實(shí)現(xiàn)這個(gè)功能最核心的部分。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-11-11詳解C#如何為某個(gè)方法設(shè)定執(zhí)行超時(shí)時(shí)間
這篇文章主要為大家詳細(xì)介紹一下C#如何為某個(gè)方法設(shè)定執(zhí)行超時(shí)時(shí)間,文中的示例代碼簡(jiǎn)潔易懂,具有一定的借鑒價(jià)值,有需要的小伙伴可以學(xué)習(xí)一下2023-10-10C#實(shí)現(xiàn)字符串進(jìn)制轉(zhuǎn)換方法匯總
這篇文章主要介紹了C#實(shí)現(xiàn)字符串進(jìn)制轉(zhuǎn)換方法匯總,給大家羅列了十幾種機(jī)制轉(zhuǎn)換問(wèn)題,感興趣的朋友跟隨小編一起看看吧2022-11-11C#實(shí)現(xiàn)將程序運(yùn)行信息寫(xiě)入日志的方法
這篇文章主要介紹了C#實(shí)現(xiàn)將程序運(yùn)行信息寫(xiě)入日志的方法,可實(shí)現(xiàn)將程序運(yùn)行信息寫(xiě)入日志并存儲(chǔ)在Debug目錄下的"/Log/PRG"下的功能,涉及C#針對(duì)日志的相關(guān)寫(xiě)入技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08C#使用表達(dá)式樹(shù)實(shí)現(xiàn)對(duì)象復(fù)制的示例代碼
這篇文章主要介紹了C#使用表達(dá)式樹(shù)實(shí)現(xiàn)對(duì)象復(fù)制,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-01-01C#/VB.NET 自定義PPT動(dòng)畫(huà)路徑的步驟
這篇文章主要介紹了C#/VB.NET 自定義PPT動(dòng)畫(huà)路徑的步驟,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下2021-05-05C#?Sqlite數(shù)據(jù)庫(kù)的搭建及使用技巧
這篇文章主要介紹了C#?Sqlite數(shù)據(jù)庫(kù)的搭建及使用技巧,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-08-08