1. 程式人生 > >程式設計規範&匈牙利命名法

程式設計規範&匈牙利命名法

VC程式設計規範-程式設計師們都應該這樣寫程式碼

基本要求

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