欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
編程規范(2)
編程規范(2)
7 可測性
規則7-1:在同一項目組或產(chǎn)品組內,要有一套統一的為集成測試與系統聯(lián)調準備的調測開(kāi)關(guān)及相應打印函數,并且要有詳細的說(shuō)明。

規則7-2:在同一項目組或產(chǎn)品組內,調測打印出的信息串的格式要有統一的形式。信息串中至少要有所在模塊名(或源文件名)及行號。
說(shuō)明:統一的調測信息格式便于集成測試。

規則7-3:編程的同時(shí)要為單元測試選擇恰當的測試點(diǎn),并仔細構造測試代碼、測試用例,同時(shí)給出明確的注釋說(shuō)明。測試代碼部分應作為(模塊中的)一個(gè)子模塊,以方便測試代碼在模塊中的安裝與拆卸(通過(guò)調測開(kāi)關(guān))。
說(shuō)明:為單元測試而準備。

規則7-4:在進(jìn)行集成測試/系統聯(lián)調之前,要構造好測試環(huán)境、測試項目及測試用例,同時(shí)仔細分析并優(yōu)化測試用例,以提高測試效率。
說(shuō)明:好的測試用例應盡可能模擬出程序所遇到的邊界值、各種復雜環(huán)境及一些極端情況等。

規則7-5:使用斷言來(lái)發(fā)現軟件問(wèn)題,提高代碼可測性。
說(shuō)明:斷言是對某種假設條件進(jìn)行檢查(可理解為若條件成立則無(wú)動(dòng)作,否則應報告),它可以快速發(fā)現并定位軟件問(wèn)題,同時(shí)對系統錯誤進(jìn)行自動(dòng)報警。斷言可以對在系統中隱藏很深,用其它手段極難發(fā)現的問(wèn)題進(jìn)行定位,從而縮短軟件問(wèn)題定位時(shí)間,提高系統的可測性。實(shí)際應用時(shí),可根據具體情況靈活地設計斷言。
示例:下面是C語(yǔ)言中的一個(gè)斷言,用宏來(lái)設計的。(其中NULL為0L)
#ifdef _EXAM_ASSERT_TEST_ // 若使用斷言測試

void exam_assert( char * file_name, unsigned int line_no )
{
printf( "\n[EXAM]Assert failed: %s, line %u\n",
file_name, line_no );
abort( );
}

#define EXAM_ASSERT( condition )
if (condition) // 若條件成立,則無(wú)動(dòng)作
NULL;
else // 否則報告
exam_assert( __FILE__, __LINE__ )

#else // 若不使用斷言測試

#define EXAM_ASSERT(condition) NULL

#endif /* end of ASSERT */

規則7-6:用斷言來(lái)檢查程序正常運行時(shí)不應發(fā)生但在調測時(shí)有可能發(fā)生的非法情況。

規則7-7:不能用斷言來(lái)檢查最終產(chǎn)品肯定會(huì )出現且必須處理的錯誤情況。
說(shuō)明:斷言是用來(lái)處理不應該發(fā)生的錯誤情況的,對于可能會(huì )發(fā)生的且必須處理的情況要寫(xiě)防錯程序,而不是斷言。如某模塊收到其它模塊的消息后,要對消息的合理性進(jìn)行檢查,此過(guò)程為正常的錯誤檢查,不能用斷言來(lái)實(shí)現。

規則7-8:對較復雜的斷言加上明確的注釋。
說(shuō)明:為復雜的斷言加注釋?zhuān)沙吻鍞嘌院x并減少不必要的誤用。

規則7-9:用斷言確認函數的參數。
示例:假設某函數參數中有一個(gè)指針,那么使用指針前可對它檢查,如下。
int exam_fun( unsigned char *str )
{
EXAM_ASSERT( str != NULL ); // 用斷言檢查"假設指針不為空"這個(gè)條件

... //other program code
}

規則7-10:用斷言保證沒(méi)有定義的特性或功能不被使用。
示例:假設某通信模塊在設計時(shí),準備提供"無(wú)連接"和"連接" 這兩種業(yè)務(wù)。但當前的版本中僅實(shí)現了"無(wú)連接"業(yè)務(wù),且在此版本的正式發(fā)行版中,用戶(hù)(上層模塊)不應產(chǎn)生"連接"業(yè)務(wù)的請求,那么在測試時(shí)可用斷言檢查用戶(hù)是否使用"連接"業(yè)務(wù)。如下。
#define EXAM_CONNECTIONLESS 0 // 無(wú)連接業(yè)務(wù)
#define EXAM_CONNECTION 1 // 連接業(yè)務(wù)

