c++程序設(shè)計(jì)規(guī)范_第1頁(yè)
c++程序設(shè)計(jì)規(guī)范_第2頁(yè)
c++程序設(shè)計(jì)規(guī)范_第3頁(yè)
c++程序設(shè)計(jì)規(guī)范_第4頁(yè)
c++程序設(shè)計(jì)規(guī)范_第5頁(yè)
已閱讀5頁(yè),還剩30頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

c++程序設(shè)計(jì)規(guī)范c++程序設(shè)計(jì)規(guī)范c++程序設(shè)計(jì)規(guī)范c++程序設(shè)計(jì)規(guī)范編制僅供參考審核批準(zhǔn)生效日期地址:電話:傳真:郵編:ANSIC/C++程序設(shè)計(jì)規(guī)范文件編號(hào):SDSI-QG-28起草部門:審核人:批準(zhǔn)人:批準(zhǔn)日期:2008年4月版本標(biāo)識(shí):版目錄TOC\o"1-3"\h\z1 目的 32 定義 33 程序設(shè)計(jì)要求 34 程序風(fēng)格定義 4 編程風(fēng)格 4 書寫風(fēng)格 4 程序結(jié)構(gòu) 4 程序注釋 5 聲明 6 臨時(shí)變量 6 一些規(guī)則及建議: 65 命名規(guī)范 6 詳細(xì)定義 7 函數(shù)(Function) 7 變量命名規(guī)范 7 常用變量的規(guī)定: 8 類定義規(guī)范 8 類的命名 8 類的注釋 8 類的聲明 9目的為使整個(gè)系統(tǒng)保持統(tǒng)一和一致的編程風(fēng)格及技術(shù),提高程序代碼的規(guī)范化程度,制定該部分的規(guī)范。這些規(guī)范可以提高編碼質(zhì)量、增強(qiáng)可讀性、提高排錯(cuò)的容易程度、加強(qiáng)可維護(hù)性、以及提高代碼的可重用性和可移植性。定義程序塊:是整個(gè)C/C++語(yǔ)言程序中完成某一細(xì)分功能的具有相對(duì)獨(dú)立性的一段程序,其主要內(nèi)容包括注釋、變量定義及程序正文三部分組成。子程序塊:程序塊中的某一細(xì)分功能的程序塊稱為子程序塊。臨時(shí)變量:臨時(shí)變量是每次賦值的作用域較小,一般不應(yīng)超過(guò)五行程序。臨時(shí)變量的名字本身只是說(shuō)明了該變量是一個(gè)臨時(shí)的操作數(shù),不具有任何意義,但在某一作用域內(nèi)代表不同的具體含義。程序設(shè)計(jì)要求據(jù)所確定的標(biāo)準(zhǔn)進(jìn)行程序設(shè)計(jì)。二、模塊內(nèi)的耦合度要高,模塊間的耦合度要低。在修改一個(gè)模塊時(shí),盡量不要對(duì)其它模塊造成影響,若影響較大,有必要重新規(guī)劃模塊。三、每個(gè)程序模塊的行數(shù)不限,但對(duì)于程序模塊中相對(duì)獨(dú)立性較高的程序塊最好作成函數(shù),每個(gè)函數(shù)的代碼行數(shù)原則上不超過(guò)200行,經(jīng)常使用的函數(shù)最好做成函數(shù)庫(kù),必須保證在整個(gè)系統(tǒng)中同名的函數(shù)有相同的定義。四、盡量為程序塊加上明確的漢語(yǔ)注釋。對(duì)于較復(fù)雜的程序或算法需要注釋文檔,并在程序中注明注釋文檔及在文檔中注明程序名。開(kāi)發(fā)規(guī)范風(fēng)格規(guī)范縮進(jìn)風(fēng)格概述縮進(jìn)用于提高代碼的可閱讀性,縮進(jìn)通常采用TAB鍵來(lái)控制縮進(jìn)風(fēng)格,但為了不同TAB值的問(wèn)題,縮進(jìn)采用空格縮進(jìn)。在UE中,通常將TAB設(shè)置成為2個(gè)空格。要求描述程序采用縮進(jìn)風(fēng)格,在需要縮進(jìn)的地方使用2個(gè)空格進(jìn)行縮進(jìn)。函數(shù)或過(guò)程的開(kāi)始、結(jié)構(gòu)的定義及循環(huán)、判斷等語(yǔ)句中的代碼都要采用縮進(jìn)風(fēng)格,case語(yǔ)句下的情況處理語(yǔ)句也要遵從語(yǔ)句縮進(jìn)要求。示例無(wú)代碼塊分隔概述相對(duì)獨(dú)立的短代碼、變量定義需要分隔開(kāi),在讀代碼時(shí)可以方便的區(qū)分出獨(dú)立代碼。要求描述在代碼之間、變量定義之后使用一行空行來(lái)分隔代碼,用于區(qū)分代碼。示例if(!valid_ni(ni)){.../*programcode*/}repssn_ind=ssn_data[index].repssn_index;repssn_ni=ssn_data[index].ni;長(zhǎng)語(yǔ)句分隔概述通常情況下屏幕長(zhǎng)度可以容納超過(guò)80例字符,但為適應(yīng)多種屏幕(如VI),且一行過(guò)長(zhǎng)大多數(shù)人心理無(wú)法承受,所以長(zhǎng)語(yǔ)句要分隔。大多數(shù)情況下建議單行代碼長(zhǎng)度不要超過(guò)80個(gè)字符,通常情況下可以使用各種方法縮減單行代碼。要求描述較長(zhǎng)的語(yǔ)句(>80字符)要分成多行書寫,長(zhǎng)表達(dá)式要在低優(yōu)先級(jí)操作符處劃分新行,操作符放在新行之首,劃分出的新行要進(jìn)行適當(dāng)?shù)目s進(jìn),使排版整齊,語(yǔ)句可讀。示例單條語(yǔ)句:=NO7_TO_STAT_PERM_COUNT_LEN+STAT_SIZE_PER_FRAM*sizeof(_UL);act_task_table[frame_id*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)&&(n7stat_stat_item_valid(stat_item))&&(act_task_table[taskno].result_data!=0));循環(huán)、判斷類:if((taskno<max_act_task_number)&&(n7stat_stat_item_valid(stat_item))){.../*programcode*/}for(i=0,j=0;(i<BufferKeyword[word_index].word_length)&&(j<;i++,j++){.../*programcode*/}for(i=0,j=0;(i<first_word_length)&&(j<second_word_length);i++,j++){.../*programcode*/}函數(shù)參數(shù):n7stat_str_compare((BYTE*)&stat_object,(BYTE*)&(act_task_table[taskno].stat_object),sizeof(_STAT_OBJECT));n7stat_flash_act_duration(stat_item,frame_id*STAT_TASK_CHECK_NUMBER+index,stat_object);單行單句概述部分代碼比較短,有些代碼就多條語(yǔ)句寫在一行,容易造成閱讀困難。要求描述一行代碼只允許有一個(gè)語(yǔ)句。示例錯(cuò)誤風(fēng)格:=0;=0;正確風(fēng)格:=0;=0;判斷跳轉(zhuǎn)關(guān)鍵字單行概述if、for、do、while、case、switch、default等關(guān)鍵字需要采用單行語(yǔ)句來(lái)方便閱讀。要求描述if、for、do、while、case、switch、default等語(yǔ)句自占一行,且if、for、do、while等語(yǔ)句的執(zhí)行語(yǔ)句部分無(wú)論多少都要加括號(hào){}。示例if(pUserCR==NULL){return;}代碼塊分隔符概述代碼關(guān)鍵字中有互相對(duì)應(yīng)的分隔符如{},此分隔符用于區(qū)分代碼,可以有多種顯示風(fēng)格,并且也各有優(yōu)點(diǎn),但本規(guī)范只支持下列風(fēng)格。要求描述程序塊的分界符(如C/C++語(yǔ)言的大括號(hào)‘{’和‘}’)應(yīng)各獨(dú)占一行并且位于同一列,同時(shí)與引用它們的語(yǔ)句左對(duì)齊。在函數(shù)體的開(kāi)始、類的定義、結(jié)構(gòu)的定義、枚舉的定義以及if、for、do、while、switch、case語(yǔ)句中的程序都要采用如上的縮進(jìn)方式。示例for(...){.../*programcode*/}if(...){.../*programcode*/}voidexample_fun(void){.../*programcode*/}空格使用概述在程序中有條件的使用空格可以使代碼更易閱讀,在已經(jīng)非常清晰的語(yǔ)句中沒(méi)有必要再留空格,如果語(yǔ)句已足夠清晰則括號(hào)內(nèi)側(cè)(即左括號(hào)后面和右括號(hào)前面)不需要加空格,多重括號(hào)間不必加空格,因?yàn)樵贑/C++語(yǔ)言中括號(hào)已經(jīng)是最清晰的標(biāo)志了。在長(zhǎng)語(yǔ)句中,如果需要加的空格非常多,那么應(yīng)該保持整體清晰,而在局部不加空格。給操作符留空格時(shí)不要連續(xù)留兩個(gè)以上空格。要求描述在兩個(gè)以上的關(guān)鍵字、變量、常量進(jìn)行對(duì)等操作時(shí),它們之間的操作符之前、之后或者前后要加空格;進(jìn)行非對(duì)等操作時(shí),如果是關(guān)系密切的立即操作符(如->),后不應(yīng)加空格。示例(1)逗號(hào)、分號(hào)只在后面加空格。inta,b,c;(2)比較操作符,賦值操作符"="、"+=",算術(shù)操作符"+"、"%",邏輯操作符"&&"、"&",位域操作符"<<"、"^"等雙目操作符的前后加空格。if(current_time>=MAX_TIME_VALUE)a=b+c;a*=2;a=b^2;(3)"!"、"~"、"++"、"--"、"&"(地址運(yùn)算符)等單目操作符前后不加空格。*p='a';/*內(nèi)容操作"*"與內(nèi)容之間*/flag=!isEmpty;/*非操作"!"與內(nèi)容之間*/p=&mem;/*地址操作"&"與內(nèi)容之間*/i++;/*"++","--"與內(nèi)容之間*/(4)"->"、"."前后不加空格。p->id=pid;/*"->"指針前后不加空格*/(5)if、for、while、switch等與后面的括號(hào)間應(yīng)加空格,使if等關(guān)鍵字更為突出、明顯。if(a>=b&&c>d)注釋規(guī)范注釋定義概述注釋關(guān)鍵字可以有多行注釋和單行注釋,可以使用/**/、文件、makefile等)頭部應(yīng)進(jìn)行注釋,注釋必須列出:版權(quán)說(shuō)明、版本號(hào)、生成日期、作者、內(nèi)容、功能、與其它文件的關(guān)系、修改日志等,頭文件的注釋中還應(yīng)有函數(shù)功能簡(jiǎn)要說(shuō)明。源文件頭部應(yīng)進(jìn)行注釋,列出:版權(quán)說(shuō)明、版本號(hào)、生成日期、作者、模塊目的/功能、主要函數(shù)及其功能、修改日志等。示例下面這段頭文件的頭注釋比較標(biāo)準(zhǔn),當(dāng)然,并不局限于此格式,但上述信息建議要包含在內(nèi)。/*************************************************Copyright(C),1988-1999,中國(guó)網(wǎng)通集團(tuán)系統(tǒng)集成有限公司.Filename:History:Date:Author:Modification:2....*************************************************/說(shuō)明:Description一項(xiàng)描述本文件的內(nèi)容、功能、內(nèi)部各部分之間的關(guān)系及本文件與其它文件關(guān)系等。History是修改歷史記錄列表,每條修改記錄應(yīng)包括修改日期、修改者及修改內(nèi)容簡(jiǎn)述。函數(shù)頭注釋概述函數(shù)頭的注釋幫助閱讀者了解函數(shù)的功能、算法、相應(yīng)的性能。要求描述函數(shù)頭部應(yīng)進(jìn)行注釋,列出:函數(shù)的目的/功能、輸入?yún)?shù)、輸出參數(shù)、返回值、調(diào)用關(guān)系(函數(shù)、表)、性能等。對(duì)于性能描述,相對(duì)簡(jiǎn)單的計(jì)算函數(shù)可以不描述性能指標(biāo)。示例示例:下面這段函數(shù)的注釋比較標(biāo)準(zhǔn),當(dāng)然,并不局限于此格式,但上述信息建議要包含在內(nèi)。/*************************************************Function:.),建議除了要有具體含義外,還能表明其變量類型、數(shù)據(jù)類型等,但i、j、k作局部循環(huán)變量是允許的。示例temp可縮寫為tmp;flag可縮寫為flg;statistic可縮寫為stat;increment可縮寫為inc;message可縮寫為msg;風(fēng)格概述命名規(guī)范必須與所使用的系統(tǒng)風(fēng)格保持一致,并在同一項(xiàng)目中統(tǒng)一。要求描述采用UNIX的全小寫加下劃線的風(fēng)格或大小寫混排的方式,不要使用大小寫與下劃線混排的方式,用作特殊標(biāo)識(shí)如標(biāo)識(shí)成員變量或全局變量的m_和g_,其后加上大小寫混排的方式是允許的。除非必要,不要用數(shù)字或較奇怪的字符來(lái)定義標(biāo)識(shí)符。示例錯(cuò)誤風(fēng)格:#define_EXAMPLE_0_TEST_#define_EXAMPLE_1_TEST_voidset_sls00(BYTEsls);正確風(fēng)格:#define_EXAMPLE_UNIT_TEST_#define_EXAMPLE_ASSERT_TEST_voidset_udt_msg_sls(BYTEsls);過(guò)程規(guī)范返回值概述對(duì)于函數(shù)的返回值要進(jìn)行全面的判斷,由于返回值判斷不周可能會(huì)導(dǎo)致程序出錯(cuò)但沒(méi)有正確的報(bào)告。要求描述對(duì)所調(diào)用函數(shù)的錯(cuò)誤返回碼要仔細(xì)、全面地處理。示例無(wú)過(guò)程長(zhǎng)度概述一個(gè)函數(shù)的代碼行是沒(méi)有限制的,但為了容易閱讀代碼長(zhǎng)度應(yīng)限制在兩屏可觀的程度,通常情況下代碼行不應(yīng)超過(guò)200行。要求描述代碼長(zhǎng)度不超過(guò)200行。示例無(wú)一個(gè)功能一個(gè)函數(shù)概述一個(gè)函數(shù)可以完成很多功能,但大多數(shù)情況下,一個(gè)函數(shù)只完成一個(gè)功能。一般通過(guò)它做什么的句式來(lái)驗(yàn)證函數(shù)是否是有效的。如果需要它做什么和什么,通常不是個(gè)好函數(shù)。在比如MAX算法,通常情況下一個(gè):語(yǔ)句就可以實(shí)現(xiàn),但用函數(shù)來(lái)實(shí)現(xiàn)在后續(xù)的維護(hù)中可以更好的進(jìn)行升級(jí)。還有一種比較極端的情況是,一個(gè)函數(shù)實(shí)現(xiàn)了過(guò)多的功能,此函數(shù)通常不易理解。要求描述一個(gè)函數(shù)僅完成一件功能。示例錯(cuò)誤例子: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);可讀性規(guī)范運(yùn)算符優(yōu)先級(jí)概述注意運(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ò)。示例word=(high<<8)|low(1)if((a|b)&&(a&c))(2)if((a|b)<(c&d))(3)如果書寫為high<<8|lowa|b&&a&ca|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ò)。使用常量代替數(shù)字概述在使用常量時(shí)程序中可以使用數(shù)字表示,但通常不易閱讀,在使用時(shí)使用常量來(lái)代替。要求描述避免使用不易理解的數(shù)字,用有意義的標(biāo)識(shí)來(lái)替代。涉及物理狀態(tài)或者含有物理意義的常量,不應(yīng)直接使用數(shù)字,必須用有意義的枚舉或宏來(lái)代替。。示例錯(cuò)誤的例子:if(Trunk[index].trunk_state==0){Trunk[index].trunk_state=1;...runk_state==TRUNK_IDLE){Trunk[index].trunk_state=TRUNK_BUSY;....(從低到高,以字節(jié)為單位)examexam低字節(jié)exam高字節(jié)內(nèi)存:0bit1bit2bit...(字節(jié)的各“位”)EXAM_BITA1A2A如下是68360CPU生成短整數(shù)及位域的方式。內(nèi)存:012...(從低到高,以字節(jié)為單位)examexam高字節(jié)exam低字節(jié)內(nèi)存:7bit6bit5bit...(字節(jié)的各“位”)EXAM_BITA1A2A說(shuō)明:在對(duì)齊方式下,CPU的運(yùn)行效率要快得多。示例:如下圖,當(dāng)一個(gè)long型數(shù)(如圖中l(wèi)ong1)在內(nèi)存中的位置正好與內(nèi)存的字邊界對(duì)齊時(shí),CPU存取這個(gè)數(shù)只需訪問(wèn)一次內(nèi)存,而當(dāng)一個(gè)long型數(shù)(如圖中的long2)在內(nèi)存中的位置跨越了字邊界時(shí),CPU存取這個(gè)數(shù)就需要多次訪問(wèn)內(nèi)存,如i960cx訪問(wèn)這樣的數(shù)需讀內(nèi)存三次(一個(gè)BYTE、一個(gè)SHORT、一個(gè)BYTE,由CPU的微代碼執(zhí)行,對(duì)軟件透明),所有對(duì)齊方式下CPU的運(yùn)行效率明顯快多了。 18162432 |long1|long1|long1|long1| ||||long2| |long2|long2|long2|| 測(cè)試性規(guī)范調(diào)測(cè)概述要求描述在同一項(xiàng)目組或產(chǎn)品組內(nèi),要有一套統(tǒng)一的為集成測(cè)試與系統(tǒng)聯(lián)調(diào)準(zhǔn)備的調(diào)測(cè)開(kāi)關(guān)及相應(yīng)打印函數(shù),并且要有詳細(xì)的說(shuō)明。調(diào)測(cè)打印出的信息串的格式要有統(tǒng)一的形式。信息串中至少要有所在模塊名(或源文件名)及行號(hào)。編程的同時(shí)要為單元測(cè)試選擇恰當(dāng)?shù)臏y(cè)試點(diǎn),并仔細(xì)構(gòu)造測(cè)試代碼、測(cè)試用例,同時(shí)給出明確的注釋說(shuō)明。測(cè)試代碼部分應(yīng)作為(模塊中的)一個(gè)子模塊,以方便測(cè)試代碼在模塊中的安裝與拆卸(通過(guò)調(diào)測(cè)開(kāi)關(guān))。在軟件系統(tǒng)中設(shè)置與取消有關(guān)測(cè)試手段,不能對(duì)軟件實(shí)現(xiàn)的功能等產(chǎn)生影響。用調(diào)測(cè)開(kāi)關(guān)來(lái)切換軟件的DEBUG版和正式版,而不要同時(shí)存在正式版本和DEBUG版本的不同源文件,以減少維護(hù)的難度。軟件的DEBUG版本和發(fā)行版本應(yīng)該統(tǒng)一維護(hù),不允許分家,并且要時(shí)刻注意保證兩個(gè)版本在實(shí)現(xiàn)功能上的一致性。在編寫代碼之前,應(yīng)預(yù)先設(shè)計(jì)好程序調(diào)試與測(cè)試的方法和手段,并設(shè)計(jì)好各種調(diào)測(cè)開(kāi)關(guān)及相應(yīng)測(cè)試代碼如打印函數(shù)等。編寫防錯(cuò)程序,然后在處理錯(cuò)誤之后可用斷言宣布發(fā)生錯(cuò)誤。示例示例:假如某模塊收到通信鏈路上的消息,則應(yīng)對(duì)消息的合法性進(jìn)行檢查,若消息類別不是通信協(xié)議中規(guī)定的,則應(yīng)進(jìn)行出錯(cuò)處理,之后可用斷言報(bào)告,如下例。#ifdef_EXAM_ASSERT_TEST_...10G1Grect_width_sum+=rect[ind].width;}}因?yàn)榕袛嗾Z(yǔ)句與循環(huán)變量無(wú)關(guān),故可如下改進(jìn),以減少判斷次數(shù)。if(data_type==RECT_AREA){for(ind=0;ind<MAX_RECT_NUMBER;ind++){area_sum+=rect_area[ind];}}else{for(ind=0;ind<MAX_RECT_NUMBER;ind++){rect_length_sum+=rect[ind].length;rect_width_sum+=rect[ind].width;}}常量預(yù)先計(jì)算概述要求描述對(duì)于長(zhǎng)使用的計(jì)算常量可以預(yù)先定義常量計(jì)算出來(lái)。示例#definePAIradius=circle_length/(2*PAI);應(yīng)如下把浮點(diǎn)除法改為浮點(diǎn)乘法。#definePAI_RECIPROCAL(1/)..xt名詞術(shù)語(yǔ).txt安裝說(shuō)明.txt運(yùn)行構(gòu)架圖模塊構(gòu)架圖數(shù)據(jù)庫(kù)模型需求列表概要設(shè)計(jì)詳細(xì)設(shè)計(jì)公共函數(shù).txt函數(shù)測(cè)試運(yùn)行構(gòu)架圖指系統(tǒng)運(yùn)行時(shí),進(jìn)程如何分布,如何交互等。單詞縮寫,指程序中用到的英文單詞要有明確的解釋,方便他人閱讀,明確具體含義??s寫指部分長(zhǎng)單詞縮寫的結(jié)果,表明縮寫的含義。每個(gè)單詞只能用一次,不得一個(gè)縮寫在不同的模塊表示不同的含義。概要設(shè)計(jì)指整個(gè)模塊如何搭建。詳細(xì)設(shè)計(jì)指每個(gè)函數(shù)如何實(shí)現(xiàn)。函數(shù)測(cè)試文檔要求填寫每個(gè)函數(shù)的測(cè)試情況,其中包括性能情況。為集成性能測(cè)試提供指導(dǎo)依據(jù)。安裝說(shuō)明要說(shuō)明對(duì)于多主機(jī)情況,應(yīng)用如何發(fā)布。源程序目錄$DP/模塊名/Makefile每個(gè)模塊使用一個(gè)編譯文件,嚴(yán)禁使用多個(gè)makfile來(lái)編譯程序,導(dǎo)致程序最后無(wú)法確認(rèn)那個(gè)是最新的編譯文件。在編寫makefile時(shí)采用最簡(jiǎn)單的方法進(jìn)行編寫,不建議編寫腳本式編譯方法。在每個(gè)程序編譯前調(diào)用indent進(jìn)行程序美化。在每個(gè)程序編譯前調(diào)用lint進(jìn)行程序深度查錯(cuò)。要注意的是部分程序在-O3的條件下無(wú)法正常運(yùn)行。$DP/模塊名Src.c相關(guān)源文件權(quán)限要求DB.pc.sc相關(guān)源文件Include.h相關(guān)頭文件Lib.動(dòng)態(tài)鏈接庫(kù)文件Obj.o目標(biāo)文件Pc->c的目標(biāo)文件$DP/COMMONarithmetic算法目錄(緩沖算法)平衡二叉樹(shù),二分法等算法的編寫。DB訪問(wèn)數(shù)據(jù)庫(kù)用到的文件.(實(shí)現(xiàn)層)(實(shí)現(xiàn)層)(邏輯層)數(shù)據(jù)庫(kù)相關(guān)操作由專人負(fù)責(zé)編寫,達(dá)到數(shù)據(jù)庫(kù)訪問(wèn)效率最優(yōu)。對(duì)于統(tǒng)計(jì)部分使用SQL較多的模塊,應(yīng)安排一人來(lái)編寫。Net網(wǎng)絡(luò)訪問(wèn),SOCKET等File文件操作Sys系統(tǒng)訪問(wèn)(實(shí)現(xiàn)層)(實(shí)現(xiàn)層)(邏輯層)Err錯(cuò)誤處理相關(guān)公共程序Timer定時(shí)器采用自己開(kāi)發(fā)編寫定時(shí)器,定時(shí)器啟動(dòng)后發(fā)現(xiàn)任務(wù)調(diào)度或者發(fā)送給adm.Log日志相關(guān)程序。(邏輯層)(實(shí)現(xiàn)層)(實(shí)現(xiàn)層)(實(shí)現(xiàn)層)(實(shí)現(xiàn)層)(實(shí)現(xiàn)層)詳見(jiàn)日志Adm總控管理目錄.前臺(tái)監(jiān)控監(jiān)聽(tīng)程序。Adm程序管理所有的程序啟動(dòng)與停止,進(jìn)程的調(diào)度等操作。Listen管理前臺(tái)訪問(wèn)后臺(tái)的監(jiān)控程序。所有程序建議采用進(jìn)程池模式進(jìn)行調(diào)度,不建議采用單任務(wù)單進(jìn)程模式。數(shù)據(jù)目錄$DT/模塊名In輸入目錄Out輸出目錄Err錯(cuò)單目錄Bak備份目錄Tmp臨時(shí)目錄可執(zhí)行程序目錄$PD/模塊名Bin存放可執(zhí)行程序參數(shù)配置目錄$PD/模塊名Etc日志目錄$PD/模塊名Log存放相關(guān)日志文件.日志文件名可以配置。所有的日志文件均通過(guò)管道傳送到日志進(jìn)程,由日志進(jìn)程記錄,管理。Debug目錄$DBG/模塊名Bin存放Debug程序?qū)ebug開(kāi)關(guān)打開(kāi)進(jìn)行編譯.示例日志錯(cuò)誤規(guī)范日志定義概述要求描述輸出要求正常日志需要記錄關(guān)鍵程序運(yùn)行信息,比如程序啟動(dòng)、關(guān)閉,處理狀態(tài)等等錯(cuò)誤日志能夠捕捉到所有告警和異常輸出信息實(shí)現(xiàn)邏輯所有日志通過(guò)公共日志管理函數(shù)輸出日志名邏輯文件名采用參數(shù)配置,動(dòng)態(tài)生成。日志文件名參數(shù)格式[模塊名]=[參數(shù)配置]模塊名每個(gè)源碼程序(.c,.pc…)都有對(duì)應(yīng)一個(gè)模塊名,一個(gè)模塊名可以對(duì)應(yīng)多個(gè)源程序。參數(shù)解析參數(shù)采用宏定義的方法。#defineERR_MED_NOEXEC"20001"#defineERR_MED_LOG_TABLE"T_ERR_MED_LOG"如此根據(jù)需要增加,并編寫相應(yīng)的獲取函數(shù)。日志表日志表名采用宏定義方式,命名規(guī)則為正常日志表:T_NORM_模塊名_LOG錯(cuò)誤日志表:T_ERR_模塊名_LOG日志文件生成邏輯日志公用函數(shù)根據(jù)參數(shù)配置生成相應(yīng)的文件名,并發(fā)送給日志輸出函數(shù),日志輸出函數(shù)根據(jù)文件名判斷文件是否打開(kāi),如果沒(méi)有打開(kāi)則打開(kāi)文件。日志消息格式正常日志正常采用如下格式[本地網(wǎng)標(biāo)識(shí)][模塊名][日志描述][時(shí)間]異常日志異常采用如下格式[本地網(wǎng)標(biāo)識(shí)][模塊名][錯(cuò)誤級(jí)別][錯(cuò)誤源文件][錯(cuò)誤行數(shù)][錯(cuò)誤類別][錯(cuò)誤編碼][錯(cuò)誤描述][時(shí)間]錯(cuò)誤類別BADFILE:適用于文件級(jí)錯(cuò)誤類別BADSYS:適用于系統(tǒng)級(jí)錯(cuò)誤類別BADDB:適用于數(shù)據(jù)庫(kù)級(jí)錯(cuò)誤類別BADPARA:適用于參數(shù)級(jí)錯(cuò)誤類別錯(cuò)誤級(jí)別DEBUG:調(diào)試信息。調(diào)試信息,供實(shí)施人員檢查錯(cuò)誤,幫助開(kāi)發(fā)人員定位錯(cuò)誤位置。INFO:普通日志。正常處理信息,供用戶察看進(jìn)度等。WARN:警告信息.主要指需要用戶日常檢查的消息。比如發(fā)現(xiàn)某個(gè)話單超長(zhǎng)需要人為處理,此部分不是一定要解決的問(wèn)題。ERRCONT:發(fā)生錯(cuò)誤,但可繼續(xù)運(yùn)行。主要指應(yīng)用參數(shù)配置有誤,但不影響其他部分運(yùn)行,此部分處理需要重新處理,必須需要用戶解決。ERRPROCHALT:發(fā)生錯(cuò)誤,導(dǎo)致進(jìn)程無(wú)法運(yùn)行,甚至coreERRAPPHALT:發(fā)生錯(cuò)誤,導(dǎo)致應(yīng)用無(wú)法運(yùn)行.ERRSYSHALT:發(fā)生錯(cuò)誤,導(dǎo)致系統(tǒng)無(wú)法運(yùn)行.消息級(jí)別在每個(gè)模塊編譯時(shí)可以定義宏消息級(jí)別,根據(jù)不同的級(jí)別有不同的消息日志輸出.比如在DEBUG級(jí),所有的消息都打印輸出。要求DBG輸出時(shí)在MAKEFILE文件增加參數(shù)“-DDEBUG”,要求DEBUG調(diào)試信息占程序總代碼量的5%左右;ERRAPPHALT級(jí)只輸出ERRAPPHALT級(jí)別消息.日志動(dòng)作日志管理進(jìn)程根據(jù)錯(cuò)誤級(jí)別的配置參數(shù)決定作何處理,是否向數(shù)據(jù)庫(kù)發(fā)送消息,是否向郵件發(fā)送消息,是否調(diào)用語(yǔ)音模塊發(fā)送消息。[ERRCONT]=[FILELOG|DBLOG|MAILLOG|SMSLOG]比如:宕機(jī)錯(cuò)誤發(fā)生,需要調(diào)用立即通知管理人員。錯(cuò)誤編碼規(guī)范對(duì)所有的錯(cuò)誤編碼進(jìn)行統(tǒng)一記錄,作為知識(shí)庫(kù)進(jìn)行管理。編碼[模塊名]_[子模塊名]_[錯(cuò)誤號(hào)(5位)]宏定義[ERR]_[模塊名]_[ERRDSC][WARN]_[模塊名]_[ERRDSC]錯(cuò)誤解釋與解決方案MED-ERR-20001ERR_MED_NOEXEC調(diào)用進(jìn)程失敗1、檢查被調(diào)用進(jìn)程目錄是否存在2、進(jìn)程調(diào)用權(quán)限是否滿足示例可移植規(guī)范只使用ANSIC概述要求描述只使用ANSIC語(yǔ)法。如果無(wú)法避免,則考慮不同主機(jī)的不同實(shí)現(xiàn)。示例系統(tǒng)函數(shù)概述由于標(biāo)準(zhǔn)的缺失,部分函數(shù)的實(shí)現(xiàn)在不同的主機(jī)上的實(shí)現(xiàn)是不同的。要求描述對(duì)于系統(tǒng)一些函數(shù)包,可能實(shí)現(xiàn)方法不同,要注意此部分函數(shù)的使用,如可能則自己實(shí)現(xiàn)。示例在IBM和HP的string函數(shù)包中對(duì)于strcmp的返回值是不一樣的。變量定義概述要求描述通常不直接使用ANSIC變量,通常使用宏定義進(jìn)行封裝,且只使用INT32_T,INT64_T,CHAR_T三種類型。使用系統(tǒng)函數(shù)的變量定義。示例在系統(tǒng)中有time函數(shù),此函數(shù)定義變量的格式為time_t,在系統(tǒng)使用時(shí)不要使用int、long類型來(lái)替換,而是使用time_t來(lái)定義。32/64位模式概述目前主機(jī)是32/64模式混合的應(yīng)用環(huán)境,32/64位模式不同,通常在內(nèi)部處理上也有不同,在代碼開(kāi)發(fā)時(shí)充分注意此問(wèn)題。要求描述使用INT32_T,INT64_T,CHAR_T三種類型,且根據(jù)不同環(huán)境定義不同的宏。示例版本控制規(guī)范版本控制概述任何代碼均需要通過(guò)版本控制工具進(jìn)行控制,所有的代碼在任何時(shí)刻均要求以版本控制工具中的代碼為準(zhǔn)。要求描述版本控制有下面幾個(gè)要求:所有代碼均需要放到版本控制服務(wù)器中。任意時(shí)刻所有代碼均以版本控制服務(wù)器為準(zhǔn)。更新任何代碼時(shí)均從版本控制服務(wù)器中進(jìn)行更新。代碼測(cè)試完成后,修改的代碼需要放到版本控制服務(wù)器中。對(duì)于分布式環(huán)境,所有應(yīng)用均不包括源碼只有可執(zhí)行文件和配置文件。示例數(shù)據(jù)庫(kù)規(guī)范數(shù)據(jù)庫(kù)連接概述對(duì)于大部分?jǐn)?shù)據(jù)庫(kù)來(lái)說(shuō),并不支持?jǐn)?shù)據(jù)庫(kù)連接串加密,但按照內(nèi)控要求,程序連接數(shù)據(jù)庫(kù)的用戶名和密碼必須是密文,這要求系統(tǒng)連接數(shù)據(jù)庫(kù)的用戶名和密碼必須加密,但同時(shí)存在的問(wèn)題是部分人可以通過(guò)修改程序把數(shù)據(jù)庫(kù)的連接串的用戶名和密碼解密。 由于數(shù)據(jù)庫(kù)的性能,系統(tǒng)不可以頻繁的連接數(shù)據(jù)庫(kù)、斷開(kāi)數(shù)據(jù)庫(kù)等操作,在大多數(shù)情況下,系統(tǒng)進(jìn)程在進(jìn)程啟動(dòng)時(shí)連接一次數(shù)據(jù)庫(kù),其它時(shí)間不重連數(shù)據(jù)庫(kù)。 在常連接的情況下,由于某種原因(數(shù)據(jù)庫(kù)重啟、網(wǎng)絡(luò)異常),進(jìn)程需要根據(jù)連接狀態(tài)自動(dòng)進(jìn)行重連。 在常連接狀態(tài)下,一個(gè)關(guān)鍵業(yè)務(wù)的數(shù)據(jù)庫(kù)操作必須在一個(gè)事務(wù)內(nèi)完成,避免由于連接斷開(kāi)導(dǎo)致?tīng)顟B(tài)不統(tǒng)一。要求描述數(shù)據(jù)庫(kù)連接串采用文本加密方式加密用戶名、密碼和連接串。加密解密算法必須嚴(yán)格保密,如有可能定期更換加密算法或者密碼。系統(tǒng)必須可以在數(shù)據(jù)庫(kù)連接斷開(kāi)的情況下自動(dòng)重連。關(guān)鍵業(yè)務(wù)的數(shù)據(jù)庫(kù)操作必須是一個(gè)事務(wù)操作,避免數(shù)據(jù)狀態(tài)不一致。部分情況下單個(gè)進(jìn)程需要同時(shí)連接多個(gè)數(shù)據(jù)庫(kù),所以連接數(shù)據(jù)庫(kù)時(shí)必須增加數(shù)據(jù)庫(kù)連接指定的HANDLE。系統(tǒng)可以根據(jù)配置,不同的SQL語(yǔ)句可以使用不同的數(shù)據(jù)庫(kù)連接。在系統(tǒng)需要數(shù)據(jù)庫(kù)連接數(shù)較多的情況下,建議使用數(shù)據(jù)庫(kù)連接池。示例數(shù)據(jù)庫(kù)連接釋放概述對(duì)于部分?jǐn)?shù)據(jù)庫(kù)來(lái)說(shuō),當(dāng)數(shù)據(jù)庫(kù)連接斷開(kāi)時(shí),如果不使用斷開(kāi)語(yǔ)句,數(shù)據(jù)庫(kù)服務(wù)進(jìn)程則不會(huì)主動(dòng)退出,當(dāng)此種情況過(guò)多時(shí),會(huì)導(dǎo)致數(shù)據(jù)庫(kù)的進(jìn)程數(shù)異常多,每個(gè)數(shù)據(jù)庫(kù)進(jìn)程所占內(nèi)存都不低(ORACLE進(jìn)程38M),會(huì)導(dǎo)致主機(jī)內(nèi)存占滿,導(dǎo)致主機(jī)無(wú)法工作直接宕機(jī)。要求描述在進(jìn)程退出時(shí),必須主動(dòng)執(zhí)行數(shù)據(jù)庫(kù)連接斷開(kāi)語(yǔ)句,用于數(shù)據(jù)庫(kù)服務(wù)器釋放進(jìn)程資源。在數(shù)據(jù)庫(kù)連接斷開(kāi)前要注意執(zhí)行提交或者回滾語(yǔ)句,保證事務(wù)的主動(dòng)完整性,由系統(tǒng)保證業(yè)務(wù)事務(wù)的合理性,而不是數(shù)據(jù)庫(kù)連接斷開(kāi)事務(wù)回滾的模式。示例異常退出數(shù)據(jù)庫(kù)連接釋放概述在系統(tǒng)異常退出時(shí),系統(tǒng)必須主動(dòng)斷開(kāi)數(shù)據(jù)庫(kù)連接。所以在系統(tǒng)異常退出時(shí)必須考慮使用的資源的釋放。對(duì)于系統(tǒng)訪問(wèn)內(nèi)存資源等產(chǎn)生CORE文件的情況下,需要注意測(cè)試是否有方法可以在生成CORE文件前釋放資源。要求描述系統(tǒng)發(fā)現(xiàn)問(wèn)題主動(dòng)退出時(shí)需要主動(dòng)釋放數(shù)據(jù)庫(kù)連接。在產(chǎn)生CORE文件時(shí),暫時(shí)無(wú)法確認(rèn)操作系統(tǒng)是否允許執(zhí)行斷開(kāi)連接語(yǔ)句。示例數(shù)據(jù)庫(kù)訪問(wèn)效率概述數(shù)據(jù)庫(kù)交互訪問(wèn)時(shí),執(zhí)行效率非常低,大多數(shù)情況下不會(huì)超過(guò)10000次/秒,這對(duì)數(shù)據(jù)密集型應(yīng)用是個(gè)關(guān)鍵性能瓶頸,所以大多數(shù)情況下盡量避免頻繁的訪問(wèn)數(shù)據(jù)庫(kù),一般比較頻繁的交互需要把數(shù)據(jù)庫(kù)數(shù)據(jù)放到共享內(nèi)存或者本地內(nèi)存中。對(duì)于不得不直接和數(shù)據(jù)庫(kù)交互的進(jìn)程則可以考慮使用CACHE的方法降低訪問(wèn)。要求描述頻繁訪問(wèn)數(shù)據(jù)庫(kù)的操作能放到共享內(nèi)存就放到共享內(nèi)存中。對(duì)于不得不訪問(wèn)數(shù)據(jù)庫(kù)的則盡量使用CACHE算法。可以預(yù)先編譯的SQL語(yǔ)句則預(yù)先編譯,盡量減少SQL語(yǔ)句編譯時(shí)間。命名規(guī)范本命名規(guī)范包括模塊名、函數(shù)名、變量名、常量名等

溫馨提示

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

評(píng)論

0/150

提交評(píng)論