程序中好的命名

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中的一些命名規則

 Python命名規則

其他規則

增加前綴與縮寫長的名稱都是不錯的選擇

在避免使用的名稱當中有幾個注意事項:避免使用相似含義的名稱。 input和inputValue表達的意思差不多。currentUserNameList和userNameList也差不多。


總結:

  每種語言都有每種語言特定的命名規則,python中多使用下劃線和小寫字母的組合,java中多使用駝峯結構。其實,重要的不是用什麼樣的結構,重要的是好的命名是給人看的,能夠讓人更好的閱讀,能夠展現變量的意義。

參考:

  代碼大全




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章