int msg_process( EXAM_MESSAGE *msg )
{
unsigned char service; /* message service class */

EXAM_ASSERT( msg != NULL );

service = get_msg_service_class( msg );

EXAM_ASSERT( service != EXAM_CONNECTION ); // 假設不使用連接業(yè)務(wù)

... //other program code
}

規則7-11:用斷言對程序開(kāi)發(fā)環(huán)境(OS/Compiler/Hardware)的假設進(jìn)行檢查。
說(shuō)明:程序運行時(shí)所需的軟硬件環(huán)境及配置要求,不能用斷言來(lái)檢查,而必須由一段專(zhuān)門(mén)代碼處理。用斷言?xún)H可對程序開(kāi)發(fā)環(huán)境中的假設及所配置的某版本軟硬件是否具有某種功能的假設進(jìn)行檢查。如某網(wǎng)卡是否在系統運行環(huán)境中配置了,應由程序中正式代碼來(lái)檢查;而此網(wǎng)卡是否具有某設想的功能,則可由斷言來(lái)檢查。
對編譯器提供的功能及特性假設可用斷言檢查,原因是軟件最終產(chǎn)品(即運行代碼或機器碼)與編譯器已沒(méi)有任何直接關(guān)系,即軟件運行過(guò)程中(注意不是編譯過(guò)程中)不會(huì )也不應該對編譯器的功能提出任何需求。
示例:用斷言檢查編譯器的int型數據占用的內存空間是否為2,如下。
EXAM_ASSERT( sizeof( int ) == 2 );



規則7-12:正式軟件產(chǎn)品中應把斷言及其它調測信息去掉(即把有關(guān)的調測開(kāi)關(guān)關(guān)掉)。
說(shuō)明:加快軟件運行速度。

規則7-13:在軟件系統中設置與取消有關(guān)測試手段,不能對軟件實(shí)現的功能等產(chǎn)生影響。
說(shuō)明:即有測試代碼的軟件和關(guān)掉測試代碼的軟件,在功能行為上應一致。

規則7-14:用調測開(kāi)關(guān)來(lái)切換軟件的DEBUG版和正式版,而不要同時(shí)存在正式版本和DEBUG版本的不同源文件,以減少維護的難度。


建議7-1:在編寫(xiě)代碼之前,應預先設計好程序調試與測試的方法和手段,并設計好各種調測開(kāi)關(guān)及相應測試代碼如打印函數等。
說(shuō)明:程序的調試與測試是軟件生存周期中很重要的一個(gè)階段,如何對軟件進(jìn)行較全面、高率的測試并盡可能地找出軟件中的錯誤就成為很關(guān)鍵的問(wèn)題。因此在編寫(xiě)源代碼之前,除了要有一套比較完善的測試計劃外,還應設計出一系列代碼測試手段,為單元測試、集成測試及系統聯(lián)調提供方便。

建議7-2:調測開(kāi)關(guān)應分為不同級別和類(lèi)型。
說(shuō)明:調測開(kāi)關(guān)的設置及分類(lèi)應從以下幾方面考慮:針對模塊或系統某部分代碼的調測;針對模塊或系統某功能的調測;出于某種其它目的,如對性能、容量等的測試。這樣做便于軟件功能的調測,并且便于模塊的單元測試、系統聯(lián)調等。

建議7-3:編寫(xiě)防錯程序,然后在處理錯誤之后可用斷言宣布發(fā)生錯誤。
示例:假如某模塊收到通信鏈路上的消息,則應對消息的合法性進(jìn)行檢查,若消息類(lèi)別不是通信協(xié)議中規定的,則應進(jìn)行出錯處理,之后可用斷言報告,如下例。
#ifdef _EXAM_ASSERT_TEST_ // 若使用斷言測試

/* Notice: this function does not call 'abort' to exit program */
void assert_report( char * file_name, unsigned int line_no )
{
printf( "\n[EXAM]Error Report: %s, line %u\n",
file_name, line_no );
}

#define ASSERT_REPORT( condition )
if ( condition ) // 若條件成立,則無(wú)動(dòng)作
NULL;
else // 否則報告
assert_report ( __FILE__, __LINE__ )

#else // 若不使用斷言測試

#define ASSERT_REPORT( condition ) NULL

#endif /* end of ASSERT */

