令人頭疼的代碼命名規(guī)范……

代碼黑科技的分享區(qū)
?前言關(guān)于代碼命名,我相信是經(jīng)常困擾很多小伙伴的一個(gè)問(wèn)題,尤其是對(duì)于強(qiáng)迫癥晚期患者。怎么說(shuō)呢,每次小編在寫代碼之前,總會(huì)在想啊想啊,用什么命名法好呢?對(duì)于經(jīng)常在C++、Java、Python等主流語(yǔ)言上切換的強(qiáng)迫癥來(lái)說(shuō),換個(gè)語(yǔ)言換種命名風(fēng)格簡(jiǎn)直不要太混亂。
今天就來(lái)梳理一下常見的代碼命名規(guī)范以及適用范圍吧。
常見命名規(guī)范為什么需要命名規(guī)范呢?世界級(jí)軟件大師 Martin Fowler 大神都說(shuō)過(guò) CS 領(lǐng)域有兩大最難的事情,一是緩存失效,一是程序命名。

《Clean Code》這本書明確指出:
代碼的注釋不是越詳細(xì)越好。實(shí)際上好的代碼本身就是注釋,我們要盡量規(guī)范和美化自己的代碼來(lái)減少不必要的注釋。若編程語(yǔ)言足夠有表達(dá)力,就不需要注釋,盡量通過(guò)代碼來(lái)闡述。
要想讓你的編程語(yǔ)言足夠有表達(dá)力,良好的命名規(guī)范是必不可少的。同時(shí),花幾分鐘學(xué)學(xué)規(guī)范的命名,也能讓你的代碼看起來(lái)賞心悅目,何樂(lè)而不為呢。
1. 駝峰命名法(CamelCase)
駱駝式命名法(Camel-Case)又稱駝峰式命名法,是電腦程式編寫時(shí)的一套命名規(guī)則(慣例)。正如它的名稱CamelCase所表示的那樣,是指混合使用大小寫字母來(lái)構(gòu)成變量和函數(shù)的名字。程序員們?yōu)榱俗约旱拇a能更容易的在同行之間交流,所以多采取統(tǒng)一的可讀性比較好的命名方式。
它又可以分為以下幾種。
小駝峰命名法(lowerCamelCase)
除第一個(gè)單詞之外,其他單詞首字母大寫。方法名、參數(shù)名、成員變量、局部變量需要使用小駝峰命名法(lowerCamelCase)。比如:
getUserInfo()
createCustomThreadPool()
findAllByUserName(String?userName)
TaskRepository?taskRepository;
大駝峰命名法(CamelCase)
相比小駝峰法,大駝峰法(即帕斯卡命名法)把第一個(gè)單詞的首字母也大寫了。常用于類名,命名空間等。如:
class?TaskDateToSend{}
class?TaskLabelToSend{}
SettingRepository
2. 蛇形命名法(snake_case)
蛇形法是全由小寫字母和下劃線組成,在兩個(gè)單詞之間用下滑線連接即可。測(cè)試方法名、常量、枚舉名稱需要使用蛇形命名法(snake_case)。如:
first_name
last_name
MAX_ITERATION
LAST_DATA
3. 串式命名法(kebab-case)
在串式命名法中,各個(gè)單詞之間通過(guò)下劃線“-”連接,比如:
hello-world
first-project
建議項(xiàng)目文件夾名稱使用串式命名法(kebab-case),比如 dubbo 項(xiàng)目的各個(gè)模塊的命名是下面這樣的:

總結(jié)一下
語(yǔ)言場(chǎng)景給出各個(gè)場(chǎng)景下的命名規(guī)則,大家要養(yǎng)成習(xí)慣。事實(shí)上,如果經(jīng)常在各個(gè)語(yǔ)言上切換的話,真的可能搞混。所以今天就Mark一下吧。
Java命名規(guī)范
總體命名規(guī)范
- 類名需要使用大駝峰命名法(UpperCamelCase)風(fēng)格。
- 方法名、參數(shù)名、成員變量、局部變量需要使用小駝峰命名法(lowerCamelCase)。
- 測(cè)試方法名、常量、枚舉名稱需要使用蛇形命名法(snake_case) ,比如test_get_user()、TIME_LIMIT。并且,測(cè)試方法名稱要求全部小寫,常量以及枚舉名稱需要全部大寫。
- 項(xiàng)目文件夾名稱使用串式命名法(kebab-case),比如dubbo-registry。
- 包名統(tǒng)一使用小寫,盡量使用單個(gè)名詞作為包名,各個(gè)單詞通過(guò) "." 分隔符連接,并且各個(gè)單詞必須為單數(shù)。
- 抽象類命名使用 Abstract 開頭。如:public abstract class AbstractClient extends AbstractEndpoint{}。
- 異常類命名使用 Exception 結(jié)尾。如:public class NoSuchMethodException extends RuntimeException{}。
- 測(cè)試類命名以它要測(cè)試的類的名稱開始,以 Test 結(jié)尾。如:public class AnnotationUtilsTest{}。
包名命名規(guī)范
Java的包名由小寫單詞組成,包的路徑符合所開發(fā)的系統(tǒng)模塊的定義,以便通過(guò)包名可得知其屬于哪個(gè)模塊,從而方便到對(duì)應(yīng)包里找相應(yīng)的實(shí)現(xiàn)類。
常規(guī)包名
為了保障每個(gè)Java Package命名的唯一性,在Java編程規(guī)范中要求開發(fā)人員在自己定義的包名前加上唯一的前綴.由于互聯(lián)網(wǎng)上的域名稱是不會(huì)重復(fù)的,所以多數(shù)開發(fā)人員采用自己公司在互聯(lián)網(wǎng)上的域名稱作為自己程序包的唯一前綴.例如 : com.sun.swt...
- 公司項(xiàng)目 com : 公司項(xiàng)目,copyright由項(xiàng)目發(fā)起的公司所有. 包名 : com.公司名.項(xiàng)目名.模塊名..
- 團(tuán)隊(duì)項(xiàng)目 team : 團(tuán)隊(duì)項(xiàng)目,指由團(tuán)隊(duì)發(fā)起,并由該團(tuán)隊(duì)開發(fā)的項(xiàng)目,copyright屬于該團(tuán)隊(duì)所有. 包名 : team.團(tuán)隊(duì)名.項(xiàng)目名.模塊名..
自定義包名
一般公司命名為com.公司名.項(xiàng)目名.模塊名....那我們個(gè)人的項(xiàng)目又怎么命名呢?個(gè)人的英語(yǔ)單詞有individual、personal、private、one-man,進(jìn)一步對(duì)以上四個(gè)單詞詞意進(jìn)行分析并在保證了唯一性,繼而使用每個(gè)單詞的前4個(gè)字母作為前綴,與com也做了區(qū)分.示例如下所示:
- indi : 個(gè)體項(xiàng)目,指?jìng)€(gè)人發(fā)起,但非自己獨(dú)自完成的項(xiàng)目,可公開或私有項(xiàng)目,copyright主要屬于發(fā)起者. 包名 :indi.發(fā)起者名.項(xiàng)目名.模塊名..
- pers : 個(gè)人項(xiàng)目,指?jìng)€(gè)人發(fā)起,獨(dú)自完成,可分享的項(xiàng)目,copyright主要屬于個(gè)人.包名 : pers.個(gè)人名.項(xiàng)目名.模塊名..
- priv : 私有項(xiàng)目,指?jìng)€(gè)人發(fā)起,獨(dú)自完成,非公開的私人使用的項(xiàng)目,copyright屬于個(gè)人.包名 : priv.個(gè)人名.項(xiàng)目名.模塊名..
- onem : 與indi相同,推薦使用indi.
Python命名規(guī)范
類:總是使用首字母大寫單詞串。如MyClass、ClassName。內(nèi)部類可以使用額外的前導(dǎo)下劃線。
函數(shù)和方法:小寫+下劃線,如method_name。
函數(shù)參數(shù):小寫+下劃線,如function_parameter_name。如果一個(gè)函數(shù)的參數(shù)名稱和保留的關(guān)鍵字沖突,通常使用一個(gè)后綴下劃線,如random_。
全局變量:對(duì)于from M import *導(dǎo)入語(yǔ)句,如果想阻止導(dǎo)入模塊內(nèi)的全局變量可以使用舊有的規(guī)范,在全局變量上加一個(gè)前導(dǎo)的下劃線,如_var_name。應(yīng)避免使用全局變量。
變量:小寫,由下劃線連接各個(gè)單詞。如color、this_is_a_variable。注意:
- 不論是類成員變量還是全局變量,均不使用 m 或 g 前綴。
- 私有類成員使用單一下劃線前綴標(biāo)識(shí)。
- 變量名不應(yīng)帶有類型信息,因?yàn)镻ython是動(dòng)態(tài)類型語(yǔ)言。如 iValue、names_list、dict_obj 等都是不好的命名。
常量:常量名所有字母大寫,由下劃線連接各個(gè)單詞如MAX_OVERFLOW,TOTAL。
異常:以“Error”作為后綴。
文件名:全小寫,可使用下劃線
包:應(yīng)該是簡(jiǎn)短的、小寫的名字。如果下劃線可以改善可讀性可以加入,如mypackage。
模塊:與包的規(guī)范同,如mymodule。
縮寫:命名應(yīng)當(dāng)盡量使用全拼寫的單詞,縮寫的情況有如下兩種:
- 常用的縮寫,如XML、ID等,在命名時(shí)也應(yīng)只大寫首字母,如XmlParser。
- 命名中含有長(zhǎng)單詞,對(duì)某個(gè)單詞進(jìn)行縮寫。這時(shí)應(yīng)使用約定成俗的縮寫方式。例如:function 縮寫為 fn text 縮寫為 txt object 縮寫為 obj count 縮寫為 cnt number 縮寫為 num,等。
前導(dǎo)后綴下劃線:
- 一個(gè)前導(dǎo)下劃線:表示非公有。
- 一個(gè)后綴下劃線:避免關(guān)鍵字沖突。
- 兩個(gè)前導(dǎo)下劃線:當(dāng)命名一個(gè)類屬性引起名稱沖突時(shí)使用。
- 兩個(gè)前導(dǎo)和后綴下劃線:“魔”(有特殊用圖)對(duì)象或者屬性,例如__init__或者_(dá)_file__。絕對(duì)不要?jiǎng)?chuàng)造這樣的名字,而只是使用它們。注意:關(guān)于下劃線的使用存在一些爭(zhēng)議。
特定命名方式:主要是指 xxx 形式的系統(tǒng)保留字命名法。項(xiàng)目中也可以使用這種命名,它的意義在于這種形式的變量是只讀的,這種形式的類成員函數(shù)盡量不要重載。如 class Base(object): def init(self, id, parent = None): self.id = id self.parent = parent def message(self, msgid): 其中 id、parent 和 message 都采用了系統(tǒng)保留字命名法。
Python推薦使用蛇形命名法,因?yàn)?Python 是蟒蛇啊,理所當(dāng)然是用蛇形命名……
綜合各方面考慮,駝峰式命名法比較好,優(yōu)勢(shì)明顯,事實(shí)上,目前使用駝峰式命名法的人也真的越來(lái)越多了。
最后,大家是在命名有困難可以上一個(gè)神奇的網(wǎng)站:
https://unbug.github.io/codelf/

reference
- 三種編程命名規(guī)則:駝峰命名法 (壹):https://www.jianshu.com/p/de0016754d8a
- 因?yàn)槊恢鞴躣iss無(wú)數(shù)次。簡(jiǎn)單聊聊編程最頭疼的事情之一:命名:https://www.toutiao.com/i6836703460176429582/
- Java 命名規(guī)范:https://www.cnblogs.com/wkfvawl/p/12172756.html
- Python 為什么推薦蛇形命名法?:https://www.cnblogs.com/pythonista/p/13155167.html
推薦閱讀:
干貨 | 想學(xué)習(xí)優(yōu)化算法,不知從何學(xué)起?
干貨 | 運(yùn)籌學(xué)從何學(xué)起?如何快速入門運(yùn)籌學(xué)算法?
干貨 | 學(xué)習(xí)算法,你需要掌握這些編程基礎(chǔ)(包含JAVA和C++)
干貨 | 算法學(xué)習(xí)必備訣竅:算法可視化解密
干貨 | 模擬退火、禁忌搜索、迭代局部搜索求解TSP問(wèn)題Python代碼分享記得點(diǎn)個(gè)在看支持下哦~

