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