int msg_handle( unsigned char msg_name, unsigned char * msg )
{
switch( msg_name )
{
case MSG_ONE:
... // 消息MSG_ONE處理
return MSG_HANDLE_SUCCESS;

... // 其它合法消息處理

default:
... // 消息出錯處理
ASSERT_REPORT( FALSE ); // "合法"消息不成立,報告
return MSG_HANDLE_ERROR;
}
}
8 程序效率
規則8-1:編程時(shí)要經(jīng)常注意代碼的效率。
說(shuō)明:代碼效率分為全局效率、局部效率、時(shí)間效率及空間效率。全局效率是站在整個(gè)系統的角度上的系統效率;局部效率是站在模塊或函數角度上的效率;時(shí)間效率是程序處理輸入任務(wù)所需的時(shí)間長(cháng)短;空間效率是程序所需內存空間,如機器代碼空間大小、數據空間大小、??臻g大小等。

規則8-2:在保證軟件系統的正確性、穩定性、可讀性及可測性的前提下,提高代碼效率。
說(shuō)明:不能一味地追求代碼效率,而對軟件的正確性、穩定性、可讀性及可測性造成影響。

規則8-3:局部效率應為全局效率服務(wù),不能因為提高局部效率而對全局效率造成影響。

規則8-4:通過(guò)對系統數據結構的劃分與組織的改進(jìn),以及對程序算法的優(yōu)化來(lái)提高空間效率。
說(shuō)明:這種方式是解決軟件空間效率的根本辦法。
示例:如下記錄學(xué)生學(xué)習成績(jì)的結構不合理。
typedef unsigned char BYTE;
typedef unsigned short WORD;

typedef struct STUDENT_SCORE_STRU
{
BYTE name[8];
BYTE age;
BYTE sex;
BYTE class;
BYTE subject;
float score;
} STUDENT_SCORE;

因為每位學(xué)生都有多科學(xué)習成績(jì),故如上結構將占用較大空間。應如下改進(jìn)(分為兩個(gè)結構),總的存貯空間將變小,操作也變得更方便。
typedef struct STUDENT_STRU
{
BYTE name[8];
BYTE age;
BYTE sex;
BYTE class;
} STUDENT;

typedef struct STUDENT_SCORE_STRU
{
WORD student_index;
BYTE subject;
float score;
} STUDENT_SCORE;

規則8-5:循環(huán)體內工作量最小化。
說(shuō)明:應仔細考慮循環(huán)體內的語(yǔ)句是否可以放在循環(huán)體之外,使循環(huán)體內工作量最小,從而提高程序的時(shí)間效率。
示例:如下代碼效率不高。
for (ind = 0; ind < MAX_ADD_NUMBER; ind++)
{
sum += ind;
back_sum = sum; /* backup sum */
}

語(yǔ)句"back_sum = sum;"完全可以放在for語(yǔ)句之后,如下。
for (ind = 0; ind < MAX_ADD_NUMBER; ind++)
{
sum += ind;
}
back_sum = sum; /* backup sum */

建議8-1:仔細分析有關(guān)算法,并進(jìn)行優(yōu)化。


建議8-2:仔細考查、分析系統及模塊處理輸入(如事務(wù)、消息等)的方式,并加以改進(jìn)。

建議8-3:對模塊中函數的劃分及組織方式進(jìn)行分析、優(yōu)化,改進(jìn)模塊中函數的組織結構,提高程序效率。
說(shuō)明:軟件系統的效率主要與算法、處理任務(wù)方式、系統功能及函數結構有很大關(guān)系,僅在代碼上下功夫一般不能解決根本問(wèn)題。

建議8-4:編程時(shí),要隨時(shí)留心代碼效率;優(yōu)化代碼時(shí),要考慮周全。

建議8-5:不應花過(guò)多的時(shí)間拼命地提高調用不很頻繁的函數代碼效率。
說(shuō)明:對代碼優(yōu)化可提高效率,但若考慮不周很有可能引起嚴重后果。

建議8-6:要仔細地構造或直接用匯編編寫(xiě)調用頻繁或性能要求極高的函數。
說(shuō)明:只有對編譯系統產(chǎn)生機器碼的方式以及硬件系統較為熟悉時(shí),才可使用匯編嵌入方式。嵌入匯編可提高時(shí)間及空間效率,但也存在一定風(fēng)險。

