程序代碼的化課件_第1頁
程序代碼的化課件_第2頁
程序代碼的化課件_第3頁
程序代碼的化課件_第4頁
程序代碼的化課件_第5頁
已閱讀5頁,還剩40頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

華僑大學(xué)計(jì)算機(jī)學(xué)院第七章程序代碼的文檔化

C++/C編程規(guī)范——幫助程序員一次性編寫出高質(zhì)量的程序參考《高質(zhì)量C/C++編程》

目錄0.編程老手和高手的誤區(qū)1.程序的版式2.命名規(guī)則3.表達(dá)式和基本語句4.函數(shù)設(shè)計(jì)5.內(nèi)存管理6.C++/C試題與答案,代碼檢查表引子——“真正”的程序員

(1)

真正的程序員沒有進(jìn)度表,只有討好領(lǐng)導(dǎo)的馬屁精才有進(jìn)度表,真正的程序員會讓領(lǐng)導(dǎo)提心吊膽。(2)

真正的程序員不寫使用說明書,用戶應(yīng)當(dāng)自己去猜想程序的功能。(3)

真正的程序員幾乎不寫代碼的注釋,如果注釋很難寫,它理所當(dāng)然也很難讀。(4)

真正的程序員不畫流程圖,原始人和文盲才會干這事。(5)

真正的程序員不看參考手冊,新手和膽小鬼才會看。(6)

真正的程序員不寫文檔也不需要文檔,只有看不懂程序的笨蛋才用文檔。(7)

真正的程序員認(rèn)為自己比用戶更明白用戶需要什么。(8)

真正的程序員不接受團(tuán)隊(duì)開發(fā)的理念,除非他自己是頭頭。(9)

真正的程序員的程序不會在第一次就正確運(yùn)行,但是他們愿意守著機(jī)器進(jìn)行若干個30小時的調(diào)試改錯。(10)真正的程序員不會在上午9:00到下午5:00之間工作,如果你看到他在上午9:00工作,這表明他從昨晚一直干到現(xiàn)在。引子——每一個小函數(shù)都需要考慮:面試題:strcpy的代碼。一位“高手”面對微軟資深工程師的面試(1)編程風(fēng)格;(2)出錯處理;(3)算法復(fù)雜度分析(用于提高性能)1.程序的版式——代碼規(guī)范1)文件結(jié)構(gòu)

版權(quán)和版本頭文件的結(jié)構(gòu)頭文件的作用目錄結(jié)構(gòu)includesrc2)版式a.版權(quán)和版本的聲明1.1版權(quán)和版本的聲明——位于頭文件和定義文件的開頭(1)版權(quán)信息。(2)文件名稱,標(biāo)識符,摘要(3)當(dāng)前版本號,作者/修改者,完成日期。(4)版本歷史信息。/*Copyright(c)2001,上海貝爾有限公司*Allrightsreserved.**文件名稱:filename.h*文件標(biāo)識:見配置管理計(jì)劃書*摘要:簡要描述本文件的內(nèi)容**當(dāng)前版本:1.1*作者:輸入作者(或修改者)名字*完成日期:2001年7月20日**取代版本:1.0*原作者:輸入原作者(或修改者)名字*完成日期:2001年5月10日*/b.頭文件的結(jié)構(gòu)//版權(quán)和版本聲明見示例1-1,此處省略。#ifndefGRAPHICS_H//防止raphics.h被重復(fù)引用#defineGRAPHICS_H#include<math.h> //引用標(biāo)準(zhǔn)庫的頭文件…#include“myheader.h”//引用非標(biāo)準(zhǔn)庫的頭文件…voidFunction1(…); //全局函數(shù)聲明…classBox //類結(jié)構(gòu)聲明{…};#endif(1)版權(quán)和版本(2)預(yù)處理塊。(3)函數(shù)和類聲明

#include<filename.h>

#include“filename.h”

的區(qū)別//不提倡使用全局變量,少定義

