第一章檔案聲明
【規則1-1
】標頭檔和定義檔案的說明 在頭部聲明檔案的基本資料。1) 檔案名稱2) 簡要說明該檔案的作用3) 版本資訊,原作者和編輯作者,建立日期或最後修改日期
| /********************************************************************** File: MathGraph.h , interface defination of CMathGraph* Abstract: CMathGraph is a class for drawing various kinds of* math plot,histogram, etc** Current Version: 1.0* Coder: Dai Jun* Last Edited: 2006-Dec-11** First Finish: 2006-Dec-11* First Coder: Dai Jun**********************************************************************/ |
【規則1-2
】為了防止標頭檔被重複引用,應當用ifndef/define/endif結構產生預先處理塊。
| #ifndef MATHGRAPH_H // 防止mathgraph.h被重複引用#define MATHGRAPH_H …………程式本文 #endif |
【規則1-3
】用 #include <filename.h> 格式來引用標準庫的標頭檔(編譯器將從標準庫目錄開始搜尋)。
【規則1-4
】用 #include “filename.h” 格式來引用非標準庫的標頭檔(編譯器將從使用者的工作目錄開始搜尋)。
【建議】盡量避免使用全域變數,盡量不要在標頭檔中出現象extern int value 這類聲明。若要使用全域變數,建議在獨立的標頭檔中定義以方便尋找。
第2章程式的版式空行起著分隔程式段落的作用。空行得體(不過多也不過少)將使程式的布局更加清晰。空行不會浪費記憶體,雖然列印含有空行的程式是會多消耗一些紙張,但是值得。所以不要捨不得用空行。
2.1程式碼,空行及空格
【規則2-1-1
】在每個類聲明之後、每個函數定義結束之後都要加空行。
| void Function1(…){ …}// 空行void Function2(…){ …} |
【規則2-1-2
】在一個函數體內,邏揖上密切相關的語句之間不加空行,不同功能的程式塊之間應加空行分隔。參見樣本
| //空行void Function(){ 數值計算程式段 ; //空行 數值輸出程式段;} |
【規則2-1-3
】一行代碼只做一件事情,如只定義一個變數,或唯寫一條語句。這樣的代碼容易閱讀,並且方便於寫注釋。
| int width; // 寬度int height; // 高度int depth; // 深度 |
【規則2-1-4
】if、for、while、do等語句自佔一行,執行語句不得緊跟其後。不論執行語句有多少都要加{}, 這樣可以防止書寫失誤。
for (initialization; condition; update){dosomething();}// 空行other();
【建議2-1-5
】盡量在定義變數的同時初始化該變數(就近原則)如果變數的引用處和其定義處相隔比較遠,變數的初始化很容易被忘記。如果引用了未被初始化的變數,可能會導致程式錯誤。本建議可以減少隱患。例如int width = 10; // 定義並初紿化width
【規則2-1-6
】函數名之後不要留空格,緊跟左括弧‘(’
【規則2-1-7
】‘(’向後緊跟,‘)’、‘,’、‘;’向前緊跟,緊跟處不留空格。
【規則2-1-8
】‘,’之後要留空格,如Function(x, y, z)。如果‘;’不是一行的結束符號,其後要留空格,如for (initialization; condition; update)。
【規則2-1-9
】賦值操作符、比較操作符、算術操作符、邏輯操作符、位網域作業符,如“=”、“+=” “>=”、“<=”、“+”、“*”、“%”、“&&”、“||”、“<<”,“^”等二元操作符的前後應當加空格。但對於比較長的for, if等語句,為了緊湊可以適當去掉空格。 如for(i=0; i<10; i++) 和 if ((a<=b) && (c<=d))
【規則2-1-10
】來源程式中關係較為緊密的代碼應儘可能相鄰。
| rect.length=10,//矩形的長 不良的風格char_poi=str;//顯示的文本串rect.width=5;//矩形的寬 |
| rect.length=10;rect.width=5;// 矩形的長與寬關係較密切,放在一起。char_poi=str; |
【規則2-1-11
】一元操作符如“!”、“~”、“++”、“--”、“&”(地址運算子)等前後不加空格。象“[]”、“.”、“->”這類操作符前後也不加空格
| void Func1(int x, int y, int z); // 良好的風格 |
| if (year >= 2000) // 良好的風格if ((a>=b) && (c<=d)) // 良好的風格if(a>=b&&c<=d) // 不良的風格 |
| for (i=0; i<10; i++) // 良好的風格for(i=0;i<10;i++) // 不良的風格for (i = 0; I < 10; i ++) // 過多的空格 |
| x = a < b ? a : b; // 良好的風格x=a<b?a:b; // 不好的風格 |
| int *x = &y; // 良好的風格 int * x = & y; // 不良的風格 |
| array[5] = 0; // 不要寫成 array [ 5 ] = 0;a.Function(); // 不要寫成 a . Function();b->Function(); // 不要寫成 b -> Function(); |
2.2 對齊與拆分
【規則2-2-1
】程式的分界符‘{’和‘}’應獨佔一行並且位於同一列,同時與引用它們的語句靠左對齊。
【規則2-2-2
】{ }之內的代碼塊在‘{’右邊數格處靠左對齊。(VC的TAB預設為4格,有些規範不建議使用TAB,因為不同編輯器TAB鍵不一致,考慮到敲空格比較煩瑣,同一用TAB=4格左右縮排,可以設定編輯器TAB值)。同一級的代碼塊要對齊。
| if (condition){… // program code}else{… // program code} |
| 如果出現嵌套的{},則使用縮排對齊,如: { … { … } …} |
【規則2-2-3
】程式碼最大長度宜控制在70至80個字元以內。程式碼不要過長,否則眼睛看不過來,也不便於列印。
【規則2-2-4
】長運算式要在低優先順序操作符處拆分成新行,操作符放在新行之首(以便突出操作符)。拆分出的新行要進行適當的縮排,使排版整齊,語句可讀。
| if ((very_longer_variable1 >= very_longer_variable12) && (very_longer_variable3 <= very_longer_variable14) && (very_longer_variable5 <= very_longer_variable16)){ dosomething();} |
| virtual CMatrix CMultiplyMatrix (CMatrix leftMatrix, CMatrix rightMatrix); |
【規則2-2-5
】應當將修飾符 * 和 & 緊靠變數名, 傳回型別為指標的函數可靠近類型名
| char *name; int* Function(char *ch) |
2.3 注釋C語言的注釋符為“/*…*/”。C++語言中,程式塊的注釋常採用“/*…*/”,行注釋一般採用“//…”。
【規則2-3-2
】如果語句表達得很清楚的,則不必加註釋。否則多此一舉,令人厭煩。 有效注釋應該占程式文字量的25%左右
【規則2-3-3
】邊寫代碼邊注釋,修改代碼同時修改相應的注釋,以保證注釋與代碼的一致性。不再有用的注釋要刪除。
【規則2-3-4
】盡量避免在注釋中使用縮寫,特別是不常用縮寫。
【規則2-3-5
】注釋的位置應與被描述的代碼相鄰,上方或右方,不可放在下方。
實現在某一功能的長程式碼片段開始處註明程式碼片段功能,用//號佔位以方便尋找
| void Func(){...//開始繪圖//////////////////////////// …… 長程式碼片段 //計算矩陣/////////////////////////// ...... } |
函數定義處開頭要注釋函數名,函數功能和輸入輸出參數。簡單明了的函數可以只注釋功能。函式宣告處上方簡要說明函數功能。
| /****************************************************** ComplexFunc 函數功能描述......* 輸入參數: para1 參數1的意義* 1 若para為1的意義 2 若para為2的意義* para2 參數2的意義* 傳回值 char* 傳回值的意義*******************************************************/char* ComplexFunc(int para1, char *para2){ ...} |
| /************************************************************ 設定para*************************************************************/void SimpleFunc(int para){ m_para = para;} |
【規則2-3-6
】當域內代碼比較多,特別是有多重嵌套時,應當在一些段落的結束處加註釋,便於閱讀和檢查。if (a!=0){ … 長程式碼片段} //end if a else{ … 長程式碼片段}//end else
2.4
類的聲明版式
【規則2-4-1
】一般先定義介面函數,再定義成員變數,先public,後private. 把成員函數分類成:構造/釋構,屬性,行為. 在函式宣告的上方和成員變數右方加上功能注釋,
| class CmathGraph{ public: CmathGraph() ~CmathGraph() //Attribute public: //設定DC void SetDC(CDC *pDC); //擷取繪圖區域大小 CSize GetSize(); //Operation public: //在螢幕輸出文本 void DrawText(CString str); protected: int member1; //member1的作用 char member2; //member2的作用} |