建議8-7:在保證程序質(zhì)量的前提下,通過(guò)壓縮代碼量、去掉不必要代碼以及減少不必要的局部和全局變量,來(lái)提高空間效率。
說(shuō)明:這種方式對提高空間效率可起到一定作用,但往往不能解決根本問(wèn)題。

建議8-8:在多重循環(huán)中,應將最忙的循環(huán)放在最內層。
說(shuō)明:減少CPU切入循環(huán)層的次數。
示例:如下代碼效率不高。
for (row = 0; row < 100; row++)
{
for (col = 0; col < 5; col++)
{
sum += a[row][col];
}
}

可以改為如下方式,以提高效率。
for (col = 0; col < 5; col++)
{
for (row = 0; row < 100; row++)
{
sum += a[row][col];
}
}

建議8-9:盡量減少循環(huán)嵌套層次。

建議8-10:避免循環(huán)體內含判斷語(yǔ)句,應將循環(huán)語(yǔ)句置于判斷語(yǔ)句的代碼塊之中。
說(shuō)明:目的是減少判斷次數。循環(huán)體中的判斷語(yǔ)句是否可以移到循環(huán)體外,要視程序的具體情況而言,一般情況,與循環(huán)變量無(wú)關(guān)的判斷語(yǔ)句可以移到循環(huán)體外,而有關(guān)的則不可以。
示例:如下代碼效率稍低。
for (ind = 0; ind < MAX_RECT_NUMBER; ind++)
{
if (data_type == RECT_AREA)
{
area_sum += rect_area[ind];
}
else
{
rect_length_sum += rect[ind].length;
rect_width_sum += rect[ind].width;
}
}

因為判斷語(yǔ)句與循環(huán)變量無(wú)關(guān),故可如下改進(jìn),以減少判斷次數。
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;
}
}

建議8-11:盡量用乘法或其它方法代替除法,特別是浮點(diǎn)運算中的除法。
說(shuō)明:浮點(diǎn)運算除法要占用較多CPU資源。
示例:如下表達式運算可能要占較多CPU資源。
#define PAI 3.1416
radius = circle_length / (2 * PAI);

應如下把浮點(diǎn)除法改為浮點(diǎn)乘法。
#define PAI_RECIPROCAL (1 / 3.1416 ) // 編譯器編譯時(shí),將生成具體浮點(diǎn)數
radius = circle_length * PAI_RECIPROCAL / 2;

建議8-12:不要一味追求緊湊的代碼。
說(shuō)明:因為緊湊的代碼并不代表高效的機器碼。
10 代碼編輯、編譯、審查
規則10-1:在產(chǎn)品軟件(項目組)中,使用統一的編譯配置文件。

規則10-2:通過(guò)代碼走讀及審查方式對代碼進(jìn)行檢查。
說(shuō)明:代碼走讀主要是對程序的編程風(fēng)格如注釋、命名等以及編程時(shí)易出錯的內容進(jìn)行檢查,可由開(kāi)發(fā)人員自己或開(kāi)發(fā)人員交叉的方式進(jìn)行;代碼審查主要是對程序實(shí)現的功能及程序的穩定性、安全性、可靠性等進(jìn)行檢查及評審,可通過(guò)自審、交叉審核或指定部門(mén)抽查等方式進(jìn)行。

規則10-3:測試組測試產(chǎn)品之前,應對代碼進(jìn)行抽查及評審。

建議10-1:編寫(xiě)代碼時(shí)要注意隨時(shí)保存,并定期備份,防止由于斷電、硬盤(pán)損壞等原因造成代碼丟失。

建議10-2:同產(chǎn)品軟件(項目組)內,最好使用相同的編輯器,并使用相同的設置選項。

建議10-3:合理地設計軟件系統目錄,方便開(kāi)發(fā)人員使用。
說(shuō)明:方便、合理的軟件系統目錄,可提高工作效率。目錄構造的原則是方便有關(guān)源程序的存儲、查詢(xún)、編譯、鏈接等工作,同時(shí)目錄中還應具有工作目錄----所有的編譯、鏈接等工作應在此目錄中進(jìn)行,工具目錄----有關(guān)文件編輯器、文件查找等工具可存放在此目錄中。

建議10-4:某些語(yǔ)句經(jīng)編譯后產(chǎn)生告警,但如果你認為它是正確的,那么應通過(guò)某種手段去掉告警信息。
說(shuō)明:在Borland C/C++中,可用"#pragma warn"來(lái)關(guān)掉或打開(kāi)某些告警。
示例:
#pragma warn -rvl // 關(guān)閉告警
int examples_fun( void )
{
// 程序,但無(wú)return語(yǔ)句。
}
#pragma warn +rvl // 打開(kāi)告警
編譯函數examples_fun時(shí)本應產(chǎn)生"函數應有返回值"告警,但由于關(guān)掉了此告警信息顯示,所以編譯時(shí)將不會(huì )產(chǎn)生此告警提示。