正確使用include,ifndef/define/endifc.頭文件的作用通過頭文件來調(diào)用庫功能。出于安全的考慮:在很多場合,源代碼不便(或不準(zhǔn))向用戶公布,只要向用戶提供頭文件和二進(jìn)制的庫即可。用戶只需要按照頭文件中的接口聲明來調(diào)用庫功能,而不必關(guān)心接口怎么實(shí)現(xiàn)的。編譯器會從庫中提取相應(yīng)的代碼。2)程序的版式程序的版式程序的書法一目了然1)適時加空行:不浪費(fèi)內(nèi)存——別不舍得用!每個類聲明之后、每個函數(shù)定義結(jié)束之后加空行2)代碼:一行一句易讀、便于設(shè)斷點(diǎn)測試?yán)?)用空格分隔關(guān)鍵字后、二元運(yùn)算符后要留空格一元運(yùn)算符不留空函數(shù)名后()[]前后不用空格例4)注意{}對齊例5)長行拆分一行控制在70至80個字符以內(nèi),便于觀看、打印6)注釋的使用例:7)類的定義先操作再數(shù)據(jù)例例:一行一句intwidth; //寬度intheight; //高度intdepth; //深度intwidth,height,depth;x=a+b;y=c+d;z=e+f;X=a+b;y=c+d;z=e+f;if(width<height){

dosomething();}if(width<height)dosomething();良好風(fēng)格易讀、便于設(shè)斷點(diǎn)測試不良風(fēng)格返回例:用空格分隔,提高可讀性voidFunc1(intx,inty,intz);//良好的風(fēng)格voidFunc1(int

x,int

y,intz);//不良的風(fēng)格if(year>=2000)//良好的風(fēng)格if(year>=2000)//不良的風(fēng)格if((a>=b)&&(c<=d))//良好的風(fēng)格if(a>=b&&c<=d)//不良的風(fēng)格for(i=0;i<10;i++)//良好的風(fēng)格for(i=0;i<10;i++)//不良的風(fēng)格for(i=0;i<10;i++)//過多的空格x=a<b?a:b;//良好的風(fēng)格x=a<b?a:b;//不好的風(fēng)格int*x=&y;//良好的風(fēng)格int*x=&y;//不良的風(fēng)格

返回例:對齊的兩種方式voidFunction(intx){…//programcode}voidFunction(intx){…//programcode}風(fēng)格不良,但是也有很多工具使用返回例:注釋注釋通常用于:(1)版本、版權(quán)聲明;(2)函數(shù)接口說明;(3)重要的代碼行或段落提示。雖然注釋有助于理解代碼,但注意不可過多使用注釋

/**函數(shù)介紹:*輸入?yún)?shù):*輸出參數(shù):*返回值:*/voidFunction(floatx,floaty,floatz){…}//下面為XX算法if(…){…while(…){…}//endofwhile…}//endofif例:類的定義你的習(xí)慣是什么?先數(shù)據(jù)? 先定義操作?classA{

private:

inti,j;floatx,y;…public:voidFunc1(void);voidFunc2(void);…}classA{

public:voidFunc1(void);voidFunc2(void);…private:inti,j;floatx,y;…}用戶最關(guān)心的是接口,誰愿意先看到一堆私有數(shù)據(jù)成員!2.命名規(guī)則

機(jī)構(gòu)內(nèi)部一致即可(一般原則:)直觀拼讀,可望文知意,不必“解碼”。名字的長度:min-length&&max-information原則

與操作系統(tǒng)和開發(fā)工具的風(fēng)格保持一致

不出現(xiàn)僅靠大小寫區(qū)分的相似的標(biāo)識符

不出現(xiàn)標(biāo)識符完全相同的局部變量和全局變量

變量名:“名詞”或“形容詞+名詞”

全局函數(shù)名字:“動詞”或者“動詞+名詞”(動賓詞組)。類的成員函數(shù)應(yīng)只用“動詞”,被省略掉的名詞就是對象本身。

用反義詞組命名具有互斥意義的變量或相反動作的函數(shù)

避免名字中出現(xiàn)數(shù)字編號,如Value1,Value2等,除非邏輯上的確需要編號簡單的Windows應(yīng)用程序命名規(guī)則【1】類名和函數(shù)名用大寫字母開頭【2】變量和參數(shù)用小寫字母開頭【3】常量全用大寫的字母,下劃線分割單詞?!?】靜態(tài)變量加前綴s_(表示static)?!?】全局變量前加前綴g_(表global)【6】類的數(shù)據(jù)成員加前綴m_(表示member),這樣可以避免數(shù)據(jù)成員與成員函數(shù)的參數(shù)同名?!?】類名和函數(shù)名用大寫字母開頭的單詞組合而成。例如:

classNode; //類名

classLeafNode; //類名

voidDraw(void); //函數(shù)名

voidSetValue(intvalue); //函數(shù)名返回【2】變量和參數(shù)用小寫字母開頭的單詞組合例如:

BOOLflag;

int

drawMode;返回【3】常量全用大寫的字母,用下劃線分割單詞。例如:

constint

MAX=100; constint

MAX_LENGTH=100;返回【4】靜態(tài)變量加前綴s_(表示static)例如:voidInit(…){ staticint

s_initValue; //靜態(tài)變量

…}返回【5】全局變量加前綴g_如果不得已需要全局變量,則使全局變量加前綴g_(表示global)。例如:int

g_howManyPeople; //全局變量int

g_howMuchMoney; //全局變量返回【6】類的數(shù)據(jù)成員加前綴m_(表示member),這樣可以避免數(shù)據(jù)成員與成員函數(shù)的參數(shù)同名。例如:

voidObject::SetValue(intwidth,intheight) {

m_width=width;

m_height=height;}3.表達(dá)式和基本語句3.1表達(dá)式3.2你會編寫正確的if語句嗎3.3循環(huán)語句3.1表達(dá)式不要考驗(yàn)我的記性??!拒絕復(fù)雜的復(fù)合表達(dá)式多用括號代碼行中的運(yùn)算符多時,用括號確定表達(dá)式的操作順序避免使用默認(rèn)的優(yōu)先級i++++i;if(a>=b&&c<d&&c+f<=g+h)(

)

(

)

(

)3.2你會編寫正確的if語句嗎布爾變量與零值比較?

整型變量與零值比較?

浮點(diǎn)變量與零值比較?

指針變量與零值比較?

(1)布爾變量與零值比較?不可將布爾變量直接與TRUE、FALSE或1、0比較布爾類型的語義,零值為“假”(FALSE),任何非零即“真”(TRUE)if(flag==TRUE) if(flag==1) if(flag==FALSE) if(flag==0)

if(flag)

//表示flag為真if(!flag)//表示flag為假(2)整型變量與零值比較?應(yīng)當(dāng)將整型變量用“==”或“!=”直接與0比較。假設(shè)整型變量為value,與零值比較:if(value)if(!value)//不可模仿布爾變量的風(fēng)格而寫成會讓人誤解value是布爾變量

if(value==0)if(value!=0)(3)浮點(diǎn)變量與零值比較?不可將浮點(diǎn)變量用“==”或“!=”與任何數(shù)字比較。無論是float還是double類型的變量,都有精度限制一定要避免將浮點(diǎn)變量用“==”或“!=”與數(shù)字比較,應(yīng)設(shè)法轉(zhuǎn)化成“>=”或“<=”形式。若float型浮點(diǎn)變量名為x,應(yīng)將if(x==0.0)//隱含錯誤的比較#defineEPSINON

0.000001

if((x>=-EPSINON)&&(x<=EPSINON))//其中EPSINON是允許的誤差(即精度)(4)指針變量與零值比較?應(yīng)當(dāng)將指針變量用“==”或“!=”與NULL比較。指針變量的零值是“空”(記為NULL)。盡管NULL的值與0相同,但兩者意義不同。假設(shè)指針變量的名字為p

if(p==NULL)或if(p!=NULL)

//p與NULL顯式比較,強(qiáng)調(diào)p是指針變量不要寫成

if(p==0)

//容易讓人誤解p是整型變量

if(p!=0)

if(p) //容易讓人誤解p是布爾變量

if(!p)3.3循環(huán)語句多重循環(huán),若可能,應(yīng)長循環(huán)在內(nèi),短循環(huán)在外以減少CPU跨切循環(huán)層的次數(shù)。

若循環(huán)體內(nèi)有邏輯判斷,且循環(huán)次數(shù)很大,宜將邏輯判斷移到循環(huán)體外

循環(huán)控制變量采用“半開半閉區(qū)間”寫法。即:x介于[0,N)for(intx=0;x<N;x++)而不是

x介于[0,N-1]for(intx=0;x<=N-1;x++)4.函數(shù)設(shè)計(jì)函數(shù)體的“入口處”和“出口處”把關(guān)

