




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
軟件編程規(guī)范總則
為了提高源程序的質(zhì)量和可維護(hù)性,最終提高公司軟件產(chǎn)品生產(chǎn)力,我們必要對公司軟件
產(chǎn)品的源程序的編寫風(fēng)格作出統(tǒng)一的規(guī)范約束。
本規(guī)范總則是獨(dú)立具體語言的編程規(guī)則的總的原則,針對不同編程語言或應(yīng)用環(huán)境的編程
規(guī)范在遵守本規(guī)范總則的基礎(chǔ)上,還必須遵守相應(yīng)語言和就用環(huán)境的編程規(guī)范。本規(guī)范總則適
用于公司所有產(chǎn)品以及對外合作委托開發(fā)產(chǎn)品的軟件源程序。
本規(guī)范總則的內(nèi)容包括:排版、注釋、標(biāo)識(shí)符命名、變量使用、代碼可測性、程序效率、
質(zhì)量保證、代碼編譯、單元測試、程序版本與維護(hù)等。
本規(guī)范總則的示例都以C語言為背景,采用以下的術(shù)語描述:
>規(guī)則:編程時(shí)強(qiáng)制必須遵守的原則。
>建議:編程時(shí)必須加以考慮的原則。
>說明:對此規(guī)則或建議進(jìn)行必要的解釋。
>示例:對此規(guī)則或建議從正、反兩個(gè)方面給出例子。
1排版
規(guī)則1-1:程序塊要采用縮進(jìn)風(fēng)格編寫,縮進(jìn)的空格數(shù)為4個(gè)。
說明:對于由開發(fā)工具自動(dòng)生成的代碼可以有不一致。
規(guī)則1-2:相對獨(dú)立的程序塊之間、變量說明之后必須加空行。
示例:如下例子不符合規(guī)范
if(!valid_ni(ni))
(
...//programcode
)
repssn_ind=ssn_data[index].repssn_index;
repssn_ni=ssn_data[index].ni;
應(yīng)如下書寫
if(!valid_ni(ni))
...//programcode
repssn_ind=ssn_data[index].repssn_index;
repssn_ni=ssn_data[index].ni;
規(guī)則1-3:較長的語句080字符)要分成多行書寫,長表達(dá)式要在低優(yōu)先級(jí)操作符處劃分新
行,操作符放在新行之首,劃分出的新行要進(jìn)行適當(dāng)?shù)目s進(jìn),使排版整齊,語句可讀。
示例:
perm_count_msg.head.len=N07_T0_STAT_C0UNT_LEN
+STAT_SIZE_FRAM*sizeof(_UL);
act_task_table[frameJd*STAT_TASK_CHECK_NUMBER+index].occupied
=stat_poi[index].occupied;
act_task_table[taskno].duration_true_or_false
=SYS_get_sccp_statistic_state(stat_item);
report_or_not_flag=((taskno<MAX_ACT_TASK_NUMBER)
&&(n7statjtem_valid(stat_item))
&&(act_task_table[taskno].result_data!=0));
規(guī)則1-4:循環(huán)、判斷等語句中若有較長的表達(dá)式或語句,則要進(jìn)行適應(yīng)的劃分,長表達(dá)式要
在低優(yōu)先級(jí)操作符處劃分新行,操作符放在新行之首。
示例:
if((taskno<max_act_task_number)
&&(n7stat_stat_item_valid(statjtem)))
for(l=0,j=0;(l<BufterKeyword[word_index].word_length)
&&(j<NewKeyword.word_length);l++,j++)
(
...//programcode
}
for(l=0,j=0;
(kfirst_word_length)&&(j<second_wordjength);
I++J++)
...//programcode
)
規(guī)則1-5:若函數(shù)或過程中的參數(shù)較長,則要進(jìn)行適當(dāng)劃分。
示例:
n7stat_str_compare((BYTE*)&stat_object,
(BYTE*)&(act_task_table[taskno].stat_object),
sizeofCSTAT_BOJECT));
n7stat_flash_act_duration(stat_item,frame_id*
STAT_TASK_CHECK_NUMBER
+index,stat_object);
規(guī)則1-6:不允許把多個(gè)短語句寫在一行中,即一行只寫一條語句。
示例:如下例子不符合規(guī)范。
Rect.length=O;rect.width=O;
應(yīng)如下書寫
Rect.length=O;
Rect.width=O;
規(guī)則1-7:if、while、for、defaultsdo等語句自占一行。
示例:如下例子不符合規(guī)范。
if(pUserCR==NULL)return;
應(yīng)如下書寫
if(pUserCR==NULL)
return;
規(guī)則卜8:只用空格鍵,不要使用TAB鍵。
說明:以免用不同的編輯器閱讀程序時(shí),因TAB鍵所設(shè)置的空格數(shù)目不同而造成程序布局不整
齊,不要使用BC作為編輯器合版本,因?yàn)锽C會(huì)自動(dòng)將8個(gè)空格變?yōu)橐粋€(gè)TAB鍵,因此使用
BC合入的版本大多會(huì)將縮進(jìn)變亂。
規(guī)則1-9:函數(shù)或過程的開始、結(jié)構(gòu)的定義及循環(huán)、判斷等語句中的代碼都要采用縮進(jìn)風(fēng)格,
case語句下的情況處理語句也要遵從語句縮進(jìn)要求。
規(guī)則1-10:程序塊的分界符(如C/C++語言的大括號(hào),{號(hào)『}')應(yīng)各獨(dú)占一行國上并且位于同
一列,同時(shí)與引用它們的語句左對齊。在函數(shù)體的開始、類的定義、結(jié)構(gòu)的定義、枚舉的定義
以及if、for、do、while、switch、case語句中的程序都要采用如上的縮進(jìn)方式。
示例:如下例子不符合規(guī)范。
for(…){
...//programcode
)
if(…)
{
...//programcode
)
應(yīng)如下書寫
for(...)
(
...IIprogramcode
}
if(…)
(
...//programcode
)
voidexample_fun(void)
(
...//programcode
)
規(guī)則1-11:在兩個(gè)以上的關(guān)鍵字、變量、常量、進(jìn)行對等操作時(shí),它們之間的操作符之前、之
后或者前后要加空格;進(jìn)行非對等操作時(shí),如果是關(guān)系密切的立即操作符(如一>),后不應(yīng)
加空格。
說明:采用這種松散方式編寫代碼的目的是使代碼更加清晰。
由于留空格所產(chǎn)生的清晰性是相對的,所以,在已非常清晰的語句中沒有必要再留空格,如括
號(hào)內(nèi)側(cè)(左括號(hào)后面和右括號(hào)前面)不要加空格,多重括號(hào)間不必加空格,因?yàn)樵贑/C++語言
中括號(hào)已經(jīng)是最清晰的標(biāo)志了。
在長語句中,如果需要加的空格非常多,那么應(yīng)該保持整體清晰,而在局部不加空格。給操作
符留空格時(shí)不耍連續(xù)留兩個(gè)以上空格。
示例:
(1)逗號(hào)、分號(hào)只在后面加空格
inta,b,c;
(2)比較操作符,賦值操作符“="、"+=”,算術(shù)操作符"+”、“%”邏輯操作符
“&&”、“&”,位操作符“<<"、等雙目操作符的前后加空格
if(current_time>=MAX_TIME_VALUE)
a=b+c;
a*=2;
a=bA2;
(3)“!”、、“++”、“&”(地址運(yùn)算符)等單目操作前后不加空格
*p=a';//內(nèi)容操作與內(nèi)容之間
flag=!isEmpty;//非操作"!”與內(nèi)容之間
p=&mem;//地址操作符“&”與內(nèi)容之間
1++;//“++”,“一”與內(nèi)容之間
(4)前后不加空格
p->id=pid;//指針前后不加空格
⑸if、for、while、switch等與后面的括號(hào)間應(yīng)加空格,使if等關(guān)鍵字更為突
出、明顯。
if(a\>=b&&c>d)
建議1-L一行程序以小于80字符為宜,不要寫得過長。
建議1-2:不同類型的操作符混合使用時(shí),即時(shí)實(shí)現(xiàn)優(yōu)先級(jí)與實(shí)際需要相符,最好也使用括號(hào)
隔離之,以便代碼更加清晰。
示例:
如本來是正確的代碼:
if(year%4==0IIyear%100!=0&&year%400==0)
如果加上括號(hào),則更清晰。
If((year%4)==0II(year%100)!=0&&(year%400)==0)
2、注釋
規(guī)則2-1:一般情況下,源程序有效注釋量必須在20%以上。
說明:注釋的原則是有助于程序的閱讀理解,在該加的地方都加了,注釋不宜太多也不能太
少,注釋語言必須準(zhǔn)確、易懂、簡潔。
規(guī)則2-2:說明性文件(如頭文件.h文件、.inc文件、編譯說明文件。cfg等)頭部應(yīng)進(jìn)行注
釋,注釋必須列出:版權(quán)說明、版本、生成日期、作者、內(nèi)容、功能、與其它文件的關(guān)系、修
改日志等,頭文件的注釋中還應(yīng)有函數(shù)功能簡要說明。
示例:下面這段頭文件的頭注釋比較標(biāo)準(zhǔn),當(dāng)然,并不局限于此格式,但上述信息
建議要包含在內(nèi)。
*************************
Copyright?,1988-1999,HuaweiTech.Co.,Ltd
Filename力文件名
Author:Version:Date:〃作者、版本及完成日期
Description://用于詳細(xì)說明此程序文件完成的主要功能,與其他模塊或函數(shù)的接口,輸
//出值、取值范圍、含義及參數(shù)間的控制、順序、獨(dú)立或依賴等關(guān)系
Others:〃其它內(nèi)容說明
FunctionList://主要函數(shù)列表,每條記錄應(yīng)包括函數(shù)名及功能簡要說明
History://修改歷史記錄列表,每條修改記錄應(yīng)包括修改日期、修改者及修改內(nèi)容簡述
I.Date:
Author:
Modification
2....
TH**********************************************/
規(guī)則2-3:源文件頭部應(yīng)進(jìn)行注釋,列出:版權(quán)說明、版本號(hào)、生成日期、作者、模塊目的/功
能、主要函數(shù)及其功能、修改日志等。
示例:下面這段源文件的頭注釋比較標(biāo)準(zhǔn),當(dāng)然,并不局限于此格式,但上述信息
建議要包含在內(nèi)。
/*************************************************
Copyright?,1988-1999,HuaweiTech.Co.,Ltd.
FileName:test.cpp
Author:Version:Date:
Description://模塊描述
Version://版本信息
FunctionList://主要函數(shù)及其功能
1.-------
HistoryJ/歷史修改記錄
<author><time><version><desc>
David96/10/121.0buildthismoudle
***********************************************
說明:Description一項(xiàng)描述本文件的內(nèi)容、功能、內(nèi)部各部分之間的關(guān)系及本文件
與其它文件等。History是修改歷史記錄列表,每條修改記錄應(yīng)包括修改日期、修
改者及修改內(nèi)容簡述。
規(guī)則2-4:函數(shù)頭部應(yīng)進(jìn)行注釋,列出:函數(shù)的目的/功能、輸入?yún)?shù)、輸出參數(shù)、返回值、
調(diào)用關(guān)系(函數(shù)、表)等。
示例:下面這段函數(shù)的注釋比較標(biāo)準(zhǔn),當(dāng)然,并不局限于此格式,但上述信息建議包含在內(nèi)。
/*************************************************
Function://函數(shù)名稱
Description://函數(shù)功能、性能等的描述
Calls://數(shù)調(diào)用的函數(shù)清單
CallsedBy://調(diào)用本函數(shù)的函數(shù)清單
TableAccessed://被訪問的表(此項(xiàng)僅對于牽扯到數(shù)據(jù)庫操作的程序)
TableUpdated://被修改的表(此項(xiàng)僅對于牽扯到數(shù)據(jù)庫操作的程序)
Input://輸入?yún)?shù)說明,包括每個(gè)參數(shù)的作
用、取值說明及參數(shù)間關(guān)系
Output//對輸出參數(shù)的說明。
Return:〃函數(shù)返回值的說明
Others:〃其它說明
*************************************************I
規(guī)則2-5:邊寫代碼邊注釋,修改代碼同時(shí)修改相應(yīng)的注釋,以保證注釋與代碼的一致性。不
再有用的注釋要?jiǎng)h除。
規(guī)則2-6:注釋的內(nèi)容要清楚、明了、含義準(zhǔn)確,防止注釋二義性。
說明:錯(cuò)誤的注釋不但無益反而有害。
規(guī)則2-7:避免在注釋中使用縮寫,特別是非常用縮寫。
說明:在使用縮寫時(shí)或之前,應(yīng)對縮寫進(jìn)行必要說明。
規(guī)則2-8:注釋應(yīng)與其描述的代碼相近,對代碼的注釋應(yīng)放在其上方或右方(對單條語句的注
釋)相鄰位置,不可放在下面,如放于上方則需與其上面的代碼用空行隔開。
示例:如下例子不符合規(guī)范。
例1:
/*getreplicatesubsystemindexandnetindicator*/
repssn_ind=ssndata[index].repssn_\n6ex;
repssn_ni=ssn_data[index].ni;
例2
repssn_ind=ssn_data[index].repssn_index;
/*getreplicatesubsystemindexandnetindicator*/
應(yīng)如下書寫
/*getreplicatesubsystemindexandnetindicator*/
repssn_ind=ssn_data[index].repssn_index;
repssn_ni=ssn_data[index].ni
規(guī)則2-9:對于所有有物理含義的變量、常量,如果其命名不是充分自注釋的,在聲明時(shí)都必
須加以注釋,說明其物理含義。變量、常量、宏的注釋就放在其上方相鄰位置或右方。
示例:
/*activestatistictasknumber*/
#defineMAX_ACT_TASK_NUMBER1000
#defineMAX_ACT_TASK_NUMBER1000/*activestatistictasknumber*/
規(guī)則2-10:數(shù)據(jù)結(jié)構(gòu)聲明(包括數(shù)組、結(jié)構(gòu)、類、枚舉等),如果其命名不是充分自注釋
的,必須加以注釋。對數(shù)據(jù)結(jié)構(gòu)的注釋應(yīng)放在其上方相鄰位置,不可放在下面;對結(jié)構(gòu)中的每
個(gè)域的注釋放在此域的右方。
示例:可按如下形式說明枚舉/數(shù)據(jù)/聯(lián)合結(jié)構(gòu)。
/*sccpinterfacewithseepuserprimitivemessagename*/
enumSCCP_USER_PRIMITIVE
(
N_UNITDATA_IND,/*sccpnotifyseepuserunitdatecome*/
N_UNITDATA_IND,/*sccpnotifyusertheN0.7networkcannot*/
^transmissionthismessage*/
N_UNITDATA_REQ,/*sccpuser'sunitdatatransmissionrequest*/
};
規(guī)則2-11:全局變量要有較詳細(xì)的注釋,包括對其功能、取值范圍、哪些函數(shù)或過程存取它以
及存取時(shí)注意事項(xiàng)等說明。
示例:
/*TheErrorCodewhenSCCPtranslate*/
/*GlobalTitlefanilure,asfollows*///變量作用、含義
/*0-SUCCESS1-GTTableerror*/
1*2—GTerrorOthers—nouse*/〃變量取值范圍
/*onlyfunctionSCCPTranslate()in*/
/*thismodualcanmodifyit,andother*/
/*modulecanvisititthroughcall*//
/*thefunctionGetGTTransErrorCode。*/〃使用方法
BYTEg_GTTranErrorCode
規(guī)則2-12:注釋與所描述內(nèi)容進(jìn)行同樣的縮排
說明:可使程序排版整齊,并方便注釋的閱讀與理解。
示例:如下例子,排版不整齊,閱讀稍感不方便。
Voidexamplejun(void)
(
/*codeonecomments*/
CodeBlockOne
/*codetwocomments8*/
CodeBlockTwo
}
應(yīng)改為如下布局。
voidexamplejun(void)
(
/*codeonecomments*/
CodeblockOne
/*codetwocomments*/
CodeBlockTwo
)
規(guī)則2-13:將注釋與其上面的代碼用空行隔開
示例:如下例子,顯得代碼過于緊湊。
/*codeonecomments*/
programcodeone
/*codetwocomments*/
programcodetwo
應(yīng)如下書寫
/*codeonecomments*/
programcodeone
/*codetwocomments*/
programcodetwo
規(guī)則2-14:對變量的定義和分支語句(條件分支、循環(huán)語句等)必須編寫注釋。
說明:這些語句往往是程序?qū)崿F(xiàn)某一特定功能的關(guān)鍵,對于維護(hù)人員來說,良
好的注釋幫助更好的理解程序,有時(shí)甚至優(yōu)于看設(shè)計(jì)文檔。
規(guī)則2-15:對于switch語句下的case語句,如果因?yàn)樘厥馇闆r需要處理完一個(gè)case后進(jìn)入下
一個(gè)case處理,必須在該case語句處理完、下一個(gè)case語句前加上明確的注釋。
說明:這樣比較清楚程序編寫者的意圖,有效防止無故遺漏break語句。
示例(注意斜體加粗部分):
caseCMD_UP:
ProcessUpO;
break;
caseCMD_DWON:
ProcessDown();
break;
caseCMD_FWD
ProcessFwd();
break;
if(…)
break;
)
else
(
ProcessCFW_B();
//nowjumpintocaseCMD_A
)
caseCMD_A:
processA();
break;
caseCMD_B:
processB();
break;
caseCMD_C:
processCQ;
break;
caseCMD_D:
processD();
break;
建議27:避免在一行代碼或表達(dá)式的中間插入注釋。
說明:除非必要,不應(yīng)在代碼或表達(dá)中間插入注釋,否則容易使代碼可理解性
變差。
建議2-2:通過對函數(shù)或過程、變量、結(jié)構(gòu)等正確的命名以及合理地組織代碼的結(jié)
構(gòu),使代碼成為自注釋的。
說明:清晰準(zhǔn)確的函數(shù)、變量等的命名,可增加代碼可讀性,并減少不必要的
注釋。
建議23在代碼的功能、意圖層次上進(jìn)行注釋,提供有用、額外的信息。
說明:注釋的目的是解釋代碼的目的、功能和采用方法,提供代碼以外的信
息、,幫助讀者理解代碼,防止沒必要的重復(fù)注釋信息。
示例:如下注釋意義不大。
/*ifreceivejlagisTRUE*/
if(receivejlag)
而如下的注釋則給出了額外的有用的信息。
/*ifmtpreceiveamessagefromlinks*/
if(receivejlag)
建議2-4:在程序塊的結(jié)束行右方加注釋標(biāo)記,以表明某程序的結(jié)束。
說明:當(dāng)代碼段較長,特別是多重嵌套時(shí),這樣做可以使代碼更清晰,更便于
閱讀。
示例:參見如下例子。
(
IIprogramcode
while(index<MAX<INDEX)指明該條while語句結(jié)束
(
IIprogramcode
}/*endofif(...)*///指明是哪條if語句結(jié)束
建議2-5:注釋格式盡量統(tǒng)一,建議使用.....*/"
建議2-6:注釋應(yīng)考慮程序易讀及外觀排版的因素,使用的語言若是中、英兼有
的,建議多使用中文,除非能用非常流利準(zhǔn)確的英文表達(dá)。
說明:注釋語言不統(tǒng)一,影響程序易讀性和外觀排版,出于對維護(hù)人員的考
慮,建議使用中文。
3、標(biāo)識(shí)符命名
規(guī)則3-1:標(biāo)識(shí)符的命名要清晰、明了,有明確含義,同時(shí)使用完整的單詞或大家基本可以理
解的縮寫,避免使人產(chǎn)生誤解。
說明:較短的單詞可通過去掉“元音”形成縮寫;較長的單詞可取單詞的頭幾
個(gè)字母形成縮寫;一些單詞有大家公認(rèn)的縮寫。
示例:如下單詞的縮寫能夠被大家基本認(rèn)可。
temp可縮寫為tmp;
flag可縮寫為fig;
Statistic可縮寫為stat;
Increment可縮寫inc;
Message可縮寫msg;
規(guī)則3-2:命名中若使用特殊約定或縮寫,則要有注釋說明。
說明:應(yīng)該在源文件的開始之處,對文件中所使用的縮寫或約定,特別是特殊
的縮寫,進(jìn)行必要的注釋說明。
規(guī)則3-3:自己特有的命名風(fēng)格,要自始至終保持一致,不可來回變化。
說明:個(gè)人的命名風(fēng)格,在符合所在項(xiàng)目組或產(chǎn)品組的命名規(guī)則的前提下,才
可使用。(即命名規(guī)則中沒有規(guī)定到的地方才可有個(gè)人命名風(fēng)格)。
規(guī)則3-4:對于變量命名,禁止類型等,(如I、j、k...)建議除了要有具體含義外,還能表明
其變量類型、數(shù)據(jù)類型等,但I(xiàn)、j、k作局部循環(huán)變量是允許的。
說明:變量,尤其是局部變量,如果用單個(gè)字符表示,很容易敲錯(cuò)(如寫成
j),而編譯時(shí)又檢查不出來,有可能為了這個(gè)小小的錯(cuò)誤而花費(fèi)大量的查錯(cuò)時(shí)
間。
示例:下面所示的局部變量名義方法可以借鑒。
Intliv_width
其變量名解釋如下:
I局部變量(Local)(其它:g全局變更(Global)...)
i數(shù)據(jù)類型(Interger)
v變量(Variable)(其它:c常量(Const)...)
這樣可以防止局部變量與全局變量重名
規(guī)則3-5:命名規(guī)范必須與所使用的系統(tǒng)風(fēng)格保持一致,并在同一項(xiàng)目中統(tǒng)一,比如采用UNIX
的全小寫加下劃線的風(fēng)格或大小寫混排的方式,不要使用大小寫與下劃線混排的方式。
示例:如Add_User就不如add_user或AddUser好。
建議3-1:除非必要,不要用數(shù)字或較奇怪的字符來定義標(biāo)識(shí)符。
示例:如下命名,使人產(chǎn)生疑惑。
#defineEXAMPLE0TEST
#define_EXAMPLE_1_TEST_
voidset_slsOO(BYTEsis);
應(yīng)改為有意義的單詞命名
#define_EXAMPLE_UNIT_TEST_
#define_EXAMPLE_ASSERT_TEST_
voidset_udt_msg_sls(BYTEsis);
建議3-2:在同一軟件產(chǎn)品內(nèi),應(yīng)規(guī)劃好接口部分標(biāo)識(shí)符(變量、結(jié)構(gòu)、函數(shù)及常
量)的命名,防止編譯、鏈接時(shí)產(chǎn)生沖突。
說明:對接口部分的標(biāo)識(shí)符應(yīng)該有更嚴(yán)格限制,防止沖突。如可規(guī)定接口部分
的變量與常量之前加上“模塊”標(biāo)識(shí)等。
建議3-3:用正確的反義詞組名具有互斥意義的變量或相反動(dòng)作的函數(shù)等。
說明:下面是一些在軟件中常用的反義詞組。
add/removebegin/endcreate/destroyinsert/delete
first/lastget/releaseincrement/decrementput/get
add/deletelock/unlockopen/closemin/max
old/newstart/stopnext/previoussource/target
show/hidesend/receivesource/destinationcut/paste
up/down
示例
intmin_sum;
intmax_sum;
intadd_user(BYTE*user_name);
intdelete_user(BYTE*user_name_;
建議3-4:除了編譯開關(guān)/頭文件等特殊應(yīng)用,應(yīng)避免發(fā)電EXAMPLE_TEST_之類
以下劃線開始和結(jié)尾的定義。
4可讀性
規(guī)則4-1:注意運(yùn)算符的優(yōu)先級(jí),并用括號(hào)明確表達(dá)式的操作順序,避免使用默認(rèn)優(yōu)先級(jí)。
說明:防止閱讀程序時(shí)產(chǎn)生誤解,防止因默認(rèn)的優(yōu)先級(jí)與設(shè)計(jì)思想不符而導(dǎo)致
程序出錯(cuò)。
示例:為表示如下意圖的正確表達(dá)式(1)、(2)。
word=high?(8+low);//(1)
if((a|b)&&(a&c))//(2)
作如下書寫,不僅不易理解,而且容易引起錯(cuò)誤。
word=high?8+low;//結(jié)果同(1),但不如(1)直觀及易于理解。
if(a|b&&c)//a|b&&a&c實(shí)際等價(jià)于a|(b&&a)&c,與(2)要求的結(jié)果完全
不同。
規(guī)則4-2:避免使用不易理解的數(shù)字,用有意義的標(biāo)識(shí)來替代。涉及物理狀態(tài)或者含有物理意
義的常量,不應(yīng)直接使用數(shù)字,必須用有意義的枚舉或宏來代替。
示例:如下的程序可讀性差。
lf(Trunk[index].trunk_state==O)
(
Trunk[index].trunk_state=1
...//programcode
}
應(yīng)改為如下形式。
#defineTRUNK_1IDLE0
#defineTRUNK_BUSY1
if(Trunk[index].trunk_state==TRUNK_IDLE)
(
Trunk[index].trunk_state==TRUNK_BUSY
...//programcode
}
建議4-1:源程序中關(guān)系較為緊密的代碼應(yīng)盡可能相鄰。
說明:便于程序閱讀和查找。
示例:以下代碼布局不太合理。
rect.length=10;
char_poi=str;
rect.width=5;
若按如下形式書寫,可能更清晰一些。
rect.length=10;
rect.width=5;//矩形的長與寬關(guān)系較密切,放在一起。
char_poi=str;
建議4-2:不要使用難懂的技巧性很高的語句,除非很有必要時(shí)。
說明:高技巧語句不等于高效率的程序,實(shí)際上程序的效率關(guān)鍵在于算法
示例:如下表達(dá)式,考慮不周就可能出問題,也較難理解。
*stat_poi+++=1;
*++stat_poi+=1;
應(yīng)分別改為如下。
*stat_poi+=1;
stat_poi++;〃此二語句功能相當(dāng)于"*stat_poi+++=1”
++stat_poi;
*stat_poi+=1;//此二語句功能相當(dāng)于"*++stat_poi+=1”
5變量
規(guī)則5-1:去掉沒必要的公共變量。
說明:公共變量是增大模塊間耦合的原因之一,故應(yīng)減少?zèng)]必要的公共變量
以降低模塊間的耦合度。
規(guī)則5-2:仔細(xì)定義并明確公共變量的含義、作用、取值范圍及公共變量間的關(guān)系。
說明:在對變量聲明的同時(shí),應(yīng)對其含義、作用、及取值范圍進(jìn)行注釋說
明,同時(shí)若有必要還應(yīng)說明與其它變量的關(guān)系。
規(guī)則5-3:明確公共變量與操作此公共變量的函數(shù)或過程的關(guān)系,如訪問、修改及創(chuàng)建等。
說明:明確過程操作變量的關(guān)系后,將有利于程序的進(jìn)一步優(yōu)化、單元測
試、系統(tǒng)聯(lián)調(diào)以及代碼維護(hù)等。這種關(guān)系的說明可在注釋或文檔中描述。
RELATIONSystemjnitlnput_RecPrint_RecStat_Score
StudentCreateModifyAccessAccess
ScoreCreateModifyAccessAccess,Modify
注:RELATION為操作關(guān)系;Systemjnitlnput_Rec、Print._Rec、Stat_Score
為四個(gè)不同的函數(shù);Student、Score為兩個(gè)全局變量;Create表示創(chuàng)建,
Modfy表示修改、Access表示訪問。
其中,函數(shù)lnput_Rec、Stat_Score都可修改變量Score,故此變量將引起函
數(shù)間較大的耦合,并可能增加代碼測試、維護(hù)的難度。
規(guī)則5-4:當(dāng)向公共變量傳遞數(shù)據(jù)時(shí),要十分小心,防止賦與不合理的值或越界等現(xiàn)象發(fā)生。
說明:對公共變量賦值時(shí),若有必要應(yīng)進(jìn)行合法性檢查,以提高代碼的可靠
性、穩(wěn)定性。
規(guī)則5-5:防止局部變量與公共變量同名。
說明:若使用了較好的命名規(guī)則,那么此問題可自動(dòng)消除。
規(guī)則5-6:嚴(yán)禁使用未經(jīng)初始化的變更作為估值。
說明:特別是在C/C++中引用未經(jīng)賦值的指針,經(jīng)常會(huì)引起系統(tǒng)崩潰。
建議5-1:構(gòu)造僅有一個(gè)模塊或函數(shù)可以修改、創(chuàng)建,而其余有關(guān)模塊或函數(shù)只訪
問的公共變量,防止多個(gè)不同模塊或函數(shù)都可以修改、創(chuàng)建同一公共變量的現(xiàn)象。
說明:降低公共變量耦合度。
建議5-2:使用嚴(yán)格形式定義的,可移植的數(shù)據(jù)類型,盡量不要使用與具體硬件或
軟件環(huán)境關(guān)系密切的變量。
說明:使用標(biāo)準(zhǔn)的數(shù)據(jù)類型,有利于程序的移植。
示例:如下例子(在DOS下BC3.1環(huán)境中),移植時(shí)可能產(chǎn)生問題。
Voidmain()
(
registerintindex;//寄存器變量
_AX=0x4000;//_Ax是BC3.1提供的寄存器“偽變量”
//programcode
)
建議53結(jié)構(gòu)的功能要單一,是針對一種事務(wù)的抽象。
說明:設(shè)計(jì)結(jié)構(gòu)時(shí)應(yīng)力爭使結(jié)構(gòu)代表一種現(xiàn)實(shí)事務(wù)的抽象,而不是同時(shí)代表
多種。結(jié)構(gòu)中的各元素應(yīng)代表同一事務(wù)的不同側(cè)面,而不應(yīng)把描述沒關(guān)系或
關(guān)系很弱的不同事務(wù)的元素放到同一結(jié)構(gòu)中。
示例:如下結(jié)構(gòu)不太清晰、合理
typedefstructSTUDENT_STRU
unsignedcharname[8];/*studenfsname*/
unsignedcharage;/*studenfsage*/
unsignedcharsex;/*studenfssex,asfollows*/
/*0-FEMALE;1-MALE*/
unsignedchar
teacher_name[8];/*thestudentteacher'sname*/
unsignedchar
teacher_sex;/*histeachersex*/
}STUDENT;
若改為如下,可能會(huì)更合理些。
typedefstructTEACHER_STRU
(
unsignedcharname[8];/*teachername*/
unsignedcharsex;/*teachersex,asfollows*/
/*0-FEMALE;1-MALE*/
JTEACHER;
typedefstructSTUDENT_STRU
(
unsignedcharname[8];/*studenfsname*/
unsignedcharage/student'sage*/
unsignedcharsex;/*studenfssex,asfollows*/
/*0-FEMALE;1-MALE*/
unsignedintteacher_ind;/*histeacherindex*/
JSTUDENT;
建議54不要設(shè)計(jì)面面俱到、非常靈活的數(shù)據(jù)結(jié)構(gòu)。
說明:面面俱到、靈活的數(shù)據(jù)結(jié)構(gòu)反而容易引起誤解和操作困難。
建議55不同結(jié)構(gòu)間的關(guān)系不要過于復(fù)雜。
說明:若兩個(gè)結(jié)構(gòu)間關(guān)系較復(fù)雜、密切,那么應(yīng)合為一個(gè)結(jié)構(gòu)。
示例:如下兩個(gè)結(jié)構(gòu)的構(gòu)造不合理。
typedefstructPERSON_ONE_STRU
unsignedcharname[8];
unsignedcharaddr[40];
unsignedcharsex;
unsignedcharcity[15];
}PERSON_ONE;
typedefstructPERSON_TWO_STRU
(
unsignedcharname[8];
unsignedcharage;
unsignedchartel;
}PERSON_TWO;
由于兩個(gè)結(jié)構(gòu)都是描述同一事物的,那么不如合成一個(gè)結(jié)構(gòu)。
typedefstructPERSON_STRU
(
unsignedcharname[8];
unsignedcharage;
unsignedcharsex;
unsignedcharaddr[40];
unsignedcharcity[15];
unsignedchartel;
JPERSON;
建議5-6:結(jié)構(gòu)中元素的個(gè)數(shù)應(yīng)適中。若結(jié)構(gòu)中元素個(gè)數(shù)過多可考慮依據(jù)某種原則
把元素組成不同的子結(jié)構(gòu),以減少原結(jié)構(gòu)中元素的個(gè)數(shù)。
說明:增加結(jié)構(gòu)的可理解性、可操作性和可維護(hù)性。
示例:假如認(rèn)為如上的一PERSON結(jié)構(gòu)元素過多,那么可如下對之劃分。
typedefstructPERSON,BASEJNFO_STRU
unsignedcharname[8];
unsignedcharage;
unsignedcharsex;
}PERSON_BASE_INFO;
typedefstructPERSON_ADDRESS_STRU
(
unsignedcharaddr[40];
unsignedcharcity[15];
unsignedchartel;
}PERSON_ADDRESS;
typedefstructPERSON_STRU
(
PERSON_BASE_INFOperson_base;
PERSON_ADDRESSperson_addr;;
JPERSON;
建議5-7:仔細(xì)設(shè)計(jì)結(jié)構(gòu)中元素的布局與排列順序,使結(jié)構(gòu)容易理解、節(jié)省占用
箸,并減少引起誤用現(xiàn)象。
說明:合理排列結(jié)構(gòu)中元素順序,可節(jié)省空間并增加可理解性。
示例:如下結(jié)構(gòu)中的位域排列,將占較大空間,可讀性也稍差。
TypedefstructEXAMPLE_STRU
(
unsignedintvalid:1;
PERSONperson;
Unsignedint_flg:1;
JEXAMPLE;
若改成如下形式,不僅可節(jié)省1字節(jié)空間,可讀性也變好了。
typedefstructEXAMPLE_STRU
unsignedintvalid:1;
unsignedintsetjig:1;
PERSONperson;
JEXAMPLE;
建議5-8:結(jié)構(gòu)的設(shè)計(jì)要盡量考慮向前兼容和以后的版本升級(jí),并為某些未來可能
的應(yīng)用保留余地(如預(yù)留一些空間等。)
說明:軟件向前兼容的特性,是軟件產(chǎn)品是否成功的重要標(biāo)志之一。如
果要想使產(chǎn)品具有較了的前向兼容,那么在產(chǎn)品設(shè)計(jì)之初就應(yīng)為以后版
本升級(jí)保留一定余地,并且在產(chǎn)品升級(jí)時(shí)必須考慮前一版本的各種特
性。
建議5-9:留心具體語言及編譯器處理不同數(shù)據(jù)類型的原則及有關(guān)細(xì)節(jié)。
說明:在如C語言中,static局部變量將在內(nèi)存“數(shù)據(jù)區(qū)”中生成,而非
static局部變量將在“堆?!敝猩?。這些細(xì)節(jié)對程序質(zhì)量的保證非常重
要。
建議5-10:編程時(shí),要注意數(shù)據(jù)類型的強(qiáng)制轉(zhuǎn)換。
說明:當(dāng)進(jìn)行數(shù)據(jù)類型強(qiáng)制轉(zhuǎn)換時(shí),其數(shù)據(jù)的意義、轉(zhuǎn)換后的取值等都
可能發(fā)生變化,而這些細(xì)節(jié)若考慮不周,就很有可能留下隱患。
建議5-11:對編譯系統(tǒng)默認(rèn)的數(shù)據(jù)類型轉(zhuǎn)換,也要有充分的認(rèn)識(shí)。
示例:如下賦值,多數(shù)編譯器不產(chǎn)生告警,但值的含義還是稍有變化。
charchr;
unsignedshortintexam;
chr=-1
exam=chr;//編譯器不產(chǎn)生告警,此時(shí)exam為OxFFFF
建議5-12:盡量減少?zèng)]有必要的數(shù)據(jù)類型默認(rèn)轉(zhuǎn)換與強(qiáng)制轉(zhuǎn)換。
建議5/3:合理地設(shè)計(jì)數(shù)據(jù)并使用自定義數(shù)據(jù)類型,避免數(shù)據(jù)間進(jìn)行不必要的類型
轉(zhuǎn)換。
建議5-14:對自定義數(shù)據(jù)類型進(jìn)行恰當(dāng)命名,使它成為自描述性的,以提高代碼可
讀性。注意其命名方式在同一產(chǎn)品中的統(tǒng)一。
說明:使用自定義類型,可以彌補(bǔ)編程語言提供類型少、信息量不足的
缺點(diǎn),并能使程序清晰、簡潔。
示例:可參考如下方式聲明自定義數(shù)據(jù)類型。
下面的聲明可使數(shù)據(jù)類型的使用簡潔、明了。
typedefunsignedcharBYTE;
typedefunsignedshortWORD;
typedefunsignedintDWORD;
下面的聲明可使數(shù)據(jù)類型具有更豐富的含義。
typedeffloatDISTANCE;
typedeffloatSCORE;
建議5-15:當(dāng)聲明用于分布式環(huán)境或不同CPU間通信環(huán)境的數(shù)據(jù)結(jié)構(gòu)時(shí),必須考
慮機(jī)器的字節(jié)順序、使用的位域及字節(jié)對齊等問題。
說明:比如IntelCPU與68360CPU,在處理位域及整數(shù)時(shí),其內(nèi)存存放的
“順序”,正好相反。
示例:假如有如下短整數(shù)及結(jié)構(gòu)。
unsignedshortintexam;
typedefstructEXAM_BIT_STRU
{/Intel68360*/
unsignedintA1:1;/*bit07*/
unsignedintA2:1;/*bit16*/
unsignedintA3:1;/*bit25*/
}EXAM_BIT
如下是IntelCPU生成短整數(shù)及位域的方式。
內(nèi)存:012…(從低到高,以字節(jié)為單位)
examexam低字節(jié)exam高字節(jié)
內(nèi)存:Obit1bit2bit...(字節(jié)的各“位”)
EXAMBITA1A2A3
如下是68360CPU生成短整數(shù)及位域的方式。
內(nèi)存:012…(從低到高。以字節(jié)為單位)
examexam高字節(jié)exam低字節(jié)
內(nèi)存:7bit6bit5bit...(字節(jié)的各“位”)
EXAM_BITA1A2A3
說明:在對齊方式下,CPU的運(yùn)行效率要快得多。
示例:如下圖,當(dāng)一個(gè)long型數(shù)(如圖中l(wèi)ong1!)在內(nèi)存中的位置正好與
內(nèi)存的字邊界對齊時(shí),CPU存取這個(gè)數(shù)只需訪問一次內(nèi)存,而當(dāng)一個(gè)
long型數(shù)(如圖中的Iong2)在內(nèi)存中的位置跨越了字邊界時(shí),CPU存取
這個(gè)數(shù)就需要多次訪問內(nèi)存,如i960cx訪問這樣的數(shù)需讀內(nèi)存三次(一個(gè)
BYTE、一個(gè)SHORT,一個(gè)BYTE,由CPU的微代碼執(zhí)行,對軟件透
明),所有對齊方式下CPU的運(yùn)行效率明顯快多了。
18162432
Ilongl||longl||longl||longl|
Ilong2|
Ilong2||long2||long2|
6函數(shù)
規(guī)則6-1:對所調(diào)用函數(shù)的錯(cuò)誤返回碼要仔細(xì)、全面地處理。
規(guī)則6-2:明確函數(shù)功能,精確(而不是近似)地實(shí)現(xiàn)函數(shù)設(shè)計(jì)。
規(guī)則6-3:編寫可重入函數(shù)時(shí),應(yīng)注意局部變量的使用(如編寫C/C++語言的可重入函數(shù)時(shí),應(yīng)
使用aut。即缺省態(tài)局部變量或寄存器變量)。
說明:編寫C/C++語言的可重入函數(shù)時(shí),不應(yīng)使用Static局部變量,否則
必須經(jīng)過特殊處理,才能使函數(shù)具有可重入性。
規(guī)則6-4:編寫可重入函數(shù)時(shí),若使用全局變量,則應(yīng)通過關(guān)中斷、信號(hào)量(即P、V操作)等
手段對其加以保護(hù)。
說明:若對所使用的全局變量不加以保護(hù),則此函數(shù)就不具有可重入
性,即當(dāng)多個(gè)進(jìn)程調(diào)用此函數(shù)時(shí).,很有可能使有關(guān)全局變量為不可知狀
態(tài)。
示例:假設(shè)Exam是int型全局變量,函數(shù)Squre_Exam返回Exam平方值。
那么如下函數(shù)不具有可重入性。
unsignedintexample(intpara)
(
unsignedinttemp;
Exam=para;//(**)
temp=Square_Exam();
returntemp
}
此函數(shù)若被多個(gè)進(jìn)程調(diào)用的話,其結(jié)果可能是未知的,因?yàn)楫?dāng)(**)語句剛
執(zhí)行完后,另外一個(gè)使用本函數(shù)的進(jìn)程可能正好被激活,那么當(dāng)新激活
的進(jìn)程到此函數(shù)時(shí),將使Exam賦與另一個(gè)不同的para值,所以當(dāng)控制
重新到“temp=Square_Exam()”后,計(jì)算出的temp很可能不是預(yù)想中
的結(jié)果。此函數(shù)應(yīng)如下改進(jìn)。
unsignedintexample(intpara)
(
unsignedinttemp;
[釋放信號(hào)量操作]//若申請不到“信號(hào)量”,說明另外進(jìn)程正處于給
Exam=para;//Exam賦值并計(jì)算其平方過程中(即正在使用此信號(hào)
temp=Square_Exam();//號(hào))本進(jìn)程必須等待其釋放信號(hào)后,才可繼續(xù)執(zhí)
[釋放信號(hào)量操作]//行。若申請到信號(hào),則可繼續(xù)執(zhí)行,但其它進(jìn)程必
//須等待本進(jìn)程釋放信號(hào)量后,才能再使用本信號(hào)。
returntemp;
}
建議6-1:防止將函數(shù)的參數(shù)作為工作變量。
說明:將函數(shù)的參數(shù)作為工作變量,有可能錯(cuò)誤地改變參數(shù)內(nèi)容,所以
很危險(xiǎn)。對必須改變的參數(shù),最好先用局部變量代之,最后再將該局部
變量的內(nèi)容賦給該參數(shù)。
示例:下函數(shù)的實(shí)現(xiàn)不太好。
voidsum_data(unsignedintnum,int*data,int*sum)
(
unsignedintcount;
*sum=0;
for(count=0;count<num;count++)
(
*sum+=data[count];//sum成了工作變量,不太好。
)
若改為如下,則更好些。
voidsum_data(unsignedintnum,int*data,int*sum)
(
unsignedintcount;
intsumjemp;
sum_temp=0;
for(count=0;count<num;count++)
(
sumjemp+=data[count++]
}
*sum=sum_temp;
}
建議62函數(shù)的規(guī)模盡量限制在200行以內(nèi)。
說明:不包括注釋和空格行。
建議6-3:一個(gè)函數(shù)僅完成一件功能。
建議64為簡單功能編寫函數(shù)。
說明:雖然為僅用一兩行就可完成的功能去編寫函數(shù)好象沒有必要,但
有函數(shù)可使功能明確化,增加程序可讀性,亦可方便維護(hù)、測試。
示例:如下語句的功能不很明顯。
value=(a>b)?a:b
改為如下就很清晰了。
intmax(inta,intb)
(
return((a>b)?a:b;
}
value=max(a,b);
或改為如下。
#defineMAX(a,b)(((a)>(b))>(a):(b))
value=MAX(a,b);
建議65不要設(shè)計(jì)多用途面面俱到的函數(shù)。
說明:多功能集于一身的函數(shù),很可能使函數(shù)的理解、測試、維護(hù)等變
得困難。
建議6-6:函數(shù)的功能應(yīng)該是可以預(yù)測的,也就是只要輸入數(shù)據(jù)相同就應(yīng)產(chǎn)生同樣
的輸出。
說明:帶有內(nèi)部“存儲(chǔ)器”的函數(shù)的功能可能是不可預(yù)測的,因?yàn)樗妮?/p>
出可能取決于內(nèi)部存儲(chǔ)器(如某標(biāo)記)的狀態(tài)。這樣的函數(shù)既不易于理
解又不利于測試和維護(hù)。在C/C++語言中,函數(shù)的static局部變量的內(nèi)部
存儲(chǔ)器,有可能使函數(shù)的功能不可預(yù)測,然而,當(dāng)某函數(shù)的返回值為指
針類型時(shí),則必須是STATIC的局部變量的地址作為返回值,若為AUTO
類,則返回為錯(cuò)針。
示例:如下函數(shù),其返回值(即功能)是不可預(yù)測的。
unsignedintinteger_sum(unsignedintbase)
unsignedintindex;
staticunsignedintsum=O;//注意,是static類型的。
//若改為auto類型,則函數(shù)即變?yōu)榭深A(yù)測。
for(index=1;index<=base;index++)
(
sum+=index
}
returnsum;
}
建議6-7:盡量不要編寫依賴于其他函數(shù)內(nèi)部實(shí)現(xiàn)的函數(shù)。
說明:此條為函數(shù)獨(dú)立性的基本要求。由于目前大部分高級(jí)語言都是結(jié)
構(gòu)化的,所以通過具體語言的語法要求與編譯器功能,基本就可以防止
這種情況發(fā)生。但在匯編語言中,由于其靈活性,很可能使函數(shù)出現(xiàn)這
種情況。
示例:如下是在DOS下TASM的匯編程序例子。過程Print_Msg的實(shí)現(xiàn)依
賴于lnput_Msg的具體實(shí)現(xiàn),這種程序是非結(jié)構(gòu)化的,難以維護(hù)、修改。
...//程序代碼
procPrint_Msg〃過程(函數(shù))Print_Msg
…〃程序代碼
jmpLABEL
...//程序代碼
endp
proclnput_Msg〃過程(函數(shù))I"ut_Msg
...//程序代碼
LABEL:
程序代碼
endp
建議6-8:避免設(shè)計(jì)多參數(shù)函數(shù),不使用的參數(shù)從接口中去掉。
說明:目的減少函數(shù)間接口的復(fù)雜度。
建議6-9:非調(diào)度函數(shù)應(yīng)減少或防止控制參數(shù),盡量只使用數(shù)據(jù)參數(shù)。
說明:本建議目的是防止函數(shù)間的控制耦合。調(diào)度函數(shù)是指根據(jù)輸入的
消息類型或控制命令,來啟動(dòng)相應(yīng)的功能實(shí)體(即函數(shù)或過程),而本
身并不完成具體功能。控制參數(shù)是指改變函數(shù)功能行為的參數(shù),即函數(shù)
要根據(jù)此參數(shù)來決定具體怎樣工作。非調(diào)度函數(shù)的控制參數(shù)增加了函數(shù)
間的控制耦合,很可能使函數(shù)間的耦合度增大,并使函數(shù)的功能不唯
0
示例:如下函數(shù)構(gòu)造不太合理。
Intadd_sub(inta,intb,unsignedcharadd_sub_flg)
(
if(add_sub_flg==INTEGER_ADD)
(
return(a+b);
}
else
(
return(a-b);
}
}
不如分為如下兩個(gè)函數(shù)清晰。
intadd(inta,intb)
(
return(a+b);
}
intsub(inta,intb)
(
return(a-b);
}
建議6T0:檢查函數(shù)所有參數(shù)輸入的有效性。
建議6-11:檢查函數(shù)所有非參數(shù)輸入的有效性,如數(shù)據(jù)文件、公共變量等。
說明:函數(shù)的輸入主要有兩種:一種是參數(shù)輸入;另一種是全局變量、
數(shù)據(jù)文件的輸入,即非參數(shù)輸入。函數(shù)在使用輸入之前,應(yīng)進(jìn)行必要檢
查。
建議6-12:函數(shù)名應(yīng)準(zhǔn)確描述函數(shù)的功能。
建議6-13:使用動(dòng)賓詞組為執(zhí)行某操作的函數(shù)命名。如果是OOP方法,可以只有
動(dòng)詞(名詞是對象本身)。
示例:參照如下方式命名函數(shù)。
voidprint_record(unsignedintrecjnd);
intinput_record(void);
unsignedcharget_current_colwr(void);
建議6-14:避免使用無意義成含義不清的動(dòng)詞為函數(shù)命名。
說明:避免用含義不清的動(dòng)詞如process、handle等為函數(shù)命名,因?yàn)?/p>
這些動(dòng)詞并沒有要具體做什么。
建議6-15:函數(shù)的返回值要清楚、明了、讓使用者不容易忽視錯(cuò)誤情況。
說明:函數(shù)的每種出錯(cuò)返回值的意義要清晰、明了、準(zhǔn)確,防止使用者
誤用、理解錯(cuò)誤或忽視錯(cuò)誤返回碼。
建議6-16:除非必要,最好不要把與函數(shù)返回值類型不同的變量,以編譯系統(tǒng)默
認(rèn)的轉(zhuǎn)換或強(qiáng)制數(shù)據(jù)類型轉(zhuǎn)換。
建議6-L7:讓函數(shù)在調(diào)用點(diǎn)顯得易懂、容易理解。
建議6-18:在調(diào)用函數(shù)填寫參數(shù)時(shí),應(yīng)盡量減少?zèng)]有必要的默認(rèn)數(shù)據(jù)類型轉(zhuǎn)換或
強(qiáng)制數(shù)據(jù)類型轉(zhuǎn)換。
說明:因?yàn)閿?shù)據(jù)類型轉(zhuǎn)換或多或少存在危險(xiǎn)。
建議6-19:避免函數(shù)中不必要語句,防止程序中的垃圾代碼。
說明:程序中的垃圾代碼不僅占用額外的空間,而且還常常影響程序的
功能與性能,很可能給程序的測試、維護(hù)等造成不必要的麻煩。
建議6-20:防止把沒有關(guān)聯(lián)的語句放到一個(gè)函數(shù)中。
說明:防止函數(shù)或過程內(nèi)出現(xiàn)隨機(jī)內(nèi)聚。隨機(jī)內(nèi)聚是指將沒有關(guān)聯(lián)或很
弱的語句放到同一個(gè)函數(shù)或過程的功能不明確。使用隨機(jī)內(nèi)聚函數(shù),常
常容易出現(xiàn)在一種應(yīng)用場合需要改進(jìn)此函數(shù),而另一種應(yīng)用場合又不允
許這種改進(jìn),從而陷入困境。出來,并構(gòu)成一個(gè)新函數(shù)。若這些代碼關(guān)
聯(lián)較大并且是完成一個(gè)功能的,那么這種構(gòu)造是合理的,否則這種構(gòu)造
將產(chǎn)生隨機(jī)內(nèi)聚的函數(shù)。
示例:如下函數(shù)就是一種隨機(jī)內(nèi)聚。
voidlnit_Var(void)
(
Rect.length=O;
Rect.width=O;〃初始化矩形的長與寬。
Point.x=10;
Point.y=10;//初始化“點(diǎn)”的坐標(biāo)。
}
矩形的長、寬與點(diǎn)的坐標(biāo)基本沒有任何關(guān)系,故以上函數(shù)是隨機(jī)內(nèi)聚。
voidlnit_Rect(void)
(
Rectlength=O;
Rect.width=O;//初始化矩形的長與寬。
)
voidlnit_Point(void)
{
Point.x=
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年廈門a2貨運(yùn)從業(yè)資格證考試
- 2025年武威駕??荚囏涍\(yùn)從業(yè)資格證考試
- 《中醫(yī)藥基礎(chǔ)》課程標(biāo)準(zhǔn)
- 減肥連鎖加盟合同范本
- 農(nóng)村后院出租合同范本
- 廠房車間裝修合同范本
- 加工合同范本文庫
- 中專畢業(yè)個(gè)人自我鑒定
- 倉庫配送員合同范本
- 《配電自動(dòng)化運(yùn)維人員培訓(xùn)考核規(guī)范(征求意見意見稿)》
- (中職組)植物病蟲害防治知識(shí)競賽考試題庫(含答案)
- 肌肉注射新版本
- 大班語言活動(dòng)-海豹到哪里去了
- 小班社會(huì)《認(rèn)識(shí)家用電器》課件
- 高考概率大題必練20題(理科)-含答案
- 涼水井煤礦礦山地質(zhì)環(huán)境與土地復(fù)墾方案
- 果實(shí)酚類和揮發(fā)性物質(zhì)含量特征及其與果實(shí)品質(zhì)關(guān)系的研究
- 2023年東華高級(jí)中學(xué)中考自招數(shù)學(xué)復(fù)習(xí)題及答案解析
- 結(jié)果比過程重要辯論賽
- JTG C10-2007 公路勘測規(guī)范
評(píng)論
0/150
提交評(píng)論