?? 程序編寫規范倡議書大話篇.htm
字號:
<P><BR>RE:《程序編寫規范倡議書》大話篇 - 成都 / super_mike 回復于2001-9-7 13:20:00 <BR>C語言編程規范(僅供參考,如有異議,歡迎電子郵件與我聯系):<BR>1. 基本要求<BR>1.1 程序結構清析,簡單易懂,單個函數的程序行數不得超過100行。<BR>1.2 打算干什么,要簡單,直接了當,代碼精簡,避免垃圾程序。<BR>1.3 盡量使用標準庫函數和公共函數。<BR>1.4 不要隨意定義全局變量,盡量使用局部變量。<BR>1.5 使用括號以避免二義性。</P>
<P>2.可讀性要求<BR>2.1 可讀性第一,效率第二。<BR>2.2 保持注釋與代碼完全一致。<BR>2.3 每個源程序文件,都有文件頭說明,說明規格見規范。<BR>2.4 每個函數,都有函數頭說明,說明規格見規范。<BR>2.5 主要變量(結構、聯合、類或對象)定義或引用時,注釋能反映其含義。<BR>2.7 常量定義(DEFINE)有相應說明。<BR>2.8 處理過程的每個階段都有相關注釋說明。<BR>2.9 在典型算法前都有注釋。<BR>2.10 利用縮進來顯示程序的邏輯結構,縮進量一致并以Tab鍵為單位,定義Tab為 6個<BR>字節。<BR>2.11 循環、分支層次不要超過五層。<BR>2.12 注釋可以與語句在同一行,也可以在上行。<BR>2.13 空行和空白字符也是一種特殊注釋。<BR>2.14 一目了然的語句不加注釋。<BR>2.15 注釋的作用范圍可以為:定義、引用、條件分支以及一段代碼。<BR>2.16 注釋行數(不包括程序頭和函數頭說明部份)應占總行數的 1/5 到 1/3 。</P>
<P>3. 結構化要求<BR>3.1 禁止出現兩條等價的支路。<BR>3.2 禁止GOTO語句。<BR>3.3 用 IF 語句來強調只執行兩組語句中的一組。禁止 ELSE GOTO 和 ELSE RETURN。<BR>3.4 用 CASE 實現多路分支。<BR>3.5 避免從循環引出多個出口。<BR>3.6 函數只有一個出口。<BR>3.7 不使用條件賦值語句。<BR>3.8 避免不必要的分支。<BR>3.9 不要輕易用條件分支去替換邏輯表達式。</P>
<P>4. 正確性與容錯性要求<BR>4.1 程序首先是正確,其次是優美<BR>4.2 無法證明你的程序沒有錯誤,因此在編寫完一段程序后,應先回頭檢查。<BR>4.3 改一個錯誤時可能產生新的錯誤,因此在修改前首先考慮對其它程序的影響。<BR>4.4 所有變量在調用前必須被初始化。<BR>4.5 對所有的用戶輸入,必須進行合法性檢查。<BR>4.6 不要比較浮點數的相等,<BR>如: 10.0 * 0.1 == 1.0 , 不可靠<BR>4.7 程序與環境或狀態發生關系時,必須主動去處理發生的意外事件,如文件能否<BR>邏輯鎖定、打印機是否聯機等。<BR>4.8 單元測試也是編程的一部份,提交聯調測試的程序必須通過單元測試。</P>
<P>5. 可重用性要求<BR>5.1 重復使用的完成相對獨立功能的算法或代碼應抽象為公共控件或類。<BR>5.2 公共控件或類應考慮OO思想,減少外界聯系,考慮獨立性或封裝性。<BR>5.3 公共控件或類應建立使用模板。<BR> 附:C++ 編程規范,delphi作相應的參考</P>
<P>1適用范圍<BR>本標準適用于利用Visul C++ ,Borland C++進行軟件程序開發的人員.。</P>
<P>.2變量命名<BR>命名必須具有一定的實際意義,形式為xAbcFgh,x由變量類型確定,Abc、Fgh表示連續意<BR>義字符串,如果連續意義字符串僅兩個,可都大寫.如OK.<BR>具體例程:<BR>BOOL類型 bEnable;</P>
<P>ch * char chText<BR>c * 類對象 cMain(對象實例)<BR>h * Handle(句柄) hWnd<BR>i * int<BR>n * 無符號整型<BR>p * 指針<BR>sz,str * 字符串<BR>w WORD<BR>x,y 坐標<BR>Char或者TCHAR類型 與Windows API有直接聯系的用szAppName[10]形式否則用<BR>FileName[10]形式,單個字符也可用小寫字母表示;<BR>Int類型 nCmdShow;<BR>LONG類型 lParam;<BR>UINT類型 uNotify;<BR>DWORD類型 dwStart;<BR>PSTR類型 pszTip;<BR>LPSTR類型 lpCmdLine<BR>LPTSTR類型 lpszClassName;<BR>LPVOID類型 lpReserved<BR>WPARAM類型 wParam,<BR>LPARAM類型 lParam<BR>HWND類型 hDlg;<BR>HDC類型 hDC;<BR>HINSTANCE類型 hInstance<BR>HANDLE類型 hInstance,<BR>HICON類型 hIcon;<BR>int iTmp<BR>float fTmp<BR>DWORD dw*<BR>String , AnsiString str *<BR>m_ 類成員變量 m_nVal, m_bFlag<BR>g_ 全局變量 g_nMsg, g_bFlag<BR>局部變量中可采用如下幾個通用變量:nTemp,nResult,I,J(一般用于循環變量)。<BR>其他資源句柄同上<BR>.3常量命名和宏定義<BR>常量和宏定義必須具有一定的實際意義;<BR>常量和宏定義在#include和函數定義之間;<BR>常量和宏定義必須全部以大寫字母來撰寫,中間可根據意義的連續性用下劃線連接,每一<BR>條定義的右側必須有一簡單的注釋,說明其作用;<BR>資源名字定義格式:<BR>菜單:IDM_XX或者CM_XX<BR>位圖:IDB_XX<BR>對話框:IDD_XX<BR>字符串:IDS_XX<BR>DLGINIT:DIALOG_XX<BR> ICON:IDR_XX<BR>.4函數命名<BR>函數原型說明包括引用外來函數及內部函數,外部引用必須在右側注明函數來源:模<BR>塊名及文件名, 如是內部函數,只要注釋其定義文件名;<BR>第一個字母必須使用大寫字母,要求用大小寫字母組合規范函數命名,必要時可用下劃線<BR>間隔,示例如下:<BR>void UpdateDB_Tfgd (TRACK_NAME); <A href="file://Module">file://Module</A> Name :r01/sdw.c<BR>void PrintTrackData (TRACK_NAME); <A href="file://Module">file://Module</A> Name :r04/tern.c<BR>void ImportantPoint (void); <A href="file://Module">file://Module</A> Name :r01/sdw.c<BR>void ShowChar (int , int , chtype); <A href="file://Local">file://Local</A> Module<BR>void ScrollUp_V (int , int); <A href="file://Local">file://Local</A> Module<BR>.5結構體命名<BR>結構體類型命名必須全部用大寫字母,原則上前面以下劃線開始;結構體變量命名必須用<BR>大小寫字母組合,第一個字母必須使用大寫字母,必要時可用下劃線間隔。對于私有數<BR>據區,必須注明其所屬的進程。全局數據定義只需注意其用途。<BR> 示例如下:<BR> typedef struct<BR> {<BR> char szProductName[20];<BR> char szAuthor[20];</P>
<P> char szReleaseDate[16];<BR> char szVersion[10];<BR> unsigned long MaxTables;<BR> unsigned long UsedTables;<BR>}DBS_DATABASE;<BR>DBS_DATABASE GdataBase;</P>
<P>6 控件的命名:<BR>用小寫前綴表示類別<BR>用小寫前綴表示類別:<BR>fm 窗口<BR>cmd 按鈕<BR>cob combo,下拉式列表框<BR>txt 文本輸入框<BR>lab labal,標簽<BR>img image,圖象<BR>pic picture<BR>grd Grid,網格<BR>scr 滾動條<BR>lst 列表框<BR>frm fram</P>
<P>7注釋<BR>原則上注釋要求使用中文;<BR>文件開始注釋內容包括:公司名稱、版權、作者名稱、時間、模塊用途、背景介紹等,復<BR>雜的算法需要加上流程說明;<BR>函數注釋包括:輸入、輸出、函數描述、流程處理、全局變量、調用樣例等,復雜的函數<BR>需要加上變量用途說明;<BR>程序中注釋包括:修改時間和作者、方便理解的注釋等;</P>
<P><BR> 引用一: 文件開頭的注釋模板<BR>/******************************************************************<BR>** 文件名:<BR>** Copyright (c) 1998-1999 *********公司技術開發部<BR>** 創建人:<BR>** 日 期:<BR>** 修改人:<BR>** 日 期:<BR>** 描 述:<BR>**<BR>** 版 本:<BR>**--------------------------------------------------------------------------<BR>---</P>
<P><BR>******************************************************************/</P>
<P> 引用二: 函數開頭的注釋模板<BR>/*****************************************************************<BR>** 函數名:<BR>** 輸 入: a,b,c<BR>** a---<BR>** b---<BR>** c---<BR>** 輸 出: x---<BR>** x 為 1, 表示...<BR>** x 為 0, 表示...<BR>** 功能描述:<BR>** 全局變量:<BR>** 調用模塊:<BR>** 作 者:<BR>** 日 期:<BR>** 修 改:<BR>** 日 期:<BR>** 版本<BR>****************************************************************/<BR> 引用三: 程序中的注釋模板<BR>/*----------------------------------------------------------*/<BR>/* 注釋內容 */<BR>/*----------------------------------------------------------*/<BR>8 程序<BR>a. 程序編碼力求簡潔,結構清晰,避免太多的分支結構及太過于技巧性的程序,<BR>盡量不采用遞歸模式。<BR>b. 編寫程序時,亦必須想好測試的方法,換句話說,”單元測試” 的測試方案應<BR>在程序編寫時一并擬好。<BR>c. 注釋一定要與程序一致。<BR>d. 版本封存以后的修改一定要將老語句用/* */ 封閉,不能自行刪除或修改,并要<BR>在文件及函數的修改記錄中加以記錄。<BR>e. 程序中每個block 的開頭 ”{" 及 "}” 必須對齊,嵌套的block 每進一套,<BR>縮進一個tab,TAB 為4個空格,block類型包括if、for、while、do等關鍵字引出的。<BR>f. 對于比較大的函數,每個block 和特殊的函數調用,都必須注明其功能,舉例如下<BR>:<BR>count.divisor = 1193280 / freq; // compute the proper count<BR>OutByte((unsigned short)67, (unsigned char)182); // tell 8253 that a<BR>count is coming<BR>OutByte((unsigned short)66, count. c[0]); // send low-order byte<BR>OutByte((unsigned short)66, count. c[1]); // send high-order byte</P>
<P>×××××××××××××××××××××××××××××××××××××××<BR>bcb,delphi中的變量命名:<BR> 遵循匈牙利命名法,命<BR>名必須有意義,制定如下規定<BR> 窗體:以大寫的W開始,如About版權窗體, 命名為WAbout<BR>文件:以大寫的F開始,如About版權窗體,文件命名為FAbout.cpp<BR>按鈕(Button):如退出按鈕,命名為btnExit<BR> ……<BR> 基類:加base標記,如報表基類,窗體命名為:WBaseRep, 文件命名為FBaseRep.cpp</P>
<P>轉貼<BR>> 1. 在.h/.cpp的開頭應有一段格式統一的說明,內容包括:<BR>> a. 文件名 (FileName);<BR>> b. 創建人 (Creater);<BR>> c. 文件創建時間 (Date);<BR>> d. 簡短說明文件功能、用途 (Comment)。<BR>好習慣<BR>> 2. 除非極其簡單,否則對函數應有注釋說明。內容包括:功能、入口/出口參數,必<BR>要<BR>> 時還可有備注或補充說明。<BR>還是好習慣<BR>> 3. 每列代碼的長度推薦為 80列,最長不得超過120列;折行以對齊為準。<BR>太寬了,我的限制是60列,因為文本方式下屏幕一共80列,如果你用BC這一類的編輯<BR>器,窗口邊框等又要占據一定空間,所以80列太寬<BR>> 4. 循環、分支代碼,判斷條件與執行代碼不得在同一行上。<BR>很對<BR>> 5. 指針的定義,* 號既可以緊接類型,也可以在變量名之前。<BR>><BR>> 例:可寫做:int* pnsize;<BR>><BR>> 也可寫做:int *pnsize;<BR>><BR>> 但不得寫做:int * pnsize;<BR>建議采用第二種,除非附加另外一條規定:一次只聲明一個變量,否則就會讓人混淆,<BR>比如:<BR>int* a, b;<BR>看起來b好像也是個指針,其實不是。<BR>> 6. 在類的成員函數內調用非成員函數時,在非成員函數名前必須加上"::"。<BR>這一條我倒覺得并不是必需的,我的看法是決不要讓你的類成員函數和全局函數的名稱<BR>相同(或類似)<BR>> 7. 函數入口參數有缺省值時,應注釋說明。<BR>><BR>> 例:BOOL CWpsDib::PaintDIB(CDC* pDC, CRect& rc,<BR>> int nBrightness, <A href="file://*=0*//">file://*=0*//</A><BR>> BOOL bGrayScale <A href="file://*=FALSE*//">file://*=FALSE*//</A> )<BR>每個變量寫一行,必要時加上/*in, out*/注釋<BR>> 8. else if 必須寫在一行。<BR>應該盡量避免else if這樣的結構<BR>> 9. 與‘{’、‘}’有關的各項規定:<BR>><BR>> 9.1‘{’、‘}’應獨占一行。在該行內可有注釋。<BR>> 9.2 ‘{’必須另起一行,‘{’ 之后的代碼必須縮進一個Tab。‘{’與‘}’必須在<BR>同<BR>> 一列上。<BR>> 9.3 在循環、分支之后若只有一行代碼,雖然可省略‘{’、‘}’,但不推薦這么<BR>> 做。若省略后可能引起歧義,則必須加上‘{’、‘}’。<BR>持保留意見,因為GNU的代碼規范是這樣的:<BR>if ( NULL == ptr )<BR> {<BR> // do something here<BR> }<BR>或者<BR>if ( NULL == ptr ) {<BR> // do something here<BR>}<BR>爭論哪個更好并沒有意義,關鍵是統一,如果用VC當然你的辦法最方便,可是如果你用<BR>emacs或者vi,就不是這樣了。<BR>> 10. 與空格有關的各項規定。<BR>><BR>> 10.1 在所有兩目、三目運算符的兩邊都必須有空格。在單目運算符兩端不必空格。<BR>但<BR>> 在‘—>’、‘::’、‘.’、‘[’、‘]’等運算符前后,及‘&’(取地址)、‘*<BR>> ’(取值)等運算符之后不得有空格。<BR>> 10.2 for、while、if 等關鍵詞之后應有1個空格,再接‘(’,之后無空格;在結<BR>尾<BR>> 的‘)’前不得有空格。</P>
<P>我認為在括號兩端加空格并不是什么錯誤,尤其是在一個條件十分復雜的if語句里<BR>> 10.3 調用函數、宏時,‘(’、‘)’前后不得有空格。<BR>> 10.4 類型強制轉換時,‘(’‘)’前后不得有空格<BR>同上<BR>> 11. 與縮進有關的各項規定<BR>><BR>> 11.1 縮進以 Tab 為單位。1 個 Tab 為 4 個空格<BR>我認為這個值應該更大,我自己使用8個空格,如果你的代碼因為縮進幅度太大而導致<BR>折行,那么幾乎可以肯定你的程序設計方案有問題。<BR>> 11.2 下列情況,代碼縮進一個 Tab:<BR>> 1. 函數體相對函數名及'{'、'}'。<BR>> 2. if、else、for、while、do 等之后的代碼。<BR>> 3. 一行之內寫不下,折行之后的代碼,應在合理的位置進行折行。若有 + - * / 等<BR>運<BR>> 算符,則運算符應在上一行末尾,而不應在下一行的行首。<BR>這一條我反對,運算符應該放在下一行行首,以使人能清楚的知道這一行是續上一行<BR>的,比如<BR>if ( something<BR> && somethingelse<BR> && otherthings )<BR>如果寫做<BR>if ( something &&<BR> somethingelse &&<BR> otherthings )<BR>反而看不清楚<BR>> 11.3 下列情況,不必縮進:switch 之后的 case、default。</P>
<P> </P>
<P><BR> <BR></P></DIV></TD></TR></TBODY></TABLE><FONT color=#ff0000></FONT>
<P align=right><A href="http://blog.21ic.org/blog.asp?name=cxjr" target=_blank><FONT color=#ff0000>如果你的‘芯’是一座作坊,我愿做那不知疲倦的程序匠。打造一流博客,我們每天在努力!</FONT></A></P><A href="http://blog.21ic.org/blog.asp?name=cxjr" target=_blank><FONT color=#ff0000></FONT></A><br><a name='comment'></a><table width='90%' border='0' align='center' cellspacing='0' cellpadding='0'> <tr> <td><strong>發表評論:</strong></tr></td></table>
<table width='90%' border='0' align='center' cellspacing='0' cellpadding='0'> <tr> <td><table align='left' width='100%' border='0' cellspacing='0' cellpadding='0'>
<form action='more.asp?name=cxjr&id=667&action=addcomment_ic' method='post' name='commentform' onSubmit='return Verifycomment()'>
<tr><td height='25' align='left'>昵稱:<input name='UserName' type='text' id='UserName' size='15' maxlength='20' value=''></td></tr>
<tr><td height='25' align='left'>密碼:<input name='Password' type='password' id='Password' size='15' maxlength='20' value=''> (游客無須輸入密碼)</td></tr>
<tr ><td height='25' align='left' >驗證碼:<input name='GetCode' type='text' id='GetCode' size='12' maxlength='20' /> <img src='inc/code.asp' width='40' height='10' border='0' /><td></tr><tr ><td height='25' align='left' >主頁:<input name='homepage' type='text' id='homepage' size='42' maxlength='50' value='http://'><td></tr><tr ><td height='25' align='left' >標題:<input name='commenttopic' type='text' id='commenttopic' size='42' maxlength='50' value='回復:《程序編寫規范倡議書》大話篇'><td></tr><tr height='200'><td ><INPUT type='hidden' name='edit' id='edit' value=''>
<link rel="STYLESHEET" type="text/css" href="images/edit.css">
<Script Src="images/DhtmlEdit.js"></Script>
<table id="oblog_Container" class="oblog_Body" height=100% width=350 cellpadding=1 cellspacing=0 border=0 >
<tr>
<td height="10"> <table cellpadding=0 cellspacing=0 >
<tr class="yToolbar" ID="ExtToolbar0" >
<td> <select language="javascript" class="oblog_TBGen" id="FontSize" onchange="FormatText('fontsize',this[this.selectedIndex].value);">
<option class="heading" selected>字號
<option value="1">1
<option value="2">2
<option value="3">3
<option value="4">4
<option value="5">5
<option value="6">6
<option value="7">7</option>
</select>
<td class="oblog_Btn" TITLE="加粗" LANGUAGE="javascript" onclick="FormatText('bold', '');ondrag='return false;'" onmouseover=this.className='oblog_BtnMouseOverUp'; onmouseout=this.className='oblog_Btn'; >
<img class="oblog_Ico" src="images/bold.gif" WIDTH="16" HEIGHT="16" unselectable="on"> </td>
<td class="oblog_Btn" TITLE="斜體" LANGUAGE="javascript" onclick="FormatText('italic', '');ondrag='return false;'" onmouseover=this.className='oblog_BtnMouseOverUp'; onmouseout=this.className='oblog_Btn'; >
<img class="oblog_Ico" src="images/italic.gif" WIDTH="16" HEIGHT="16" unselectable="on"> </td>
<td class="oblog_Btn" TITLE="下劃線" LANGUAGE="javascript" onclick="FormatText('underline', '');ondrag='return false;'" onmouseover=this.className='oblog_BtnMouseOverUp'; onmouseout=this.className='oblog_Btn'; >
<img class="oblog_Ico" src="images/underline.gif" WIDTH="16" HEIGHT="16" unselectable="on"> </td>
<td class="oblog_Btn" TITLE="取消格式" LANGUAGE="javascript" onclick="FormatText('RemoveFormat', '');ondrag='return false;'" onmouseover=this.className='oblog_BtnMouseOverUp'; onmouseout=this.className='oblog_Btn'; >
<img class="oblog_Ico" src="images/removeformat.gif" WIDTH="16" HEIGHT="16" unselectable="on"> </td>
<td class="oblog_Btn" TITLE="左對齊" NAME="Justify" LANGUAGE="javascript" onclick="FormatText('justifyleft', '');ondrag='return false;'" onmouseover=this.className='oblog_BtnMouseOverUp'; onmouseout=this.className='oblog_Btn'; >
<img class="oblog_Ico" src="images/aleft.gif" WIDTH="16" HEIGHT="16" unselectable="on"> </td>
<td class="oblog_Btn" TITLE="居中" NAME="Justify" LANGUAGE="javascript" onclick="FormatText('justifycenter', '');ondrag='return false;'" onmouseover=this.className='oblog_BtnMouseOverUp'; onmouseout=this.className='oblog_Btn'; >
<img class="oblog_Ico" src="images/center.gif" WIDTH="16" HEIGHT="16" unselectable="on"> </td>
<td class="oblog_Btn" TITLE="右對齊" NAME="Justify" LANGUAGE="javascript" onclick="FormatText('justifyright', '');ondrag='return false;'" onmouseover=this.className='oblog_BtnMouseOverUp'; onmouseout=this.className='oblog_Btn'; >
<img class="oblog_Ico" src="images/aright.gif" WIDTH="16" HEIGHT="16" unselectable="on"> </td>
<td class="oblog_Btn" TITLE="插入表情" LANGUAGE="javascript" onclick="oblog_foremot()" onmouseover=this.className='oblog_BtnMouseOverUp'; onmouseout=this.className='oblog_Btn'; >
<img class="oblog_Ico" src="images/smiley.gif" WIDTH="16" HEIGHT="16" unselectable="on"> </td>
<td id="forecolor" name=forecolor class="oblog_Btn" TITLE="字體顏色" LANGUAGE="javascript" onclick="oblog_foreColor();" onmouseover=this.className='oblog_BtnMouseOverUp'; onmouseout=this.className='oblog_Btn'; >
<img class="oblog_Ico" src="images/fgcolor.gif" WIDTH="16" HEIGHT="16" unselectable="on" > </td>
<td id="backcolor" class="oblog_Btn" TITLE="字體背景顏色" LANGUAGE="javascript" onclick="oblog_backColor();ondrag='return false;'" onmouseover=this.className='oblog_BtnMouseOverUp'; onmouseout=this.className='oblog_Btn';>
<img class="oblog_Ico" src="images/fbcolor.gif" WIDTH="16" HEIGHT="16" unselectable="on"> </td>
<td class="oblog_Btn" TITLE="插入超級鏈接" LANGUAGE="javascript" onclick="oblog_forlink();ondrag='return false;'" onmouseover=this.className='oblog_BtnMouseOverUp'; onmouseout=this.className='oblog_Btn'; >
<img class="oblog_Ico" src="images/wlink.gif" WIDTH="18" HEIGHT="18" unselectable="on"> </td>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -