程式碼就是程式設計師的面子,無論是在工作中在電腦上寫程式程式碼還是在面試時在紙上寫演示程式碼我們都希望寫出整潔,優雅的程式碼。特別在工作中當我們碰到需要維護別人的程式碼,或者是多人蔘與一個專案大家一起寫程式碼的時候,如果碰到一些醜陋的程式碼,我們還要看懂並且修改它的時候,那種難受,肯定會讓我們回想起多年以前自己還是新手程式設計師的時候,寫下的那些醜陋的程式碼,並且深深內疚於將它們留給了我們的後繼者,不知道他們和它們是否還安好。所以,強調程式碼的規範性,寫出整潔,優雅,可讀性高的程式碼應該是成為一個合格的程式設計師的第一步。這裡我就拋磚引玉,給大家一些關於C++程式碼規範性的一些建議。
一、關於新增空格和空行的一些建議
寫程式碼的時候新增良好風格的空格和空行可以使程式碼看上去更整潔,佈局更清晰。
1.空格
- 建議一:函式名之後不要留空格,緊跟左括號‘ (’,以與關鍵字區別。
- 建議二:象 if、 for、 **while **等關鍵字之後應留一個空格再跟左括號‘ (’,以突出關鍵字。
- 建議三:‘,’之後要留空格。在for語句中的‘;’其後要留空格,如 for (i=0; i<5; i++)。
- 建議四:對於表示式比較長的 **for **語句和 **if **語句,為了緊湊起見可以適當地去掉一些空格。
- 建議五:賦值操作符、比較操作符、算術操作符、邏輯操作符、位域操作符,如“ =”、“ +=” “>=”、“ <=”、“ +”、“ *”、“ %”、“ &&”、“ <<”、 “ ^”等二元操作符的前後應當加空格。
- 建議六:一元操作符如“ !”、“ ~”、“ ++”、“ --”、“ &”(地址運算子)等前後不加空格。
下面這段程式碼就會顯得不優雅,看著有些彆扭。
//不好的風格
void func (int a,int b,int c,int d)
{
if(a>=0)
{
if(a>=b&&c>=d)
{
int * x = & a;
...//doSomeThing();
}
}
}
複製程式碼
我們希望將它改為這樣。
//良好的風格
void func(int a, int b, int c, int d)//建議一,建議三
{
if (a >= 0)//建議二,建議五
{
if ((a>=b) && (c>=d))//建議四
{
int *x = &a; //建議六
...//doSomeThing();
}
}
}
複製程式碼
還有這樣的for語句for (i = 0; i < 5; i ++)
,就屬於空格濫用了,應該改為for (i=0; i<5; i++)
。
2.空行
- 建議一:在實現函式時,函式與函式之間應加空行。
- 建議二:在一個函式體內,邏揖上密切相關的語句之間不加空行,其它地方應加空行。
當程式中沒有空行時是這樣的。
void func1()
{
while (condition)
{
...//doSomeThing();
if (condition)
{
...//doSomeThingRelated();
}
else
{
...//doSomeThingRelated();
}
...//doSomeThing();
}
}
void func2()
{
...//doSomeThing();
}
複製程式碼
而良好的空行不緊能使程式碼看上去更整潔,程式碼邏輯也會更清晰。
//良好的風格
void func1()
{
while (condition)
{
...//doSomeThing();
if (condition)
{
...//doSomeThingRelated();
}
else
{
...//doSomeThingRelated();
}
...//doSomeThing();
}
}
void func2()
{
...//doSomeThing();
}
複製程式碼
二、關於程式碼行格式的一些建議
- 建議一:一行程式碼只做一件事情。
- 建議二:長表示式要在低優先順序操作符處拆分成新行,操作符放在新行之首 (以便突出操作符)。拆分出的新行要進行適當的縮排,使排版整齊,語句可讀。
//不好的風格
void func()
{
int veryVeryLongWidth, veryVeryLongHeight;
if ((veryVeryLongWidth > veryVeryLongHeight) || (veryVeryLongWidth < veryVeryLongHeight))doSomeThing();
}
複製程式碼
過長的程式碼行無論是書寫還是閱讀對人來說都不是一個美好的體驗,所以我們建議以上程式碼要這樣寫。
//良好的風格
void func()
{
int veryVeryLongWidth;
int veryVeryLongHeight;
if ((veryVeryLongWidth > veryVeryLongHeight)
|| (veryVeryLongWidth < veryVeryLongHeight))
{
doSomeThing();
}
}
複製程式碼
三、關於命名的一些建議
- 建議一:變數,函式,檔案命名應該具有描述性,最好採用英文單詞或其組合(不要使用拼音,或者無意義的abc之類的,除了像for (i=0; i<5; i++)中的i這樣的),以便記憶和閱讀。
- 建議二:類名和函式名用大寫字母開頭的單片語合而成。 例如:
class Book;
class ReadBook;
void Draw();
void DrawImage();
複製程式碼
- 建議三:變數和引數用小寫字母開頭的單片語合而成。 例如:
int value;
void SetValueMode(int valueMode);
複製程式碼
- 建議四:常量全用大寫的字母,用下劃線分割單詞。 例如:
const int MAX = 100;
const int MAX_LENGTH = 100;
複製程式碼
- 建議五:全域性變數加字首 g_(表示 global)。靜態變數加字首 s_(表示 static)。類的成員變數加字首 m_(表示 member)。 例如:
int g_maxValue;
static int s_maxValue;
void Object::SetValue(int maxValue)
{
m_maxValue = maxValue;
}
複製程式碼
四、關於新增註釋的一些建議
在C++中註釋主要有兩種,程式塊的註釋常採用“ /*…*/”,行註釋一般採用“ //…”。註釋主要用在3個地方。1、版權申明,2、函式說明,3、重要或複雜程式碼提示。對於前兩種,每個人或者每個公司都有個人的規範和習慣,這裡只要大家在公司內部統一即可。關於第三種給重要或複雜程式碼新增提示,我們有一下幾點建議。
- 建議一:註釋的確很重要,但是最好的程式碼本身就是文件(self-document),型別和變數命名意義明確要比通過註釋解釋模糊命名好得多。
- 建議二:邊寫程式碼邊註釋,修改程式碼同時修改相應的註釋,以保證註釋與程式碼的一致性。不再有用的註釋要記得刪除。
- 建議三:註釋的位置應與被描述的程式碼相鄰,可以放在程式碼的上方或右方,不可放在下方。
五、關於類中成員宣告次序的一些建議
- 建議一:在類中按照public:、protect:、private:的次序宣告。如果那一塊沒有直接忽略。
- 建議二:在同一塊中按照1、結構體和列舉,2、常量,3、建構函式,4、解構函式,5、成員函式,6、成員變數的次序宣告。
六、關於if語句中的變數“與零值比較”的一些建議
- 建議一:不可將布林變數直接與 TRUE、 **FALSE **或者 1、 **0 **進行比較。 假設布林變數名字為 flag,它與零值比較的標準 if 語句如下:
if (flag) // 表示 flag 為真
if (!flag) // 表示 flag 為假
複製程式碼
- 建議二:應當將整型變數用“ ==”或“!=”直接與 0 比較。 假設整型變數的名字為 value,它與零值比較的標準 if 語句如下:
if (value == 0)
if (value != 0)
複製程式碼
也可以將0放在比較運算子前面。
if (0 == value)
if (0 != value)
複製程式碼
這時如果將“==”寫成“=”,編譯器會報錯。
- 建議三:不可將浮點變數用“ ==”或“!=”與任何數字比較。無論是 float 還是 double 型別的變數,都有精度限制。所以一定要避免將浮點變數用“ ==”或“!=”與數字比較,應該設法轉化成“ >=”或“ <=”形式。 假設浮點變數的名字為 x,應當將
if (x == 0.0) // 隱含錯誤的比較
複製程式碼
修改為
const float EPSINON = 0.00001;
if ((x>=-EPSINON) && (x<=EPSINON))
複製程式碼
其中 EPSINON 是允許的誤差(即精度)。
- 建議四:應當將指標變數用“ ==”或“! =”與** NULL **比較。 假設指標變數的名字為 p,它與零值比較的標準 if 語句如下:
if (p == NULL) // p 與 NULL 顯式比較,強調 p 是指標變數
if (p != NULL)
複製程式碼