前言
現在有很多語言,但是在編程時有良好的命名習慣,代碼易讀,而且對代碼調試和維護都有巨大好處。一般程序員不使用諸如ThisVariableIsATemporaryCounter
這樣“聰明”的名字。程序員常用tmp
,這寫起來更簡單,也不會更難懂。
然而,當面對複雜情況時就有些棘手,給全局變量取一個描述性的名字是必要的。把一個全局函數叫做foo
是一種目光短淺的行爲。全局函數也一樣,如果你有一個統計當前用戶個數的函數,應當把它命名爲count_active_user()
或者簡單點些的類似名稱,不應該命名爲cntusr()
。
四種流行的命名法則
目前,業界共有四種命名法則:駝峯命名法、匈牙利命名法、帕斯卡命名法和下劃線命名法,其中前三種是較爲流行的命名法。
1. 駝峯命令法
正如它的名稱所表示的那樣,是指混合使用大小寫字母來構成變量和函數的名字。例如,下面是分別用駱駝式命名法和下劃線法命名的同一個函數:
printEmployeePaychecks();
此函數名使用了駝峯命名法,函數名中的每一個邏輯斷點都有一個大寫字母來標記。駝峯命名法近年來越來越流行了,在許多新的函數庫和Microsoft Windows這樣的環境中,它使用得當相多。另一方面,下劃線法是C出現後開始流行起來的,在許多舊的程序和UNIX這樣的環境中,它的使用非常普遍。
2.匈牙利命名法
廣泛應用於象Microsoft Windows這樣的環境中。Windows 編程中用到的變量(還包括宏)的命名規則爲匈牙利命名法,這種命名技術是由一位能幹的 Microsoft 程序員查爾斯-西蒙尼(Charles Simonyi) 提出的。
匈牙利命名法通過在變量名前面加上相應的小寫字母的符號標識作爲前綴,標識出變量的作用域、類型等。這些符號可以多個同時使用,順序是先m_(成員變量)、再指針、再簡單數據類型、再其它
。這樣做的好處在於能增加程序的可讀性,便於對程序的理解和維護。
例如:m_lpszStr
, 表示指向一個以0字符結尾的字符串的長指針成員變量。
匈牙利命名法關鍵是:標識符的名字以一個或者多個小寫字母開頭作爲前綴;前綴之後的是首字母大寫的一個單詞或多個單詞組合,該單詞要指明變量的用途。
3.帕斯卡(pascal)命名法
與駝峯命名法類似,二者的區別在於:駝峯命名法是首字母小寫,而帕斯卡命名法是首字母大寫,如:
DisplayInfo();
string UserName;
二者都是採用了帕斯卡命名法。在C#中,以帕斯卡命名法和駱駝命名法居多。
4. 下劃線命名法:
另一種流行的命名規則稱爲下劃線命名法。下劃線法是隨着C語言的出現流行起來的,在UNIX/LIUNX這樣的環境,以及GNU代碼中使用非常普遍。現在比較火的python大多也是採用下劃線命名。
print_employee_paychecks();
此函數名使用了下劃線法,函數名中的每一個邏輯斷點都有一個下劃線來標記。
5. 三種命名規則的小結
MyData就是一個帕斯卡命名的示例;myData是一個駝峯命名法,它第一個單詞的第一個字母小寫,後面的單詞首字母大寫,看起來像一個駱駝;iMyData是一個匈牙利命名法,它的小寫的i說明了它的型態,後面的和帕斯卡命名相同,指示了該變量的用途。
命名的基本原則
-
標識符的命名要清晰、明瞭,有明確含義,同時使用完整的單詞或大家基本可以理解的縮寫,避免使人產生誤解——儘量採用採用英文單詞或全部中文全拼表示,若出現英文單詞和中文混合定義時,使用連字符“_”將英文與中文割開。較短的單詞可通過去掉“元音”形成縮寫;較長的單詞可取單詞的頭幾個字母形成縮寫;一些單詞有大家公認的縮寫。例如:
temp->tmp、flag->flg、statistic->stat、increment->inc、message->msg
等縮寫能夠被大家基本認可。 -
命名中若使用特殊約定或縮寫,則要有註釋說明。應該在源文件的開始之處,對文件中所使用的縮寫或約定,特別是特殊的縮寫,進行必要的註釋說明。
-
自己特有的命名風格,要自始至終保持一致,不可來回變化。個人的命名風格,在符合所在項目組或產品組的命名規則的前提下,纔可使用。(即命名規則中沒有規定到的地方纔可有個人命名風格)。
-
對於變量命名,禁止取單個字符(如i 、j 、k… ),建議除了要有具體含義外,還能表明其變量類型、數據類型等,但i 、j 、k 作局部循環變量是允許的。變量,尤其是局部變量,如果用單個字符表示,很容易敲錯(如i寫成j),而編譯時又檢查不出來,有可能爲了這個小小的錯誤而花費大量的查錯時間。
-
除非必要,不要用數字或較奇怪的字符來定義標識符。
-
命名規範必須與所使用的系統風格保持一致,並在同一項目中統一。
-
在同一軟件產品內,應規劃好接口部分標識符(變量、結構、函數及常量)的命名,防止編譯、鏈接時產生衝突。對接口部分的標識符應該有更嚴格限制,防止衝突。如可規定接口部分的變量與常量之前加上“模塊”標識等。
-
用正確的反義詞組命名具有互斥意義的變量或相反動作的函數等。
下面是一些在軟件中常用的反義詞組。
add / remove begin / end create / destroy
insert / delete first / last get / release
increment / decrement put / get up / down
add / delete lock / unlock open / close
min / max old / new start / stop
next / previous source / target show / hide
send / receive source / destination cut / paste
示例:
int min_sum;
int max_sum;
int add_user( BYTE *user_name );
int delete_user( BYTE *user_name );
Python常用命名規則
1. python命名限制
Python 語言的標識符必須以字母、下畫線_
開頭,後面可以跟任意數目的字母、數字和下畫線_
。此處的字母並不侷限於 26 個英文字母,可以包含中文字符、日文字符等。
由於 Python 3 支持 UTF-8 字符集,因此 Python 3 的標識符可以使用 UTF-8 所能表示的多種語言的字符。Python 語言是區分大小寫的,因此 abc 和 Abc 是兩個不同的標識符。
Python 2.x 對中文支持較差,如果要在 Python 2.x 程序中使用中文字符或中文變量,則需要在 Python 源程序的第一行增加“#coding:utf-8”,當然別忘了將源文件保存爲 UTF-8 字符集。
在使用標識符時,需要注意如下規則:
標識符可以由字母、數字、下畫線(_)組成,其中數字不能打頭。
標識符不能是 Python 關鍵字,但可以包含關鍵字。
標識符不能包含空格。
例如下面變量,有些是合法的,有些是不合法的:
abc_xyz:合法。
HelloWorld:合法。
abc:合法。
xyz#abc:不合法,標識符中不允許出現“#”號。
abc1:合法。
1abc:不合法,標識符不允許數字開頭。
2. 命名規範
-
模塊、包、方法、函數、實例、參數和變量都用小寫
下劃線命名
。
如:module_name, 模塊
package_name, 包
method_name, 方法
function_name, 函數
instance_var_name, 實例
function_parameter_name, 參數
local_var_name. 本變量 -
類、異常、常量都用大寫帕斯卡命名規則。
ClassName, 類
ExceptionName, 異常
GLOBAL_VAR_NAME, 常量 -
縮寫
命名應當儘量使用全拼寫的單詞,縮寫的情況有如下兩種:
1.常用的縮寫,如XML、ID等,在命名時也應只大寫首字母,如XmlParser。
2.命名中含有長單詞,對某個單詞進行縮寫。這時應使用約定成俗的縮寫方式。例如:
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__ 都採用了系統保留字命名法。
3. Python 的關鍵字和內置函數
Python 非常方便,開發者可以通過 Python 程序來查看它所包含的關鍵字。例如,對於如下程序:
#導入keyword 模塊
import keyword
#顯示所有關鍵字
keyword.kwlist
[‘False’,‘None’,‘True’,‘and’,‘as’,‘assert’,‘break’,‘class’,‘continue’,‘def’,‘del’,‘elif’,‘else’,‘except’,‘finally’,‘for’,‘from’,‘global’,‘if’,‘import’,‘in’,‘is’,‘lambda’,‘nonlocal’,‘not’,‘or’,‘pass’,‘raise’,‘return’,‘try’,‘while’,‘With’,‘yield’]
上面這些是python內置的關鍵字,不能用來命名。
!!!注意!!!
python的內置函數是可以用來命名的,但是採用函數名命名後,該函數不能使用,因爲被覆蓋了。
比如:
a=[1,2,3]
len=10
print (len(a))
上面例子中的python內置的len
函數被覆蓋了,所以會報錯。
Python內置函數
1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|
abs() | all() | any() | basestring() | bin() |
bool() | bytearray() | callable() | chr() | classmethod() |
cmp() | compile() | complex() | delattr() | dict() |
dir() | divmod() | enumerate() | eval() | execfile() |
file() | filter() | float() | format() | frozenset() |
getattr() | globals() | hasattr() | hash() | help() |
hex() | id() | input() | int() | isinstance() |
issubclass() | iter() | len() | list() | locals() |
long() | map() | max() | memoryview() | min() |
next() | object() | oct() | open() | ord() |
pow() | print() | property() | range() | raw_input() |
reduce() | reload() | repr() | reversed() | zip() |
round() | set() | setattr() | slice() | sorted() |
staticmethod() | str() | sum() | super() | tuple() |
type() | unichr() | unicode() | vars() | xrange() |
Zip() | import() | apply() | buffer() | coerce() |
intern |