前言:
通過建立代碼編寫規范,形成BCB開發小組編碼約定,提高程序的可靠性、可讀性、可修改性、可維護性、一致性,保證程序代碼的質量,繼承軟件開發成果,充分利用資源。提高程序的可繼承性,使開發人員之間的工作成果可以共享。
軟件編碼要遵循以下原則:
1.遵循開發流程,在設計的指導下進行代碼編寫。
2.代碼的編寫以實現設計的功能和性能為目標,要求正確完成設計要求的功能,達到設計的性能。
3.程序具有良好的程序結構,提高程序的封裝性好,減低程序的耦合程度。
4.程序可讀性強,易於理解;方便調試和測試,可測試性好。
5.易於使用和維護;良好的修改性、擴充性;可重用性強/移植性好。
6.占用資源少,以低代價完成任務。
7.在不降低程序的可讀性的情況下,盡量提高代碼的執行效率。
本規范的描述主要以 Borland C++ Builder 語言為例
一、規范:以下對本規范作詳細說明。
1:源程序的文件管理:
a)組織:每個程序文件單元通常都應由 .cpp、.dfm和 .h 等文件組成,並將單元的公共聲明部分放在 .h 文件中。劃分單元主要是以類為依據,原則上每個較大的類都應為一個單獨的單元,但在類較小且多個小類關系密切等情況下也可幾個類共一個單元(建議僅對已經詳細測試的較為通用的類采用)。
b)命名:原程序文件命名采用有意義的格式。例如:對登陸程序來說三個文件的命名應該是這樣,.cpp的是 Login.cpp .dfm的是Login.dfm .h的是Login.h
c)文件結構:每個程序文件由標題、內容和附加說明三部分組成。
(A)標題:文件最前面的注釋說明,其內容主要包括:程序名,作者,版本信息,簡要說明等,必要時應有更詳盡的說明(將以此部分以空行隔開單獨注釋)。
(B)內容:為文件源代碼部分基本上按預處理語句、類型定義、變量定義、函數原型、函數實現(僅對 .cpp 文件)的順序。 main 、 winmain ,控件注冊等函數應放在內容部分的最後,類的定義按 private 、 protected 、 pubilic 、 __pubished 的順序,並盡量保持每一部分只有一個,各部分中按數據、函數、屬性、事件的順序。
(C)附加說明:文件末尾的補充說明,如參考資料等,若內容不多也可放在標題部分的最後。
舉例說明:
/*************************************************************
類:class TimageManipulation
設計者:lunhongjun (2001/05/09)
用途:用於圖象處理,實現圖象亮度、對比度、反白、色彩平衡等處理
版本:
1.0 2001/05/09 完成基本的圖象處理功能設計
2001/05/10 修改完成一個小Bug.
*************************************************************/
class TImageManipulation
{
private://define variant
Graphics::TBitmap * pSourceBitmap;//用於存放未經處理的原始圖像
Graphics::TBitmap * pManipulatedImage;//用處存放經過處理後的圖象
//圖像處理過程中的相關參數
int iBrightness; //色彩亮度
int iContrast; //色彩對比度
int iRedColorBalance; //紅色色彩平衡度
int iBlueColorBalance; //藍色色彩平衡度
int iGreenColorBalance; //綠色色彩平衡度
bool bRotate; //字體旋轉度數
bool bMonochrome; //是否反白顯示
private:
void __fastcall BrightnessImage(void);//調整圖象亮度
void __fastcall ContrastImage(void);//調整圖象對比度
void __fastcall DoManipulationImage(void);//圖象處理
void __fastcall MonochromeImage(void);//圖象反白
void __fastcall DoColor(void);
void __fastcall DoFilter(int * flt, int Div);
void __fastcall RotateImage(void);//調整圖象色彩平衡
public://define property ,method,event,function
__fastcall TImageManipulation();
__fastcall ~TImageManipulation();
void __fastcall DoBrightness(int BrightnessIncrement);
void __fastcall DoContrast(int ContrastIncrement);
void __fastcall DoMonochrome(void);
void __fastcall DoChangeColorBalance(int RedBalance,
int BlueBalance, int GreenBalance);
void __fastcall SetSourceImage(Classes::TPersistent* Source);
Graphics::TBitmap * __fastcall GetManipulationImage(void);
void __fastcall DoBlur(void);
void __fastcall DoSharp(void);
void __fastcall DoEmboss(void);
void __fastcall LoadImageFromFile(AnsiString FileName);
void __fastcall SaveManipulatedImageAsFile(AnsiString FileName);
TImageManipulation& operator=(const TImageManipulation & imSource);
void __fastcall DoRotate(void);
};
#endif
2.編輯風格:
(1)縮進
縮進以4個空格為單位。建議在Tools/Editor Options中設置General頁面的Block ident為4,Tab Stop為4,不要選中Use tab character。預處理語句、全局數據、函數原型、標題、附加說明、函數說明、標號等均頂格書寫。語句塊的“{”“}”配對對齊,並與其前一行對齊,語句塊類的語句縮進建議每個“{”“}”單獨占一行。
(2)空格
變量、類、常量數據和函數在其類型,修飾(如 __fastcall 等)名稱之間適當空格並據情況對齊。關鍵字原則上空一格,如: if ( ... ) 等,運算符的空格規定如下:“::”、“->”、“[”、“]”、“++”、“--”、“~”、“!”、“+”、“-”(指正負號),“&”(取址或引用)、“*”(指使用指針時)等幾個運算符兩邊不加空格(其中單目運算符系指與操作數相連的一邊),其它運算符(包括大多數二目運算符和三目運算符“?:”兩邊均加一空格,“(”、“)”運算符在其內側空一格,在作函數定義時還可據情況多空或不空格來對齊,但在函數實現時可以不用。“,”運算符只在其後空一格,需對齊時也可不空或多空格,“sizeof”運算符建議也在其後空一格,不論是否有括號,對語句行後加的注釋應用適當空格與語句隔開並盡可能對齊。
(3)對齊
原則上關系密切的行應對齊,對齊包括類型、修飾、名稱、參數等各部分對齊。另每一行的長度不應超過屏幕太多,必要時適當換行,換行時盡可能在“,”處或運算符處,換行後最好以運算符打頭,並且以下各行均以該語句首行縮進,但該語句仍以首行的縮進為准,即如其下一行為“{”應與首行對齊。
變量定義最好通過添加空格形成對齊,同一類型的變量最好放在一起。如下例所示:
int Value;
int Result;
int Length;
DWORD Size;
DWORD BufSize;
char * pBuf;
void * pOutputBuf;
LPCSTR * pPath;
(4)空行
程序文件結構各部分之間空兩行,若不必要也可只空一行,各函數實現之間一般空兩行,由於BCB會自動產生一行“//------”做分隔,另因每個函數還要有函數說明注釋,故通常只需空一行或不空,但對於沒有函數說明的情況至少應再空一行。對自己寫的函數,建議也加上“//------”做分隔。函數內部數據與代碼之間應空至少一行,代碼中適當處應以空行空開,建議在代碼中出現變量聲明時,在其前空一行。類中四個“p”之間至少空一行,在其中的數據與函數之間也應空行。
(5)注釋
對注釋有以下三點要求:
A.必須是有意義。
B.必須正確的描述了程序。
C.必須是最新的。
注釋必不可少,但也不應過多,以下是四種必要的注釋:
A.標題、附加說明。
B.函數說明。對幾乎每個函數都應有適當的說明,通常加在函數實現之前,在沒有函數實現部分的情況下則加在函數原型前,其內容主要是函數的功能、目的、算法等說明,參數說明、返回值說明等,必要時還要有一些如特別的軟硬件要求等說明。
C.在代碼不明晰或不可移植處必須有一定的說明。
D.及少量的其它注釋。
注釋有塊注釋和行注釋兩種,分別是指:“/**/”和“//”建議對A用塊注釋,D用行注釋,B、C則視情況而定,但應統一,至少在一個單元中B類注釋形式應統一。
舉例如下:
/***************************************************************************
函數名稱:ResultType MyFunction(ParamType1 Param1, ParamTyp2,Param2)
功能:該函數主要是完成如下的功能
設計目的:設計該函數主要是為了解決。。。
設計原理:該函數是這樣設計的。。。
實現方法/過程:為了實現函數的目的,這個函數是這樣實現的。。。
出入口參數:
ParamType1 Param1:類型ParamType1,這個參數是。。。
。。。
返回值描述:
設計修改日志:
2001/4/16 第一次設計
2001/4/17 修改了。。。
2001/4/18 添加了。。。刪除了。。。
相關函數:
其他補充說明:
**************************************************************************/
ResultType MyFunction(ParamType1 Param1, ParamTyp2,Param2)
{
int Value;
int Result;
DWORD Size;
char * pBuf;
。。。。
}
(6)代碼長度:
對於每一個函數建議盡可能控制其代碼長度為53行左右,超過53行的代碼要重新考慮將其拆分為兩個或兩個以上的函數。函數拆分規則應該一不破壞原有算法為基礎,同時拆分出來的部分應該是可以重復利用的。對於在多個模塊或者窗體中都要用到的重復性代碼,完全可以將起獨立成為一個具備公用性質的函數,放置於一個公用模塊中(Common.cpp/Common.h)
3.符號名的命名(包括變量、函數、標號、模塊名等)
選用有實際意義的英文標識符號或縮寫符號,名稱中盡可能不使用阿拉伯數字,如這樣的名稱是不提倡的:Value1,Value2,Value3,Value4…..。
例如:
file(文件),code(編號),data(數據),pagepoint(頁面指針), faxcode(傳真號) ,address(地址),bank(開戶銀行),……
變量名稱:由(前綴+修飾語)構成。
(1)生存期修飾:用l(local)表示局域變量,p(public)表示全局變量,s(send)表示參數變量
(2)類型修飾:用s(AnsiString)表示字符串,c(Char)表示字符,n(number)數值,i(intger)表示整數,d(double)表示雙精度,f(float)浮點型,b(bool)布爾型,d(date)表示日期型.
例如:
li_length表示整形的局域變量,是用來標識長度的.ls_code表示字符型的局域變量,用來標識代碼.
控件名稱:由(前綴+修飾語)構成。前綴即為控件的名稱。
按鈕變量 Button+Xxxxxxx 例如:ButtonSave,ButtonExit,ButtonPrint等
題標變量 Label+Xxxxxxxx 例如:LabelName,LabelSex等
數據表變量 Table+Xxxxxx 例如:TableFile,TableCount等
查詢變量 Query+Xxxxxx 例如:QueryFile,QueryCeneter等
數據源變量 DataSource+Xxx 例如:DataSourceFile,DataSourceCenter等
。。。。。。。。。。。。。。。。
(注:對於與表有關的控件“修飾語”部分最好直接用表名。)
4:輸入輸出
輸入和輸出方式和格式盡可能方便用戶,避免因設計不當給使用帶來麻煩。應根據不同用戶的類型、特點和不同的要求來制定方案。格式力求簡單,並應有完備的出錯檢查和出錯恢復措施。
界面布局主要考慮各區域在屏幕的放置,使用戶能以最快的速度找到操作對象、發現目標,屏幕的布局還要考慮界面的表現形式,使界面美觀一致,協調合理。界面設計要求滿足以下要求:
●界面上只包含必要的信息。
●界面上包含所有必要的信息。
●界面布局從左上角開始。
●制訂格式標准,所有的屏幕設計都遵守這些標准,保持一致性。
●根據邏輯關系將相關的信息放在一起。
●屏幕設計要保持對稱的平衡。
●避免過多使用前調信息。//例如OnEnter事件請盡量少用。
●區分標題和內容。
●提示信息要簡潔。
●設計與用戶知識和經驗一致。
●按照使用順序顯示信息。
●遵照流行軟件的事實標准。
●選擇合理的顯示方式。
●盡可能不讓用戶切換畫面即可完成一次完整的操作。
5:其它程序技巧
程序中增加合理適量的注釋。程序的注釋作為評測考核的一個重要指標。
在程序設計時,應該全面考慮出現可能存在的例外情況的處理。應該有一個良好的錯誤處理和例外處理機制,在處錯誤的時候能保證程序能正常運行/退出,不會造成用戶的數據丟失/損失。對於發生意外錯誤或例外是要能記錄當時的運行情況並且用戶可將這個信息返回給開發人員。
避免使用相似的變量名,變量中盡量不含數字。
同一變量名不要有多種意義。
顯示說明所有變量。
注意浮點運算的誤差,少用浮點數比較。
注意整數運算的特點。
少用或不用GOTO語句,即使用GOTO不要相互交叉。
盡量少用全局和靜態變量。
提高程序的封裝性,降低程序各模塊的耦合性。
提高程序的可繼承性,建立通用的函數庫、控件庫,使開發人員之間的工作成果可以共享。
說明: 該文檔設計人:luhongjun(過江項羽)。
文檔版權歸BCB開發團隊所有,歡迎大家轉載引用,但請注明文檔所有者和設計人。未經同意請勿任意修改,不可用於商業目的。