4.1參數(shù)4.2返回值4.1參數(shù)的規(guī)則參數(shù)寫完整、命名恰當(dāng)、順序合理StringCopy(char*str1,char*str2)類型和參數(shù)名都要寫參為指針,若僅傳入數(shù)據(jù),則加const參數(shù)個數(shù)<5個4.2返回值的規(guī)則返回值類型別省略。正常值——輸出參數(shù)獲得錯誤標(biāo)志——用return返回為增加靈活性支持鏈?zhǔn)奖磉_(dá),可附加返回值

char*strcpy(char*strDest,constchar*strSrc);明確說明用于出錯處理的返回值讓使用者不容易忽視或誤解錯誤情況4.函數(shù)設(shè)計(jì)一些建議函數(shù)的功能要單一函數(shù)體<50行檢查所有進(jìn)入函數(shù)體的變量的有效性,1)輸入?yún)?shù)2)通過其他途徑進(jìn)入函數(shù)體內(nèi)的變量如全局變量、文件句柄等。

4.5使用斷言使用斷言捕捉不應(yīng)該發(fā)生的非法情況。如:函數(shù)入口處,用斷言檢查參數(shù)的有效性。

void*memcpy(void*pvTo,constvoid*pvFrom,size_tsize){

assert((pvTo!=NULL)&&(pvFrom!=NULL));

//使用斷言…}

5.內(nèi)存管理5.2常見的內(nèi)存錯誤&對策5.4free和delete把指針怎么啦?5.5動態(tài)內(nèi)存會被自動釋放嗎?5.6杜絕野指針5.7有了malloc/free為什么還要new/delete5.8內(nèi)存耗盡怎么辦?5.1內(nèi)存分配方式1靜態(tài)存儲區(qū)域內(nèi)存在程序編譯的時候就已分配好,這塊內(nèi)存在程序的整個運(yùn)行期間都存在。如全局變量,static變量。2.棧函數(shù)執(zhí)行時創(chuàng)建,函數(shù)結(jié)束時自動被釋放棧內(nèi)存分配運(yùn)算內(nèi)置于處理器的指令集中,效率很高,但是分配的內(nèi)存容量有限。如:函數(shù)內(nèi)局部變量、參數(shù)的存儲單元3.堆(動態(tài)內(nèi)存分配)Malloc/free或new/delete運(yùn)行時用malloc或new申請任意多少的內(nèi)存,程序員自己負(fù)責(zé)在何時用free或delete釋放內(nèi)存。動態(tài)內(nèi)存的生存期由我們決定,使用靈活,但問題也最多。5.2常見的內(nèi)存錯誤&對策內(nèi)存分配未成功,卻使用了它。內(nèi)存分配雖然成功,但尚未初始化就引用它。內(nèi)存分配成功并且已經(jīng)初始化,但操作越過了內(nèi)存的邊界。忘記了釋放內(nèi)存,造成內(nèi)存泄漏。釋放了內(nèi)存卻繼續(xù)使用它內(nèi)存分配成功了?未成功那你敢就用它?申請的內(nèi)存初始化了么?成功未成功操作越界了么?是的成了野指針內(nèi)存你釋放了么?我忘了內(nèi)存泄漏,資源崩潰釋放了,你還用!我忘了對策內(nèi)存分配成功了?申請的內(nèi)存初始化了么?避免越界內(nèi)存你釋放了么?釋放了,你還用!用malloc或new申請內(nèi)存之后,應(yīng)該立即檢查指針值是否為NULL。防止使用指針值為NULL內(nèi)存別忘記為數(shù)組和動態(tài)內(nèi)存賦初值。防止將未被初始化的內(nèi)存作為有值使用。避免數(shù)組或指針的下標(biāo)越界,特別要當(dāng)心發(fā)生“多1”或者“少1”操作。動態(tài)內(nèi)存的申請與釋放必須配對,防止內(nèi)存泄漏。用free或delete釋放了內(nèi)存之后,立即將指針設(shè)置為NULL,防產(chǎn)生“野指針”。5.4free和delete把指針怎么啦?它們只是把指針?biāo)傅膬?nèi)存給釋放掉,但并沒有把指針本身干掉。指針p被free以后其地址仍然不變(非NULL),只是該地址對應(yīng)的內(nèi)存是垃圾,p成了“野指針”。如果此時不把p設(shè)置為NULL,會讓人誤以為p是個合法的指針。如果程序比較長,我們有時記不住p所指的內(nèi)存是否已經(jīng)被釋放,在繼續(xù)使用p之前,通常會用語句if

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論