經過千辛萬苦,我終于開博客了 剛來給個規范吧 VC編程規范 1.?基本要求 1.1?程序結構清析,簡單易懂,單個函數的程序行數不得超過100行。 1.2?打算干什么,要簡單,直接了當,代碼精簡,避免垃圾程序。 1.3?盡量使用標準庫函數和公共函數。 1.4?不要隨意定義全局變量,盡量使用局部變量。 1.5?使用括號以避免二義性。 2.可讀性要求 2.1?可讀性第一,效率第二。 2.2?保持注釋與代碼完全一致。 2.3?每個源程序文件,都有文件頭說明,說明規格見規范。 2.4?每個函數,都有函數頭說明,說明規格見規范。 2.5?主要變量(結構、聯合、類或對象)定義或引用時,注釋能反映其含義。 2.7?常量定義(DEFINE)有相應說明。 2.8?處理過程的每個階段都有相關注釋說明。 2.9?在典型算法前都有注釋。 2.10?利用縮進來顯示程序的邏輯結構,縮進量一致并以Tab鍵為單位,定義Tab為?6個 字節。 2.11?循環、分支層次不要超過五層。 2.12?注釋可以與語句在同一行,也可以在上行。 2.13?空行和空白字符也是一種特殊注釋。 2.14?一目了然的語句不加注釋。 2.15?注釋的作用范圍可以為:定義、引用、條件分支以及一段代碼。 2.16?注釋行數(不包括程序頭和函數頭說明部份)應占總行數的?1/5?到?1/3?。 3.?結構化要求 3.1?禁止出現兩條等價的支路。 3.2?禁止GOTO語句。 3.3?用?IF?語句來強調只執行兩組語句中的一組。禁止?ELSE?GOTO?和?ELSE?RETURN。 3.4?用?CASE?實現多路分支。 3.5?避免從循環引出多個出口。 3.6?函數只有一個出口。 3.7?不使用條件賦值語句。 3.8?避免不必要的分支。 3.9?不要輕易用條件分支去替換邏輯表達式。 4.?正確性與容錯性要求 4.1?程序首先是正確,其次是優美 4.2?無法證明你的程序沒有錯誤,因此在編寫完一段程序后,應先回頭檢查。 4.3?改一個錯誤時可能產生新的錯誤,因此在修改前首先考慮對其它程序的影響。 4.4?所有變量在調用前必須被初始化。 4.5?對所有的用戶輸入,必須進行合法性檢查。 4.6?不要比較浮點數的相等, 如:?10.0?*?0.1?==?1.0?,?不可靠 4.7?程序與環境或狀態發生關系時,必須主動去處理發生的意外事件,如文件能否 邏輯鎖定、打印機是否聯機等。 4.8?單元測試也是編程的一部份,提交聯調測試的程序必須通過單元測試。 5.?可重用性要求 5.1?重復使用的完成相對獨立功能的算法或代碼應抽象為公共控件或類。 5.2?公共控件或類應考慮OO思想,減少外界聯系,考慮獨立性或封裝性。 5.3?公共控件或類應建立使用模板。 附:C++?編程規范,delphi作相應的參考 .1適用范圍 本標準適用于利用Visul?C++?,Borland?C++進行軟件程序開發的人員.。 .2變量命名 命名必須具有一定的實際意義,形式為xAbcFgh,x由變量類型確定,Abc、Fgh表示連續意 義字符串,如果連續意義字符串僅兩個,可都大寫.如OK. 具體例程: BOOL類型?bEnable; ch?*?char?chText c?*?類對象?cMain(對象實例) h?*?Handle(句柄)?hWnd i?*?int n?*?無符號整型 p?*?指針 sz,str?*?字符串 w?WORD x,y?坐標 Char或者TCHAR類型?與Windows?API有直接聯系的用szAppName[10]形式否則用 FileName[10]形式,單個字符也可用小寫字母表示; Int類型?nCmdShow; LONG類型?lParam; UINT類型?uNotify;? DWORD類型?dwStart; PSTR類型?pszTip; LPSTR類型?lpCmdLine LPTSTR類型?lpszClassName; LPVOID類型?lpReserved WPARAM類型?wParam, LPARAM類型?lParam HWND類型?hDlg; HDC類型?hDC; HINSTANCE類型?hInstance HANDLE類型?hInstance, HICON類型?hIcon; int?iTmp float?fTmp DWORD?dw* String?,?AnsiString?str?* m_?類成員變量?m_nVal,?m_bFlag g_?全局變量?g_nMsg,?g_bFlag 局部變量中可采用如下幾個通用變量:nTemp,nResult,I,J(一般用于循環變量)。 其他資源句柄同上 .3常量命名和宏定義 常量和宏定義必須具有一定的實際意義; 常量和宏定義在#include和函數定義之間; 常量和宏定義必須全部以大寫字母來撰寫,中間可根據意義的連續性用下劃線連接,每一 條定義的右側必須有一簡單的注釋,說明其作用; 資源名字定義格式: 菜單:IDM_XX或者CM_XX 位圖:IDB_XX 對話框:IDD_XX 字符串:IDS_XX DLGINIT:DIALOG_XX ICON:IDR_XX .4函數命名 函數原型說明包括引用外來函數及內部函數,外部引用必須在右側注明函數來源:?模 塊名及文件名,?如是內部函數,只要注釋其定義文件名; 第一個字母必須使用大寫字母,要求用大小寫字母組合規范函數命名,必要時可用下劃線 間隔,示例如下: void?UpdateDB_Tfgd?(TRACK_NAME);?//Module?Name?:r01/sdw.c void?PrintTrackData?(TRACK_NAME);?//Module?Name?:r04/tern.c void?ImportantPoint?(void);?//Module?Name?:r01/sdw.c void?ShowChar?(int?,?int?,?chtype);?//Local?Module void?ScrollUp_V?(int?,?int);?//Local?Module .5結構體命名 結構體類型命名必須全部用大寫字母,原則上前面以下劃線開始;結構體變量命名必須用 大小寫字母組合,第一個字母必須使用大寫字母,必要時可用下劃線間隔。對于私有數 據區,必須注明其所屬的進程。全局數據定義只需注意其用途。 示例如下: typedef?struct { char?szProductName[20]; char?szAuthor[20]; char?szReleaseDate[16]; char?szVersion[10];? unsigned?long?MaxTables; unsigned?long?UsedTables; }DBS_DATABASE; DBS_DATABASE?GdataBase; 6?控件的命名: 用小寫前綴表示類別 用小寫前綴表示類別: fm?窗口 cmd?按鈕 cob?combo,下拉式列表框 txt?文本輸入框 lab?labal,標簽 img?image,圖象 pic?picture grd?Grid,網格 scr?滾動條 lst?列表框 frm?fram 7注釋 原則上注釋要求使用中文; 文件開始注釋內容包括:公司名稱、版權、作者名稱、時間、模塊用途、背景介紹等,復 雜的算法需要加上流程說明; 函數注釋包括:輸入、輸出、函數描述、流程處理、全局變量、調用樣例等,復雜的函數 需要加上變量用途說明; 程序中注釋包括:修改時間和作者、方便理解的注釋等; 引用一:?文件開頭的注釋模板 /****************************************************************** **?文件名: **?Copyright?(c)?1998-1999?*********公司技術開發部 **?創建人: **?日?期: **?修改人: **?日?期: **?描?述: ** **?版?本: **-------------------------------------------------------------------------- --- ******************************************************************/ 引用二:?函數開頭的注釋模板 /***************************************************************** **?函數名: **?輸?入:?a,b,c **?a--- **?b--- **?c--- **?輸?出:?x--- **?x?為?1,?表示... **?x?為?0,?表示... **?功能描述: **?全局變量: **?調用模塊: **?作?者: **?日?期: **?修?改: **?日?期: **?版本 ****************************************************************/ 引用三:?程序中的注釋模板 /*----------------------------------------------------------*/ /*?注釋內容?*/ /*----------------------------------------------------------*/ 8?程序 a.?程序編碼力求簡潔,結構清晰,避免太多的分支結構及太過于技巧性的程序, 盡量不采用遞歸模式。 b.?編寫程序時,亦必須想好測試的方法,換句話說,”單元測試”?的測試方案應 在程序編寫時一并擬好。 c.?注釋一定要與程序一致。 d.?版本封存以后的修改一定要將老語句用/*?*/?封閉,不能自行刪除或修改,并要 在文件及函數的修改記錄中加以記錄。 e.?程序中每個block?的開頭?”{"?及?"}”?必須對齊,嵌套的block?每進一套, 縮進一個tab,TAB?為4個空格,block類型包括if、for、while、do等關鍵字引出的。 f.?對于比較大的函數,每個block?和特殊的函數調用,都必須注明其功能,舉例如下 : count.divisor?=?1193280?/?freq;?//?compute?the?proper?count OutByte((unsigned?short)67,?(unsigned?char)182);?//?tell?8253?that?a count?is?coming OutByte((unsigned?short)66,?count.?c[0]);?//?send?low-order?byte OutByte((unsigned?short)66,?count.?c[1]);?//?send?high-order?byte ××××××××××××××××××××××××××××××××××××××× bcb,delphi中的變量命名: 遵循匈牙利命名法,命 名必須有意義,制定如下規定 窗體:?以大寫的W開始,如About版權窗體,?命名為WAbout 文件:以大寫的F開始,如About版權窗體,文件命名為FAbout.cpp 按鈕(Button):如退出按鈕,命名為btnExit … 基類:?加base標記,如報表基類,窗體命名為:WBaseRep,?文件命名為FBaseRep.cpp? |