1:選個好名字吧
我們對變量進行命名,最主要的原因不是爲了讓機器能夠更好的執行,機器說:我無所謂,只要正確就行。 我們是讓人更好的去讀程序。所以,如果一段代碼裏面都是xx, y, i,r之類的變量,那麼過幾天你自己都看不懂了,更不要說別人。
所以看下面兩段代碼:
本質上機器都可以執行,但是要讓人看懂,顯然後者成本更低:
x = x -xx
xxx = fido + salesTax( fido );
x = x + LateFee(x1, x) + xxx;
x = x + Interert(X1, x);
balance = balance - lastPayment;
monthlyTotal = newPurchases + SalesTax( newPurchases );
balance = balance + LateFee( customerID, balance ) + monthlyTotal;
balance = balance + Interest( CustomerID, balance);
//balance在英語中是餘額的意思 Interest是利息的意思
以問題爲導向
以問題爲導向,要解決這是什麼問題,而不是如何解決。如果一個變量偏向計算,而不是偏向問題,那麼它不是以描述問題爲導向,而是以解決問題爲導向,這是不好的。
一個員工的數據記錄:inputRec 和employeeData
一個打印機的狀態: bitFlag 和printerReady
會計應用中:calcVal 和sum
上面刪除的這三個都是以計算爲導向的,而不是以描述爲導向的。
命名長度
長度不能太短,否則描繪不出變量的意義,不能太長,否則讀的時候太費勁,降低效率。
計算限定詞
諸如:Total,Sum,Average,Max, Min,Record,String, Pointer都是限定詞。 好的策略是把它們都放在後面,這樣整齊劃一,而且最主要的是前面的名字是我們最重要的信息。
對稱的詞語
一組對稱的詞送給大家,可以讓程序清爽
begin/end
first/last
locked/unlocked
min/max
next/previous
old/new
opened/closed
visible/invisible
source/target
source/destination (less common)
up/down
2:特殊名字
命名循環變量:
循環很常見,所以對循環的命名很重要。在譚浩強老師經典書籍《c程序設計》當中,循環基本使用的諸如i,j,k之類的變量。這在小規模的情況下還可以,但是一定要注意,但是下面幾種情況就不應該使用了:
如果循環變量在循環外邊使用,比如計數 recordCount
嵌套循環, score[teamIndex][eventInde]要比score[i][j]更容易懂
所以,對於循環,只有一兩行的時候可以使用i,j之類的變量,其他情況使用能夠代表其名字的變量,以Index結尾的變量好一些。
命名標誌性變量
最容易想到的變量名稱是flag,我也多次使用,好一點的是加一些說明,如statusFlag,printFlag...但是,這些都不建議使用,因爲它沒有告訴我們變量更多的信息。並且在賦值的時候我們不知道這些變量是在做什麼,賦的什麼值。
if( statusFlag & 0x0F)... statusFlag = 0x80
if( printFlag & 16 )... printFlag = 16
if(computeFlag == 0)... computeFlag=0
解決第一個問題,就是把變量命名修改掉,解決第二個問題,可以使用枚舉類型,這樣程序更加耐讀
if ( dataReady ) ... dataReady = True;
if ( characterType & PRINTABLE_CHAR ) ... characterType = CONTROL_CHARACTER;
if ( reportType == ReportType_Annual ) ... reportType = ReportType_Annual;
if ( recalcNeeded == True ) recalcNeeded = False;
如下是枚舉類型
// values for CharacterType
const int LETTER = 0x01;
const int DIGIT = 0x02;
const int PUNCTUATION = 0x04;
const int LINE_DRAW = 0x08;
const int PRINTABLE_CHAR = ( LETTER | DIGIT | PUNCTUATION | LINE_DRAW );
const int CONTROL_CHARACTER = 0x80;
// values for ReportType
enum ReportType {
ReportType_Daily,
ReportType_Monthly,
ReportType_Quarterly,
ReportType_Annual,
ReportType_All
};
命名臨時變量
我們對於臨時變量的態度其實是比較鬆懈的,臨時的嘛,隨便起一個名字,比如下面計算一元二次方程:
// Compute roots of a quadratic equation.
// This assumes that (b^2-4*a*c) is positive.
temp = sqrt( b^2 - 4*a*c );
root[0] = ( -b + temp ) / ( 2 * a );
root[1] = ( -b - temp ) / ( 2 * a );
其實它是有意義的,這個計算方式叫做判別式,所以下面的命名比較好。
discriminant = sqrt( b^2 - 4*a*c );
root[0] = ( -b + discriminant ) / ( 2 * a );
root[1] = ( -b - discriminant ) / ( 2 * a );
所以,對待臨時變量,我們不能夠隨便命名。
命名布爾類型變量
布爾類型變量的命名應該體現它的類型含義,讓我們看到這個名字就知道這是一個布爾類型變量,即變量的取值要麼爲True要麼爲False。所以,諸如done, error,found, sucess很合適。其它不能反映其有二值的變量名是不適合採用的。
考慮將名稱轉化爲布爾類型,前面加is,後面加ok。
另外最好不要使用否定的變量名,if not notFound 會使得我們很難理解。
非正式命名規則
使用命名規則一個是給自己看的,另外一個是給別人看的給自己看的情況是:在一段時間以後需要再進行修改,然後你會發現,自己都看不懂自己寫的什麼了,各種變量i,j等等,非常糟糕。同樣項目較大的時候,糟糕的命名讓項目理解很困難。當給別人看的時候:要交給別人維護,要和別人一起合作,當別人要審覈或者測試你的代碼的時候。
一些非正式命名規則:
全局(global)變量前面加 g_
成員(member)變量前面加 m_
類型(type)名稱前面加t_ (猜測類型和類差不多,是自己定義的類型)
常量(constant)前面加c_
枚舉(enumeration)前面加e_
java中的一些命名規則
python中的一些命名規則
其他規則
增加前綴與縮寫長的名稱都是不錯的選擇
在避免使用的名稱當中有幾個注意事項:避免使用相似含義的名稱。 input和inputValue表達的意思差不多。currentUserNameList和userNameList也差不多。
總結:
每種語言都有每種語言特定的命名規則,python中多使用下劃線和小寫字母的組合,java中多使用駝峯結構。其實,重要的不是用什麼樣的結構,重要的是好的命名是給人看的,能夠讓人更好的閱讀,能夠展現變量的意義。
參考:
代碼大全