語言經(jīng)典合集-軟件編程總則_第1頁
語言經(jīng)典合集-軟件編程總則_第2頁
語言經(jīng)典合集-軟件編程總則_第3頁
語言經(jīng)典合集-軟件編程總則_第4頁
語言經(jīng)典合集-軟件編程總則_第5頁
已閱讀5頁,還剩55頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1排排:程序塊要采用縮進(jìn)風(fēng)格編寫,縮進(jìn)的空格數(shù)為個。if{...//program}repssn_ind=ssn_data[index].repssn_index;repssn_ni=ssn_data[index].ni;if{...//program}repssn_ind=ssn_data[index].repssn_index;repssn_ni=ssn_data[index].ni;:較長的語句(字符)要分成多行書寫,長表達(dá)式要在低優(yōu)先級操作符處劃分新行,操作符放在新行之首,劃分出的新行要進(jìn)行適當(dāng)?shù)目s進(jìn),使排版整齊,語句可讀。perm_count_msg.head.len=+STAT_SIZE_PER_FRAM*sizeof(_ULact_task_table[frame_id*STAT_TASK_CHECK_NUMBER+== _statistic_state(stat_itemreport_or_not_flag=((taskno<2 1排&&(n7stat_stat_item_valid&&(act_task_table[taskno].result_data!=3 1排:循環(huán)、判斷等語句中若有較長的表達(dá)式或語句,則要進(jìn)行適應(yīng)的劃分,長表達(dá)式要在低優(yōu)先級操作符處劃分新行,操作符放在新行之首。if((taskno<&&(n7stat_stat_item_valid{...//program}for(i=0,j=0;(i<BufferKeyword[word_index].word_length)&&(j<NewKeyword.word_length);i++,j++){...//program}for(i=0,j=(i<first_word_length)&&(j<second_word_length);i++,j++){...//program}pare((BYTE*)&(BYTE*)&(act_task_table[taskno].stat_object),sizeof(_STAT_OBJECT));n7stat_flash_act_duration(stat_item,frame_id+index,stat_objectrect.length=0;rect.width=4 1排rect.length=rect.width=do、while等語句的執(zhí)行語句部分無論多少都要加括號if(pUserCR==NULL)if(pUserCR=={}TAB鍵所設(shè)置的空格數(shù)目不同而造成程序布局不整齊,不要使用BC作為編輯器合版本,因為BC會自動將8個空格變?yōu)橐粋€TAB鍵,因此使用BC合入的版本大多會將縮進(jìn)變亂。11-10:程序塊的分界符(如C/C++語言的大括號‘{’和‘}’)應(yīng)各獨占一行并且位于同一列,同時與它們的語句左對齊。在函數(shù)體的開始、類的定義、結(jié)構(gòu)的定義、枚舉的定義以及if、for、do、while、switch、case語句中的程序都要采用如上的縮進(jìn)方式。for(...)...//program}if{...//program}5 1排voidexample_fun(void{...//program}for{...//program}if{...//program}voidexample_fun(void{...//program}11-11:在兩個以上的關(guān)鍵字、變量、常量進(jìn)行對等操作時,它們之間的操作符之前、之后或者前后要加空格;進(jìn)行非對等操作時,如果是關(guān)系密切的立即操作符(如->),后不應(yīng)加空格。C/C++語言中括號已經(jīng)是最清晰的標(biāo)志了。inta,b,6 1排比較操作符賦值操作符"=""+=",算術(shù)操作符"+"、"%",邏輯操作符"&&"、if(current_time>=MAX_TIME_VALUE)a=b+c;a*=a=b^*p='a';//內(nèi)容操作"*"與內(nèi)容之間flag=!isEmpty;//非操作"!"與內(nèi)容之間p=&mem;//地址操作"&"與內(nèi)容之間 //"++","--"與內(nèi)容之間p->id= //"->"if、for、while、switchif等關(guān)鍵字更為突出、if(a>=b&&c>?1-1:一行程序以小于80字符為宜,不要寫得過長。7 2注注2:說明性文件(如頭文件h文件、文件、f文件、編譯說明文件g等頭部應(yīng)進(jìn)行注釋,注釋必須列出:說明、版本號、生成日期、作者、內(nèi)容、功能、與其它文件的關(guān)系、修改日志等,頭文件的注釋中還應(yīng)有函數(shù)功能簡要說明。Copyright(C),1988-1999, Tech.Co., Filename: //文件名 Date ////// FunctionList:1. //:源文件頭部應(yīng)進(jìn)行注釋,列出: 說明版號、生成日期、作者、模塊目的功能、主要函數(shù)及其功能、修改日志等。8 2注Copyright(C),1988-1999, Tech.Co., FileName: Version //模塊描述 //版本信息FunctionList: //主要函數(shù)及其功能 <author> <version buildthis說明:Description一項描述本文件的內(nèi)容、功能、內(nèi)部各部分之間的關(guān)系及本文件與其它文件關(guān)系等。History是修改歷史記錄列表,每條修改記錄應(yīng)包括修改日期、修改者:函數(shù)頭部應(yīng)進(jìn)行注釋,列出:函數(shù)的目的功能、輸入?yún)?shù)、輸出參數(shù)、返回值、調(diào)用關(guān)系(函數(shù)、表)等。 //函數(shù)名稱 //函數(shù)功能、性能等的描述 //被本函數(shù)調(diào)用的函數(shù)CalledBy: //調(diào)用本函數(shù)的函數(shù)TableAccessed://被的表(此項僅對于牽扯到數(shù)據(jù)庫操作的程序)TableUpdated://被修改的表(此項僅對于牽扯到數(shù)據(jù)庫操作的程序)Input://輸入?yún)?shù)說明,包括每個參數(shù)的作// 9 2注:邊寫代碼邊注釋,修改代碼同時修改相應(yīng)的注釋,以保證注釋與代碼的一致性。不再有用的注釋要刪除。:注釋應(yīng)與其描述的代碼相近,對代碼的注釋應(yīng)放在其上方或右方(對單條語句的注釋)相鄰位置,不可放在下面,如放于上方則需與其上面的代碼用空行隔開。1:/*getreplicatesubsystemindexandnetindicatorrepssn_ind=ssn_data[index].repssn_index;repssn_ni=ssn_data[index].ni;repssn_ind=ssn_data[index].repssn_index;repssn_ni=ssn_data[index].ni;/*getreplicatesubsystemindexandnetindicator/*getreplicatesubsystemindexandnetindicator*/repssn_ind=ssn_data[index].repssn_index;repssn_ni= 時都必須加以/*activestatistictasknumber*/#defineMAX_ACT_TASK_NUMBER1000 2注#defineMAX_ACT_TASK_NUMBER1000/*activestatistictasknumber0:數(shù)據(jù)結(jié)構(gòu)包括數(shù)組、結(jié)構(gòu)、類、枚舉等),如果其命名不是充分自注釋的,必須加以注釋。對數(shù)據(jù)結(jié)構(gòu)的注釋應(yīng)放在其上方相鄰位置,不可放在下面;對結(jié)構(gòu)中的每個域的注釋放在此域的右方。/*s interfacewiths userprimitivemessagename*/enumS {N_UNITDATA_IND,/*s notifys userunitdatacome*/ /*s notifyusertheNo.7networkcannot*//*transmissionthismessageN_UNITDATA_REQ,/* user'sunitdatatransmission:全局變量要有較詳細(xì)的注釋,包括對其功能、取值范圍、哪些函數(shù)或過程存取它以及存取時注意事項等的說明。/*TheErrorCodewhen translate/*GlobalTitlefailure,asfollows /*0- 1-GTTableerror/*2-GTerrorOthersnouse /*onlyfunction Translate()in/*thismodualcanmodifyit,andother/*modulecanvisititthroughcall/*thefunctionGetGTTransErrorCode() BYTEvoidexample_fun(void){/*codeonecomments*/CodeBlockOne 2注/*codetwocomments*/CodeBlockTwo}voidexample_fun(void{/*codeonecomments*/CodeBlockOne/*codetwocomments*/CodeBlockTwo}/*codeonecomments*/programcodeone/*codetwocomments*/programcodetwo/*codeonecomments*/programcodeone/*codetwocomments*/programcodetwo :對于語句下的語句,如果因為特殊情況需要處理完一個后進(jìn)入下一個處理,必須在該語句處理完、下一個語句前加上明確的注釋。 2注caseCMD_UP:caseCMD_DOWN:caseCMD_FWD:if{}{ //nowjumpintocase}casecasecasecase 2注?2-1:避免在一行代碼或表達(dá)式的中間插入注釋。 ?2-3:在代碼的功能、意圖層次上進(jìn)行注釋,提供有用、額外的信息。/*ifreceive_flagisTRUE*/if(receive_flag)/*ifmtpreceiveamessagefromlinks*/if(receive_flag)?2-4:在程序塊的結(jié)束行右方加注釋標(biāo)記,以表明某程序塊的結(jié)束if{//programwhile(index<{//program}/*endofwhile(index<MAX_INDEX)*while束}/*endofif(...)*if 2注?2-5:注釋格式盡量統(tǒng)一,建議使用“/*……*/?- 3標(biāo)志符命標(biāo)識符命:標(biāo)識符 名要清晰、明了,有明確含義,同時使用完整的單詞或大家基本可以理解的寫,避免使人產(chǎn)生誤解。temp可縮寫為tmp;flag可縮寫為statistic可縮寫為stat;increment可縮寫為inc;message可縮寫為msg; 13-4:對于變量命名, 取單個字符(如i、j、k...),建議除了要有具體含義外,還能表明其變量類型、數(shù)據(jù)類型等,但i、j、k作局部循環(huán)變量是允許的。int 局部變量(Local)(其它 變量 (其它 常量Width 3標(biāo)志符命5:命名規(guī)范必須與所使用的系統(tǒng)風(fēng)格保持一致,并在同一項目中統(tǒng)一,比如采用X的全小寫加下劃線的風(fēng)格或大小寫混排的方式,不要使用大小寫與下劃線混排的方式,用作特殊標(biāo)識如標(biāo)識成員變量或全局變量的和,其后加上大小寫混排的方式是允許的。Add_User不允許,add_user、AddUser、m_AddUser?3-1:除非必要,不要用數(shù)字或較奇怪的字符來定義標(biāo)識符。#define_EXAMPLE_0_TEST_#define_EXAMPLE_1_TEST_voidset_sls00BYTEsls#define_EXAMPLE_UNIT_TEST_#define_EXAMPLE_ASSERT_TEST_voidset_udt_msg_sls(BYTEsls); ?3-3:用正確的反義詞組命名具有互斥意義的變量或 作的函數(shù)等add/remove begin/end create/destroyinsert/delete first/last get/releaseincrement/decrement put/getadd/delete lock/unlock open/closemin/max old/new start/stopnext/previous source/target show/hidesend/receive source/destinationcut/ up/int 3標(biāo)志符命intintadd_user(BYTE*user_name);intdelete_user(BYTE*user_name);?-:除了編譯開關(guān)頭文件等特殊應(yīng)用,應(yīng)避免使用P_ST之類以下劃線開始和結(jié)尾的定義。 4可讀可讀word=(high<<8)|low if((a|b)&&(a& if((a|b)<(c&d))high8|lowa|b&&a&ca|b<c&dhigh<<8|low=(high<<8)|low,a|b&&a&c=(a|b)&&(a&c),a|b<c&d=a|(b<c)&d,(3):避免使用不易理解的數(shù)字,用有意義的標(biāo)識來替代。涉及物理狀態(tài)或者含有物理意義的常量,不應(yīng)直接使用數(shù)字,必須用有意義的枚舉或宏來代替。if(Trunk[index].trunk_state=={Trunk[index].trunk_state=...//program}#defineTRUNK_IDLE#defineTRUNK_BUSYif(Trunk[index].trunk_state=={Trunk[index].trunk_state= 4可讀...//program}?4-1:源程序中關(guān)系較為緊密的代碼應(yīng)盡可能相鄰。rect.length=10;char_poi=str;rect.width=5;rect.length=rect.width=5char_poi=?4-2:不要使用難懂的技巧性很高的語句,除非很有必要時。*stat_poi+++=*++stat_poi+=*stat_poi+= 此二語句功能相當(dāng)于“*stat_poi+++=1++*stat_poi+=1此二語句功能相當(dāng)于“*++stat_poi+=1 5變量、結(jié)變量、結(jié) RELATIONSystem_InitInput_RecPrint_RecAccess,注:RELATION為操作關(guān)系;System_Init、Input_Rec、Print_Rec、Stat_Score示修改,Access表示。其中,函數(shù)Input_Rec、Stat_Score都可修改變量Score,故此變量將引起函數(shù)間較 說明:特別是在C/C++ 5變量、結(jié) ?-的變量。void{registerintindex_AX=0x4000;//_AXBC3.1...//program}?5-3:結(jié)構(gòu)的功能要單一,是針對一種事務(wù)的抽象。各元素應(yīng)代表同一事務(wù)的不同側(cè)面,而不應(yīng)把描述沒有關(guān)系或關(guān)系很弱的不同事務(wù)的元素放到同一結(jié)構(gòu)中。typedefstruct{unsignedcharname[8];/*student'sname*/unsignedcharage; /*student'sage*/unsignedchar /*student'ssex,asfollows/*0-FEMALE;1-MALEunsignedteacher_name[8];/*thestudentteacher'sname*/unisgnedchar /*histeachersex} 5變量、結(jié)typedefstruct{unsignedcharname[8];/*teachernameunisgnedchar /*teachersex,asfollows/*0-FEMALE;1-MALE}typedefstruct{unsignedcharname[8]; /*student'sname*/unsignedcharage; /*student'sage*/unsignedchar /*student'ssex,asfollows/*0-FEMALE;1-MALEunsignedintteacher_ind;/*histeacherindex}?5-4:不要設(shè)計面面俱到、非常靈活的數(shù)據(jù)結(jié)構(gòu)。 ?5-5:不同結(jié)構(gòu)間的關(guān)系不要過于復(fù)雜。typedef {unsignedcharname[8];unsignedcharaddr[40];unsignedcharsex;unsignedcharcity[15]; typedef {unsignedcharname[8];unsignedcharage;unsignedchar 5變量、結(jié)typedef {unsignedcharname[8];unsignedcharage;unsignedcharsex;unsignedcharaddr[40];unsignedcharcity[15];unsignedchar ?- typedef {unsignedcharname[8];unsignedcharage;unsignedcharsex; typedef {unsignedcharaddr[40];unsignedcharcity[15];unsignedchar; typedef { 5變量、結(jié)?-typedefstructEXAMPLE_STRU{unsignedintvalid:;unsignedint :}typedefstruct{unsignedintvalid:1;unsignedintset_ :1;;}?5-8:結(jié)構(gòu)的設(shè)計要盡量考慮向前兼容和以后的版本升級,并為某些未來可能的應(yīng)用保留余地(如預(yù)留一些空間等)好的前向兼容,那么在產(chǎn)品設(shè)計之初就應(yīng)為以后版本升級保留一定余地,并且在產(chǎn)品升級時必須考慮前一版本的各種特性。?5-9:留心具體語言及編譯器處理不同數(shù)據(jù)類型的原則及有關(guān)細(xì)節(jié)。?5-10:編程時,要注意數(shù)據(jù)類型的強制轉(zhuǎn)換?5-11:對編譯系統(tǒng)默認(rèn)的數(shù)據(jù)類型轉(zhuǎn)換,也要有充分的認(rèn)識。 5變量、結(jié)charunsignedshortintchr=-exam=chrexam0xFFFF?5-12:盡量減少沒有必要的數(shù)據(jù)類型默認(rèn)轉(zhuǎn)換與強制轉(zhuǎn)換?5-13:合理地設(shè)計數(shù)據(jù)并使用自定義數(shù)據(jù)類型,避免數(shù)據(jù)間進(jìn)行不必要的類型轉(zhuǎn)換。?-1:對自定義數(shù)據(jù)類型進(jìn)行恰當(dāng)命名,使它成為自描述性的,以提高代碼可讀性。注意其命名方式在同一產(chǎn)品中的統(tǒng)一。 typedefunsignedcharBYTE;typedefunsignedshortWORD;typedefunsignedint 下面 typedeffloatDISTANCE;typedeffloatSCORE;?-1:當(dāng) 用于分布式環(huán)境或不同間通信環(huán)境的數(shù)據(jù)結(jié)構(gòu)時,必須考慮機器的字節(jié)順序、使用的位域及字節(jié)對齊等問題。說明:比如In CPU與68360CPU,在處理位域及整數(shù)時,其在內(nèi)存存放的“順序” unsignedshortintexam;typedefstructEXAM_BIT_STRU /* 68360unsignedintA1:1;/*bit unsignedintA2:1;/*bit 5變量、結(jié)unsignedintA3:1;/*bit }如下是 內(nèi)存: ...(從低到高,以字節(jié)為單位examexam低字節(jié)exam012...(68360CPU內(nèi)存: ...(從低到高,以字節(jié)為單位examexam高字節(jié)exam765...(long型數(shù)(long1)在內(nèi)存中的位置正好與內(nèi)存的字邊界對齊時,CPUlong型數(shù)(long2)在內(nèi)存中的位置了字邊界時,CPU存取這個數(shù)就需要多次內(nèi)存,如i960cx這樣的數(shù)需讀內(nèi)存三次(BYTESHORTBYTECPU的微代碼執(zhí)行,對軟件透明,所有對齊方式下CPU的運行效率明顯快多了。 |long1|long1|long1|long1 |long2|long2|long2|long2 | 6函數(shù)、過函數(shù)、過:編寫可重入函數(shù)時,應(yīng)注意局部變量的使用(如編寫語言的可重入函數(shù)時,應(yīng)使用即缺省態(tài)局部變量或寄存器變量)。16-4:編寫可重入函數(shù)時,若使用全局變量,則應(yīng)通過關(guān)中斷、信號量(即P、V操作)等 unsignedintexample(intpara{unsignedintExam=para;//temp=Square_Exam(return}Exampara值,所以當(dāng)控制重新回到“temp=Square_Exam()”temp很可能不是預(yù)想中的結(jié)果。此函數(shù)應(yīng)如下改進(jìn)。unsignedintexample(intpara{unsignedint 6函數(shù)、過 //若申請不到“信號量說明另外的進(jìn)程正處于Exam=para; //給Exam賦值并計算其平方過程中(即正在使用此temp=Square_Exam();//信號本進(jìn)程必須等待其釋放信號后,才可繼 //續(xù)執(zhí)行。若申請到信號,則可繼續(xù)執(zhí)行,但其//return}16-5:在同一項目組應(yīng)明確規(guī)定對接口函數(shù)參數(shù)的檢查應(yīng)由函數(shù)的調(diào)用者負(fù)責(zé)還是由接口說明:對于模塊間接口函數(shù)的參數(shù)的檢查這一問題,往往有兩個現(xiàn)象,即:要么是調(diào)用者和被調(diào)用者對參數(shù)均不作檢查,結(jié)果就遺漏了檢查這一必要的處理過程,造成問題隱患;要么就是調(diào)用者和被調(diào)用者均對參數(shù)進(jìn)行檢查,這種情況雖不?6-1:防止將函數(shù)的參數(shù)作為工作變量。 voidsum_data(unsignedintnum,int*data,int*sum{unsignedint*sum=for(count=0;count<num;{*sum+=data[count];//sum}}voidsum_data(unsignedintnum,int*data,int*sum 6函數(shù)、過{unsignedintcount;intsum_temp;sum_temp=for(count=0;count<num;count{sum_temp+=}*sum=}?6-2:函數(shù)的規(guī)模盡量限制在200行以內(nèi)。?6-3:一個函數(shù)僅完成一件功能。?6-4:為簡單功能編寫函數(shù)。 value=(a>b)?a:bintmax(inta,int{return((a>b)?a:}value=max(a,#defineMAX(a,b)(((a)>(b))?(a):value=MAX(a, 6函數(shù)、過?6-5:不要設(shè)計多用途面面俱到的函數(shù)。 ?6-6:函數(shù)的功能應(yīng)該是可以預(yù)測的,也就是只要輸入數(shù)據(jù)相同就應(yīng)產(chǎn)生同樣的輸出。 。在C/C++語中,函數(shù)的static局部變量是函數(shù)的內(nèi)部 當(dāng)某函數(shù)的返回值為指針類型時,則必須是STATIC的局部變量的地址作為返回值,若為AUTO類,則返回為錯針。unsignedintinteger_sum(unsignedintbase{unsignedintstaticunsignedintsum=0staticautofor(index=1;index<=base;{sum+=}return}?6-7:盡量不要編寫依賴于其他函數(shù)內(nèi)部實現(xiàn)的函數(shù)。體語言的語法要求與編譯器功能,基本就可以防止這種情況發(fā)生。但在匯編語言中,由于Input_Msg的具體實現(xiàn),這種程序是非結(jié)構(gòu)化的,難以...procPrint_Msg過程(函數(shù)...jmp... 6函數(shù)、過procInput_Msg過程(函數(shù)......?6-8:避免設(shè)計多參數(shù)函數(shù),不使用的參數(shù)從接口中去掉?6-9:非調(diào)度函數(shù)應(yīng)減少或防止控制參數(shù),盡量只使用數(shù)據(jù)參數(shù)。增加了函數(shù)間的控制耦合,很可能使函數(shù)間的耦合度增大,并使函數(shù)的功能不唯一。示例:如下函數(shù)構(gòu)造不太合理。intadd_sub(inta,intb,unsignedchar {if =={return(a+}{return }}intadd(inta,intb{return(a+} 6函數(shù)、過intsub(inta,intb{return }?6-10:檢查函數(shù)所有參數(shù)輸入的有效性。?6-11:檢查函數(shù)所有非參數(shù)輸入的有效性,如數(shù)據(jù)文件、公共變量等。?6-12:函數(shù)名應(yīng)準(zhǔn)確描述函數(shù)的功能。?-3:使用動賓詞組為執(zhí)行某操作的函數(shù)命名。如果是方法,可以只有動詞(名詞是對象本身)。voidprint_record(unsignedintrec_ind);intinput_record(void);unsignedcharget_current_color(void)建議6-14:避免使用無意義或含義不清的動詞為函數(shù)命名。process、handle等為函數(shù)命名,因為這些動詞并沒有建議6-15:函數(shù)的返回值要清楚、明了,讓使用者不容易忽視錯誤情況。?-1:除非必要,最好 與函數(shù)返回值類型不同的變量,以編譯系統(tǒng)默認(rèn)的轉(zhuǎn)換方式或強制的轉(zhuǎn)換方式作為返回值返回。?6-17:讓函數(shù)在調(diào)用點顯得易懂、容易理解?6-18:在調(diào)用函數(shù)填寫參數(shù)時,應(yīng)盡量減少沒有必要的默認(rèn)數(shù)據(jù)類型轉(zhuǎn)換或強制數(shù)據(jù)類型轉(zhuǎn)換 6函數(shù)、過?6-19:避免函數(shù)中不必要語句,防止程序中 代碼。 ?6-20:防止把沒有關(guān)聯(lián)的語句放到一個函數(shù)中。一個函數(shù)或過程中。隨機內(nèi)聚給函數(shù)或過程的、測試及以后的升級等造成了不便,同時也使函數(shù)或過程的功能不明確。使用隨機內(nèi)聚函數(shù),常常容易出現(xiàn)在一種應(yīng)用場合需要voidInit_Var(void{Rect.length=Rect.width=0;/*初始化矩形的長與寬Point.x=Point.y= /*初始化“點”的坐標(biāo)}voidInit_Rect(void{Rect.length=Rect.width=0;/*初始化矩形的長與寬}voidInit_Point(void{Point.x=Point.y= /*初始化“點”的坐標(biāo) 6函數(shù)、過}?6-21:如果 碼重復(fù)做同一件事情,那么在函數(shù)的劃分上可能存在問題 ?-2:功能不明確較小的函數(shù),特別是僅有一個上級函數(shù)調(diào)用它時,應(yīng)考慮把它合并到上級函數(shù)中,而不必單獨存在。?6-23:設(shè)計高扇入、合理扇出(小于7)的函數(shù)統(tǒng)資源如堆棧空間等造成壓力。函數(shù)較合理的扇出(調(diào)度函數(shù)除外)3-5。扇出太大,?6-24:減少函數(shù)本身或函數(shù)間的遞歸調(diào)用。說明:遞歸調(diào)用特別是函數(shù)間的遞歸調(diào)用(如->A,影響程序的可理解性;遞歸調(diào)用一般都占用較多的系統(tǒng)資源(如??臻g;遞歸調(diào)用對程序的測試有一定影響。故除非為某些算法或功能的實現(xiàn)方便,應(yīng)減少沒必要的遞歸調(diào)用。?-2:仔細(xì)分析模塊的功能及性能需求,并進(jìn)一步細(xì)分,同時若有必要畫出有關(guān)數(shù)據(jù)流圖,據(jù)此來進(jìn)行模塊的函數(shù)劃分與組織。 6函數(shù)、過?-2:模的低耦提獨代、效率和可 性。優(yōu)函數(shù)結(jié)構(gòu)時要遵守以原則: ?6-27:在多任務(wù)操作系統(tǒng)的環(huán)境下編程,要注意函數(shù)可重入性的構(gòu)造。重入性是非常重要的,因為這是多個進(jìn)程可以共用此函數(shù)的必要條件。另外,編譯器是否提供可重入函數(shù)庫,與它所服務(wù)的操作系統(tǒng)有關(guān),只有操作系統(tǒng)是多任務(wù)時,編譯器才有可能提供可重入函數(shù)庫。如S下BC和C等就不具備可重入函數(shù)庫,因為DS是單用戶單任務(wù)操作系統(tǒng)。?6-28:避免使用BOOL參數(shù)。BOOL參數(shù)值無意義,TURE/FALSE的含義是非常模糊的,在調(diào)?6-29:對于提供了返回值的函數(shù), 時最好使用其返回值?6-30:當(dāng)一個過程(函數(shù))中對較長變量(一般是結(jié)構(gòu)的成員)有較多 #definepSOCKDATA 7可測可測:在同一項目組或產(chǎn)品組內(nèi),要有一套統(tǒng)一的為集成測試與系統(tǒng)聯(lián)調(diào)準(zhǔn)備的調(diào)測開關(guān)及相應(yīng)打印函數(shù),并且要有詳細(xì)的說明。:在同一項目組或產(chǎn)品組內(nèi),調(diào)測打印出的信息串的格式要有統(tǒng)一的形式。信息串中至少要有所在模塊名(或源文件名)及行號。:編程的同時要為單元測試選擇恰當(dāng)?shù)臏y試點,并仔細(xì)構(gòu)造測試代碼、測試用例,同時給出明確的注釋說明。測試代碼部分應(yīng)作為(模塊中的)一個子模塊,以方便測試代碼在模塊中的安裝與拆卸(通過調(diào)測開關(guān))。:在進(jìn)行集成測試系統(tǒng)聯(lián)調(diào)之前,要構(gòu)造好測試環(huán)境、測試項目及測試用例,同時仔細(xì)分析并優(yōu)化測試用例,以提高測試效率。 C(NULL0L)#ifdef_EXAM_ASSERT_TEST_//若使用斷言測試voidexam_assert(char*file_name,unsignedintline_no{printf("\n[EXAM]Assertfailed:%s,line%u\n",file_name,line_no);abort( 7可測}#defineEXAM_ASSERT(conditionif(conditionelse FILE #else#defineEXAM_ASSERT(condition)#endif/*endofASSERT 防錯程序,而不是斷言。如某模塊收到其它模塊或鏈的消息后,要對消息的合理性進(jìn)行intexam_fun(unsignedchar*str{EXAM_ASSERT(str!=NULL...//otherprogram}示例:假設(shè)某通信模塊在設(shè)計時,準(zhǔn)備提供“無連接”和“連接”這兩種業(yè)務(wù)。但當(dāng)前 7可測#defineEXAM_CONNECTIONLESS0#define 1intmsg_process(EXAM_MESSAGE*msg{unsignedcharservice;/*messageserviceclassEXAM_ASSERT(msg!=NULLservice=get_msg_service_class(msgEXAM_ASSERT(service!=EXAM_CONNECTION...//otherprogram}17-11:用斷言對程序開發(fā)環(huán)境(piler/Hardware)對編譯器提供的功能及特性假設(shè)可用斷言檢查,原因是軟件最終產(chǎn)品(即運行代碼或機器碼與編譯器已沒有任何直接關(guān)系,即軟件運行過程中(注意不是編譯過程中不會也不應(yīng)該對編譯器的功能提出任何需求。int2,如下。EXAM_ASSERT(sizeof(int)==2);:正式軟件產(chǎn)品中應(yīng)把斷言及其它調(diào)測代碼去掉(即把有關(guān)的調(diào)測開關(guān)關(guān)掉)說明:加快軟件運行速度。:在軟件系統(tǒng)中設(shè)置與取消有關(guān)測試 ,不能對軟件實現(xiàn)的功能等產(chǎn)生影響說明:即有測試代碼的軟件和關(guān)掉測試代碼的軟件,在功能行為上應(yīng)一致。 7可測的不同源文件,以減少17-15:軟件的DEBUG版本和版本應(yīng)該統(tǒng)一,不允許分家,并且要時刻注意保證兩個?7-1:在編寫代碼之前,應(yīng)預(yù)先設(shè)計好程序調(diào)試與測試的方法和,并設(shè)計好各種調(diào)測開關(guān)及說明:程序的調(diào)試與測試是軟件生存周期中很重要的一個階段,如何對軟件進(jìn)行較全面、高率的測試并盡可能地找出軟件中的錯誤就成為很關(guān)鍵的問題。因此在編寫源代碼之前,測試及系統(tǒng)聯(lián)調(diào)提供方便。?7-2:調(diào)測開關(guān)應(yīng)分為不同級別和類型。說明:調(diào)測開關(guān)的設(shè)置及分類應(yīng)從以下幾方面考慮:針對模塊或系統(tǒng)某部分代碼的調(diào)測;軟件功能的調(diào)測,并且便于模塊的單元測試、系統(tǒng)聯(lián)調(diào)等。?7-3:編寫防錯程序,然后在處理錯誤之后可用斷言宣布發(fā)生錯誤 #ifdef_EXAM_ASSERT_TEST_/*Notice:thisfunctiondoesnotcall'abort'toexitprogram*/voidassert_report(char*file_name,unsignedintline_no){printf("\n[EXAM]ErrorReport:%s,line%u\n",file_name,line_no);}#defineASSERT_REPORT(conditionif(conditionelseassert_report FILE 7可測#else#defineASSERT_REPORT(condition)#endif/*endofASSERTintmsg_handle(unsignedcharmsg_name,unsignedchar*msg{switch(msg_name{caseMSG_ONEreturnASSERT_REPORT(FALSEreturn}} 8程序效程序效的角度上的系統(tǒng)效率;局部效率是站在模塊或函數(shù)角度上的效率;時間效率是程序處理輸入任務(wù)所需的時間長短;空間效率是程序所需內(nèi)存空間,如機器代碼空間大小、數(shù)據(jù)空間大小、??臻g大小等。:通過對系統(tǒng)數(shù)據(jù)結(jié)構(gòu)的劃分與組織的改進(jìn),以及對程序算法的優(yōu)化來提高空間效率。typedefunsignedcharBYTE;typedefunsignedshortWORD;typedefstructBYTEname[8];BYTEage;BYTEsex;BYTEclass;BYTEsubject;floatscore;}typedefstruct{ 8程序效BYTEname[8];BYTEage;BYTEsex;BYTEclass;}typedefstruct{WORDstudent_index;BYTEsubject;floatscore;}for(ind=0;ind<MAX_ADD_NUMBER;{sum+=back_sum=sum;/*backupsum}語句“back_sum=sum;forfor(ind=0;ind<MAX_ADD_NUMBER;{sum+=}back_sum=sum;/*backupsum?8-1:仔細(xì)分析有關(guān)算法,并進(jìn)行優(yōu)化。?8-2:仔細(xì)考查、分析系統(tǒng)及模塊處理輸入(如事務(wù)、消息等)的方式,并加以改進(jìn)。?- 8程序效?8-4:編程時,要隨時留心代碼效率;優(yōu)化代碼時,要考慮周全。?8-5:不應(yīng)花過多的時間拼命地提高調(diào)用不很頻繁的函數(shù)代碼效率。 ?8-6:要仔細(xì)地構(gòu)造或直接用匯編編寫調(diào)用頻繁或性能要求極高的函數(shù)。?-局變量,來提高空間效率。?8-8:在多重循環(huán)中,應(yīng)將最忙的循環(huán)放在最內(nèi)層。for(row=0;row<100;{for(col=0;col<5;{sum+=}}for(col=0;col<5;{for(row=0;row<100;{sum+=}} 8程序效?8-9:盡量減少循環(huán)嵌套層次。?8-10:避免循環(huán)體內(nèi)含判斷語句,應(yīng)將循環(huán)語句置于判斷語句的代碼塊之中。for(ind=0;ind<MAX_RECT_NUMBER;{if(data_type=={area_sum+=}{rect_length_sum+=rect[ind].length;rect_width_sum+=rect[ind].width;}}if(data_type=={for(ind=0;ind<MAX_RECT_NUMBER;{area_sum+=}}{for(ind=0;ind<MAX_RECT_NUMBER;{rect_length_sum+=rect[ind].length;rect_width_sum+=rect[ind].width;} 8程序效}?8-11:盡量用乘法或其它方法代替除法,特別是浮點運算中的除法#definePAIradius=circle_length/(2*#definePAI_RECIPROCAL(1/3.1416radius=circle_length*PAI_RECIPROCAL/?8-12:不要一味追求緊湊的代碼。 9質(zhì)量保質(zhì)量保 說明:在實際編程過程中,稍不留心就會出現(xiàn)在一個模塊中釋放了某個內(nèi)存塊(C語言6:過程函數(shù)中申請的(為打開文件而使用的)文件句柄,在過程函數(shù)退出之前要關(guān)閉。生。這類錯誤往往會引起很嚴(yán)重,且難以定位。typedefunsignedcharintexample_fun(BYTEgt_len,BYTE*gt_code{BYTEgt_buf=(BYTE*)malloc...//programcode,includecheckgt_bufifornot 9質(zhì)量保/*globaltitlelengtherror*/if(gt_len>MAX_GT_LENGTH){returnGT_LENGTH_ERROR;}...//otherprogram}intexample_fun(BYTEgt_len,BYTE*gt_code{BYTEgt_buf=(BYTE*)malloc(MAX_GT_LENGTH...//programcode,includecheckgt_bufifornot/*globaltitlelengtherror*/if(gt_len>MAX_GT_LENGTH){freegt_bufgt_bufreturnGT_LENGTH_ERROR;}...//otherprogram} #defineMAX_USR_NUMunsignedchar [MAX_USR_NUM]= 9質(zhì)量保void (unsignedcharusr_no{if { [usr_no]=}} void (unsignedcharusr_no{if [usr_no-{ [usr_no-1]=}} 示例:在B型機的各模塊與操作系統(tǒng)的接口函數(shù)中,有一個要由各模塊負(fù)責(zé)編寫的初始化 。以下示例引自B型曾出現(xiàn)過的實際代碼,其中使用了FID_FETCH_DATA與FID_INITIAL初始化消息類型,注意B型機的系統(tǒng)是在 9質(zhì)量保MIDintFARSYS_ALARM_proc(FIDfunction_id,inthandle{_UIi,switch(function_id{...//programcasefor(i=0;i<MAX_ALARM_MID;{if(alarm_module_list[i]==BAM_MODULE//||(alarm_module_list[i]=={for(j=0;j<ALARM_CLASS_SUM;{FAR_MALLOC(...}}}...//programcase...//programGet_Alarm_Module( 9質(zhì)量保...//program}}由于FID_INITIAL是在FID_FETCH_DATA之前執(zhí)行的,而初始化alarm_module_list是在FID_FETCH_DATA中進(jìn)行的,故在FID_INITIAL中(**) alarm_module_list變量時,它還沒有被初始化。這是個嚴(yán)重錯誤。Get_Alarm_ModuleFID_INITIAL中(**)之前;要 :要時刻注意易 的操作符。當(dāng)編完程序后,應(yīng)從頭至尾檢查一遍這些操作符,以防止拼寫錯誤。 =(pmsg- & =(pmsg- && =(VALID_TASK_NO(taskno)&&DATA_NOT_ZERO(stat_data =(VALID_TASK_NO(taskno)&DATA_NOT_ZERO(stat_data 9質(zhì)量保 說明:gotogoto?-性和可重用性。?9-2:除非為了滿足特殊需求,避免使用嵌入式匯編。 ?9-4:精心構(gòu)造算法,并對其性能、效率 試?9-5

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論