建議10-5:使用代碼檢查工具(如C語(yǔ)言用PC-Lint)對源程序檢查。
11 代碼測試、維護
規則11-1:?jiǎn)卧獪y試要求至少達到語(yǔ)句覆蓋。
規則11-2:?jiǎn)卧獪y試開(kāi)始要跟蹤每一條語(yǔ)句,并觀(guān)察數據流及變量的變化。
規則11-3:清理、整理或優(yōu)化后的代碼要經(jīng)過(guò)審查及測試。
規則11-4:代碼版本升級要經(jīng)過(guò)嚴格測試。
規則11-5:使用工具軟件對代碼版本進(jìn)行維護。
規則11-6:正式版本上軟件的任何修改都應有詳細的文檔記錄。
建議11-1:發(fā)現錯誤立即修改,并且要記錄下來(lái)。
建議11-2:關(guān)鍵的代碼在匯編級跟蹤。
建議11-3:仔細設計并分析測試用例,使測試用例覆蓋盡可能多的情況,以提高測試用例的效率。
建議11-4:盡可能模擬出程序的各種出錯情況,對出錯處理代碼進(jìn)行充分的測試。
建議11-5:仔細測試代碼處理數據、變量的邊界情況。
建議11-6:保留測試信息,以便分析、總結經(jīng)驗及進(jìn)行更充分的測試。
建議11-7:不應通過(guò)"試"來(lái)解決問(wèn)題,應尋找問(wèn)題的根本原因。
建議11-8:對自動(dòng)消失的錯誤進(jìn)行分析,搞清楚錯誤是如何消失的。
建議11-9:修改錯誤不僅要治表,更要治本。
建議11-10:測試時(shí)應設法使很少發(fā)生的事件經(jīng)常發(fā)生。
建議11-11:明確模塊或函數處理哪些事件,并使它們經(jīng)常發(fā)生。
建議11-12: 堅持在編碼階段就對代碼進(jìn)行徹底的單元測試,不要等以后的測試工作來(lái)發(fā)現問(wèn)題。
建議11-13:去除代碼運行的隨機性(如去掉無(wú)用的數據、代碼及盡可能防止并注意函數中的"內部寄存器"等),讓函數運行的結果可預測,并使出現的錯誤可再現。
12 宏
規則12-1:用宏定義表達式時(shí),要使用完備的括號。
示例:如下定義的宏都存在一定的風(fēng)險。
#define RECTANGLE_AREA( a, b ) a * b
#define RECTANGLE_AREA( a, b ) (a * b)
#define RECTANGLE_AREA( a, b ) (a) * (b)
正確的定義應為:
#define RECTANGLE_AREA( a, b ) ((a) * (b))

規則12-2:將宏所定義的多條表達式放在大括號中。
示例:下面的語(yǔ)句只有宏的第一條表達式被執行。為了說(shuō)明問(wèn)題,for語(yǔ)句的書(shū)寫(xiě)稍不符規范。
#define INTI_RECT_VALUE( a, b )
a = 0;
b = 0;

for (index = 0; index < RECT_TOTAL_NUM; index++)
INTI_RECT_VALUE( rect.a, rect.b );

正確的用法應為:
#define INTI_RECT_VALUE( a, b )
{
a = 0;
b = 0;
}

for (index = 0; index < RECT_TOTAL_NUM; index++)
{
INTI_RECT_VALUE( rect[index].a, rect[index].b );
}

規則12-3:使用宏時(shí),不允許參數發(fā)生變化。
示例:如下用法可能導致錯誤。
#define SQUARE( a ) ((a) * (a))

int a = 5;
int b;
b = SQUARE( a++ ); // 結果:a = 7,即執行了兩次增1。

正確的用法是:
b = SQUARE( a );
a++; // 結果:a = 6,即只執行了一次增1。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
程序設計原則和測試(自動(dòng)化)
折半查找算法
【C#】干掉for循環(huán) - K# - 博客園
純干貨|有關(guān)Python的12到練習題,你敢來(lái)挑戰嗎?
【HttpRunner v3.x】筆記
【每周一坑】矩陣旋轉
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久