?? 編程規(guī)范與范例(2).txt
字號(hào):
[編程技巧]編程規(guī)范與范例(2)
程序匠人 發(fā)表于 2005-8-27 20:15:00 閱讀全文(208) | 回復(fù)(0) | 引用(0)
編程規(guī)范與范例(2)
〖文章轉(zhuǎn)載或出處〗≡中國(guó)電子技術(shù)信息網(wǎng)≡ 網(wǎng)址:www.CETINet.com
編程規(guī)范與范例(2)
目 錄
1 排版 6
2 注釋 11
3 標(biāo)識(shí)符命名 18
4 可讀性 20
5 變量、結(jié)構(gòu) 22
6 函數(shù)、過(guò)程 28
7 可測(cè)性 36
8 程序效率 40
9 質(zhì)量保證 44
10 代碼編輯、編譯、審查 50
11 代碼測(cè)試、維護(hù) 52
12 宏 53
3 標(biāo)識(shí)符命名
¹ 3-1:標(biāo)識(shí)符的命名要清晰、明了,有明確含義,同時(shí)使用完整的單詞或大家基本可以理解的縮寫(xiě),避免使人產(chǎn)生誤解。
說(shuō)明:較短的單詞可通過(guò)去掉“元音”形成縮寫(xiě);較長(zhǎng)的單詞可取單詞的頭幾個(gè)字母形成縮寫(xiě);一些單詞有大家公認(rèn)的縮寫(xiě)。
示例:如下單詞的縮寫(xiě)能夠被大家基本認(rèn)可。
temp 可縮寫(xiě)為 tmp ;
flag 可縮寫(xiě)為 flg ;
statistic 可縮寫(xiě)為 stat ;
increment 可縮寫(xiě)為 inc ;
message 可縮寫(xiě)為 msg ;
¹ 3-2:命名中若使用特殊約定或縮寫(xiě),則要有注釋說(shuō)明。
說(shuō)明:應(yīng)該在源文件的開(kāi)始之處,對(duì)文件中所使用的縮寫(xiě)或約定,特別是特殊的縮寫(xiě),進(jìn)行必要的注釋說(shuō)明。
¹ 3-3:自己特有的命名風(fēng)格,要自始至終保持一致,不可來(lái)回變化。
說(shuō)明:個(gè)人的命名風(fēng)格,在符合所在項(xiàng)目組或產(chǎn)品組的命名規(guī)則的前提下,才可使用。(即命名規(guī)則中沒(méi)有規(guī)定到的地方才可有個(gè)人命名風(fēng)格)。
¹ 3-4:對(duì)于變量命名,禁止取單個(gè)字符(如i、j、k...),建議除了要有具體含義外,還能表明其變量類型、數(shù)據(jù)類型等,但i、j、k作局部循環(huán)變量是允許的。
說(shuō)明:變量,尤其是局部變量,如果用單個(gè)字符表示,很容易敲錯(cuò)(如i寫(xiě)成j),而編譯時(shí)又檢查不出來(lái),有可能為了這個(gè)小小的錯(cuò)誤而花費(fèi)大量的查錯(cuò)時(shí)間。
示例:下面所示的局部變量名的定義方法可以借鑒。
int liv_Width
其變量名解釋如下:
l 局部變量(Local) (其它:g 全局變量(Global)...)
i 數(shù)據(jù)類型(Interger)
v 變量(Variable) (其它:c 常量(Const)...)
Width 變量含義
這樣可以防止局部變量與全局變量重名。
¹ 3-5:命名規(guī)范必須與所使用的系統(tǒng)風(fēng)格保持一致,并在同一項(xiàng)目中統(tǒng)一,比如采用UNIX的全小寫(xiě)加下劃線的風(fēng)格或大小寫(xiě)混排的方式,不要使用大小寫(xiě)與下劃線混排的方式,用作特殊標(biāo)識(shí)如標(biāo)識(shí)成員變量或全局變量的m_和g_,其后加上大小寫(xiě)混排的方式是允許的。
示例: Add_User不允許,add_user、AddUser、m_AddUser允許。
½ 3-1:除非必要,不要用數(shù)字或較奇怪的字符來(lái)定義標(biāo)識(shí)符。
示例:如下命名,使人產(chǎn)生疑惑。
#define _EXAMPLE_0_TEST_
#define _EXAMPLE_1_TEST_
void set_sls00( BYTE sls );
應(yīng)改為有意義的單詞命名
#define _EXAMPLE_UNIT_TEST_
#define _EXAMPLE_ASSERT_TEST_
void set_udt_msg_sls( BYTE sls );
½ 3-2:在同一軟件產(chǎn)品內(nèi),應(yīng)規(guī)劃好接口部分標(biāo)識(shí)符(變量、結(jié)構(gòu)、函數(shù)及常量)的命名,防止編譯、鏈接時(shí)產(chǎn)生沖突。
說(shuō)明:對(duì)接口部分的標(biāo)識(shí)符應(yīng)該有更嚴(yán)格限制,防止沖突。如可規(guī)定接口部分的變量與常量之前加上“模塊”標(biāo)識(shí)等。
½ 3-3:用正確的反義詞組命名具有互斥意義的變量或相反動(dòng)作的函數(shù)等。
說(shuō)明:下面是一些在軟件中常用的反義詞組。
add / remove begin / end create / destroy
insert / delete first / last get / release
increment / decrement put / get
add / delete lock / unlock open / close
min / max old / new start / stop
next / previous source / target show / hide
send / receive source / destination
cut / paste up / down
示例:
int min_sum;
int max_sum;
int add_user( BYTE *user_name );
int delete_user( BYTE *user_name );
½ 3-4:除了編譯開(kāi)關(guān)/頭文件等特殊應(yīng)用,應(yīng)避免使用_EXAMPLE_TEST_之類以下劃線開(kāi)始和結(jié)尾的定義。
4 可讀性
¹ 4-1:注意運(yùn)算符的優(yōu)先級(jí),并用括號(hào)明確表達(dá)式的操作順序,避免使用默認(rèn)優(yōu)先級(jí)。
說(shuō)明:防止閱讀程序時(shí)產(chǎn)生誤解,防止因默認(rèn)的優(yōu)先級(jí)與設(shè)計(jì)思想不符而導(dǎo)致程序出錯(cuò)。
示例:下列語(yǔ)句中的表達(dá)式
word = (high << 8) | low (1)
if ((a | b) && (a & c)) (2)
if ((a | b) < (c & d)) (3)
如果書(shū)寫(xiě)為
high << 8 | low
a | b && a & c
a | b < c & d
由于
high << 8 | low = ( high << 8) | low,
a | b && a & c = (a | b) && (a & c),
(1)(2)不會(huì)出錯(cuò),但語(yǔ)句不易理解;
a | b < c & d = a | (b < c) & d,(3)造成了判斷條件出錯(cuò)。
¹ 4-2:避免使用不易理解的數(shù)字,用有意義的標(biāo)識(shí)來(lái)替代。涉及物理狀態(tài)或者含有物理意義的常量,不應(yīng)直接使用數(shù)字,必須用有意義的枚舉或宏來(lái)代替。
示例:如下的程序可讀性差。
if (Trunk[index].trunk_state == 0)
{
Trunk[index].trunk_state = 1;
... // program code
}
應(yīng)改為如下形式。
#define TRUNK_IDLE 0
#define TRUNK_BUSY 1
if (Trunk[index].trunk_state == TRUNK_IDLE)
{
Trunk[index].trunk_state = TRUNK_BUSY;
... // program code
}
½ 4-1:源程序中關(guān)系較為緊密的代碼應(yīng)盡可能相鄰。
說(shuō)明:便于程序閱讀和查找。
示例:以下代碼布局不太合理。
rect.length = 10;
char_poi = str;
rect.width = 5;
若按如下形式書(shū)寫(xiě),可能更清晰一些。
rect.length = 10;
rect.width = 5; // 矩形的長(zhǎng)與寬關(guān)系較密切,放在一起。
char_poi = str;
½ 4-2:不要使用難懂的技巧性很高的語(yǔ)句,除非很有必要時(shí)。
說(shuō)明:高技巧語(yǔ)句不等于高效率的程序,實(shí)際上程序的效率關(guān)鍵在于算法。
示例:如下表達(dá)式,考慮不周就可能出問(wèn)題,也較難理解。
* stat_poi ++ += 1;
* ++ stat_poi += 1;
應(yīng)分別改為如下。
*stat_poi += 1;
stat_poi++; // 此二語(yǔ)句功能相當(dāng)于“ * stat_poi ++ += 1; ”
++ stat_poi;
*stat_poi += 1; // 此二語(yǔ)句功能相當(dāng)于“ * ++ stat_poi += 1; ”
5 變量、結(jié)構(gòu)
¹ 5-1:去掉沒(méi)必要的公共變量。
說(shuō)明:公共變量是增大模塊間耦合的原因之一,故應(yīng)減少?zèng)]必要的公共變量以降低模塊間的耦合度。
¹ 5-2:仔細(xì)定義并明確公共變量的含義、作用、取值范圍及公共變量間的關(guān)系。
說(shuō)明:在對(duì)變量聲明的同時(shí),應(yīng)對(duì)其含義、作用及取值范圍進(jìn)行注釋說(shuō)明,同時(shí)若有必要還應(yīng)說(shuō)明與其它變量的關(guān)系。
¹ 5-3:明確公共變量與操作此公共變量的函數(shù)或過(guò)程的關(guān)系,如訪問(wèn)、修改及創(chuàng)建等。
說(shuō)明:明確過(guò)程操作變量的關(guān)系后,將有利于程序的進(jìn)一步優(yōu)化、單元測(cè)試、系統(tǒng)聯(lián)調(diào)以及代碼維護(hù)等。這種關(guān)系的說(shuō)明可在注釋或文檔中描述。
示例:在源文件中,可按如下注釋形式說(shuō)明。
RELATION System_Init Input_Rec Print_Rec Stat_Score
Student Create Modify Access Access
Score Create Modify Access Access, Modify
注:RELATION為操作關(guān)系;System_Init、Input_Rec、Print_Rec、Stat_Score為四個(gè)不同的函數(shù);Student、Score為兩個(gè)全局變量;Create表示創(chuàng)建,Modify表示修改,Access表示訪問(wèn)。
其中,函數(shù)Input_Rec、Stat_Score都可修改變量Score,故此變量將引起函數(shù)間較大的耦合,并可能增加代碼測(cè)試、維護(hù)的難度。
¹ 5-4:當(dāng)向公共變量傳遞數(shù)據(jù)時(shí),要十分小心,防止賦與不合理的值或越界等現(xiàn)象發(fā)生。
說(shuō)明:對(duì)公共變量賦值時(shí),若有必要應(yīng)進(jìn)行合法性檢查,以提高代碼的可靠性、穩(wěn)定性。
¹ 5-5:防止局部變量與公共變量同名。
說(shuō)明:若使用了較好的命名規(guī)則,那么此問(wèn)題可自動(dòng)消除。
¹ 5-6:嚴(yán)禁使用未經(jīng)初始化的變量作為右值。
說(shuō)明:特別是在C/C++中引用未經(jīng)賦值的指針,經(jīng)常會(huì)引起系統(tǒng)崩潰。
½ 5-1:構(gòu)造僅有一個(gè)模塊或函數(shù)可以修改、創(chuàng)建,而其余有關(guān)模塊或函數(shù)只訪問(wèn)的公共變量,防止多個(gè)不同模塊或函數(shù)都可以修改、創(chuàng)建同一公共變量的現(xiàn)象。
說(shuō)明:降低公共變量耦合度。
½ 5-2:使用嚴(yán)格形式定義的、可移植的數(shù)據(jù)類型,盡量不要使用與具體硬件或軟件環(huán)境關(guān)系密切的變量。
說(shuō)明:使用標(biāo)準(zhǔn)的數(shù)據(jù)類型,有利于程序的移植。
示例:如下例子(在DOS下BC3.1環(huán)境中),在移植時(shí)可能產(chǎn)生問(wèn)題。
void main()
{
register int index; // 寄存器變量
_AX = 0x4000; // _AX是BC3.1提供的寄存器“偽變量”
... // program code
}
½ 5-3:結(jié)構(gòu)的功能要單一,是針對(duì)一種事務(wù)的抽象。
說(shuō)明:設(shè)計(jì)結(jié)構(gòu)時(shí)應(yīng)力爭(zhēng)使結(jié)構(gòu)代表一種現(xiàn)實(shí)事務(wù)的抽象,而不是同時(shí)代表多種。結(jié)構(gòu)中的各元素應(yīng)代表同一事務(wù)的不同側(cè)面,而不應(yīng)把描述沒(méi)有關(guān)系或關(guān)系很弱的不同事務(wù)的元素放到同一結(jié)構(gòu)中。
示例:如下結(jié)構(gòu)不太清晰、合理。
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -