前言
關於代碼命名,我相信是經常困擾很多小伙伴的一個問題,尤其是對於強迫症晚期患者。怎么說呢,每次小編在寫代碼之前,總會在想啊想啊,用什么命名法好呢?對於經常在C++、Java、Python等主流語言上切換的強迫症來說,換個語言換種命名風格簡直不要太混亂。
今天就來梳理一下常見的代碼命名規范以及適用范圍吧。
常見命名規范
為什么需要命名規范呢?世界級軟件大師 Martin Fowler 大神都說過 CS 領域有兩大最難的事情,一是緩存失效,一是程序命名。
《Clean Code》這本書明確指出:
代碼的注釋不是越詳細越好。實際上好的代碼本身就是注釋,我們要盡量規范和美化自己的代碼來減少不必要的注釋。若編程語言足夠有表達力,就不需要注釋,盡量通過代碼來闡述。
要想讓你的編程語言足夠有表達力,良好的命名規范是必不可少的。同時,花幾分鍾學學規范的命名,也能讓你的代碼看起來賞心悅目,何樂而不為呢。
1. 駝峰命名法(CamelCase)
駱駝式命名法(Camel-Case)又稱駝峰式命名法,是電腦程式編寫時的一套命名規則(慣例)。正如它的名稱CamelCase所表示的那樣,是指混合使用大小寫字母來構成變量和函數的名字。程序員們為了自己的代碼能更容易的在同行之間交流,所以多采取統一的可讀性比較好的命名方式。
它又可以分為以下幾種。
(1) 小駝峰命名法(lowerCamelCase)
除第一個單詞之外,其他單詞首字母大寫。方法名、參數名、成員變量、局部變量需要使用小駝峰命名法(lowerCamelCase)。比如:
getUserInfo()
createCustomThreadPool()
findAllByUserName(String userName)
TaskRepository taskRepository;
(2) 大駝峰命名法(CamelCase)
相比小駝峰法,大駝峰法(即帕斯卡命名法)把第一個單詞的首字母也大寫了。常用於類名,命名空間等。如:
class TaskDateToSend{}
class TaskLabelToSend{}
SettingRepository
2. 蛇形命名法(snake_case)
蛇形法是全由小寫字母和下划線組成,在兩個單詞之間用下滑線連接即可。測試方法名、常量、枚舉名稱需要使用蛇形命名法(snake_case)。如:
first_name
last_name
MAX_ITERATION
LAST_DATA
3. 串式命名法(kebab-case)
在串式命名法中,各個單詞之間通過下划線“-”連接,比如:
hello-world
first-project
建議項目文件夾名稱使用串式命名法(kebab-case),比如 dubbo 項目的各個模塊的命名是下面這樣的:
總結一下
語言場景
給出各個場景下的命名規則,大家要養成習慣。事實上,如果經常在各個語言上切換的話,真的可能搞混。所以今天就Mark一下吧。
Java命名規范
總體命名規范
- 類名需要使用大駝峰命名法(UpperCamelCase)風格。
- 方法名、參數名、成員變量、局部變量需要使用小駝峰命名法(lowerCamelCase)。
- 測試方法名、常量、枚舉名稱需要使用蛇形命名法(snake_case) ,比如test_get_user()、TIME_LIMIT。並且,測試方法名稱要求全部小寫,常量以及枚舉名稱需要全部大寫。
- 項目文件夾名稱使用串式命名法(kebab-case),比如dubbo-registry。
- 包名統一使用小寫,盡量使用單個名詞作為包名,各個單詞通過 "." 分隔符連接,並且各個單詞必須為單數。
- 抽象類命名使用 Abstract 開頭。如:public abstract class AbstractClient extends AbstractEndpoint{}。
- 異常類命名使用 Exception 結尾。如:public class NoSuchMethodException extends RuntimeException{}。
- 測試類命名以它要測試的類的名稱開始,以 Test 結尾。如:public class AnnotationUtilsTest{}。
包名命名規范
Java的包名由小寫單詞組成,包的路徑符合所開發的系統模塊的定義,以便通過包名可得知其屬於哪個模塊,從而方便到對應包里找相應的實現類。
1. 常規包名
為了保障每個Java Package命名的唯一性,在Java編程規范中要求開發人員在自己定義的包名前加上唯一的前綴.由於互聯網上的域名稱是不會重復的,所以多數開發人員采用自己公司在互聯網上的域名稱作為自己程序包的唯一前綴.例如 : com.sun.swt...
- 公司項目
com : 公司項目,copyright由項目發起的公司所有.
包名 : com.公司名.項目名.模塊名.. - 團隊項目
team : 團隊項目,指由團隊發起,並由該團隊開發的項目,copyright屬於該團隊所有.
包名 : team.團隊名.項目名.模塊名..
2. 自定義包名
一般公司命名為com.公司名.項目名.模塊名....那我們個人的項目又怎么命名呢?個人的英語單詞有individual、personal、private、one-man,進一步對以上四個單詞詞意進行分析並在保證了唯一性,繼而使用每個單詞的前4個字母作為前綴,與com也做了區分.示例如下所示:
- indi : 個體項目,指個人發起,但非自己獨自完成的項目,可公開或私有項目,copyright主要屬於發起者. 包名 :indi.發起者名.項目名.模塊名..
- pers : 個人項目,指個人發起,獨自完成,可分享的項目,copyright主要屬於個人.包名 : pers.個人名.項目名.模塊名..
- priv : 私有項目,指個人發起,獨自完成,非公開的私人使用的項目,copyright屬於個人.包名 : priv.個人名.項目名.模塊名..
- onem : 與indi相同,推薦使用indi.
Python命名規范
類:總是使用首字母大寫單詞串。如MyClass、ClassName。內部類可以使用額外的前導下划線。
函數和方法:小寫+下划線,如method_name。
函數參數:小寫+下划線,如function_parameter_name。如果一個函數的參數名稱和保留的關鍵字沖突,通常使用一個后綴下划線,如random_。
全局變量:對於from M import *導入語句,如果想阻止導入模塊內的全局變量可以使用舊有的規范,在全局變量上加一個前導的下划線,如_var_name。應避免使用全局變量。
變量:小寫,由下划線連接各個單詞。如color、this_is_a_variable。
注意:
- 不論是類成員變量還是全局變量,均不使用 m 或 g 前綴。
- 私有類成員使用單一下划線前綴標識。
- 變量名不應帶有類型信息,因為Python是動態類型語言。如 iValue、names_list、dict_obj 等都是不好的命名。
常量:常量名所有字母大寫,由下划線連接各個單詞如MAX_OVERFLOW,TOTAL。
異常:以“Error”作為后綴。
文件名:全小寫,可使用下划線
包:應該是簡短的、小寫的名字。如果下划線可以改善可讀性可以加入,如mypackage。
模塊:與包的規范同,如mymodule。
縮寫:命名應當盡量使用全拼寫的單詞,縮寫的情況有如下兩種:
- 常用的縮寫,如XML、ID等,在命名時也應只大寫首字母,如XmlParser。
- 命名中含有長單詞,對某個單詞進行縮寫。這時應使用約定成俗的縮寫方式。
例如:
function 縮寫為 fn
text 縮寫為 txt
object 縮寫為 obj
count 縮寫為 cnt
number 縮寫為 num,等。
前導后綴下划線:
一個前導下划線:表示非公有。
一個后綴下划線:避免關鍵字沖突。
兩個前導下划線:當命名一個類屬性引起名稱沖突時使用。
兩個前導和后綴下划線:“魔”(有特殊用圖)對象或者屬性,例如__init__或者__file__。絕對不要創造這樣的名字,而只是使用它們。
注意:關於下划線的使用存在一些爭議。
特定命名方式:主要是指 xxx 形式的系統保留字命名法。項目中也可以使用這種命名,它的意義在於這種形式的變量是只讀的,這種形式的類成員函數盡量不要重載。如
class Base(object):
def init(self, id, parent = None):
self.id = id
self.parent = parent
def message(self, msgid):
其中 id、parent 和 message 都采用了系統保留字命名法。
Python推薦使用蛇形命名法,因為 Python 是蟒蛇啊,理所當然是用蛇形命名……
綜合各方面考慮,駝峰式命名法比較好,優勢明顯,事實上,目前使用駝峰式命名法的人也真的越來越多了。