程序的健壯性

程序的健壯性和自我防禦
 
健壯性

健壯性是指軟件對於規範要求以外的輸入情況的處理能力。

所謂健壯的系統是指對於規範要求以外的輸入能夠判斷出這個輸入不符合規範要求,並能有合理的處理方式。

另外健壯性有時也和容錯性,可移植性,正確性有交叉的地方。

比如,一個軟件可以從錯誤的輸入推斷出正確合理的輸入,這屬於容錯性量度標準,但是也可以認爲這個軟件是健壯的。

一個軟件可以正確地運行在不同環境下,則認爲軟件可移植性高,也可以叫,軟件在不同平臺下是健壯的。

一個軟件能夠檢測自己內部的設計或者編碼錯誤,並得到正確的執行結果,這是軟件的正確性標準,但是也可以說,軟件有內部的保護機制,是模塊級健壯的。

軟件健壯性是一個比較模糊的概念,但是卻是非常重要的軟件外部量度標準。軟件設計的健壯與否直接反應了分析設計和編碼人員的水平。即所謂的高手寫的程序不容易死。

其實程序的健壯性(魯棒性)是各個語言都要注意的問題,這裏重點講的是其中的自我防禦。

 

1.面向對象要求黑箱操作

由於面向對象要求各個部分是彼此獨立的,那麼各個部分就要足夠強勁以應付輸入參數的不合理性。雖然現代編程都講究預處理,一般的是將輸入格式轉換爲統一的格式,然後進行處理。比如說現在網上的搜索引擎,都是將輸入轉換爲unicode的格式。但是這並不是說我們的處理函數就不需要錯誤處理了。預處理能夠大大減少程序出錯的概率和編寫錯誤處理的複雜度。

但是考慮到單獨模塊越來越趨向於智能化,各個黑箱應該具有獨立的行爲,錯誤處理,以及錯誤糾正的功能。

 

2.錯誤捕捉和錯誤信息

相對於C++,C語言的錯誤處理比較的簡單。無非是條件判斷語句而已(往往錯誤處理不好的原因不是程序員的技術不好,而是比較懶,呵呵)。這裏需要注意的問題是如何書寫錯誤信息的問題。錯誤信息要完整:包括在什麼地方,因爲什麼,出現了什麼樣的錯誤。不完整的錯誤信息沒有任何可用價值。

另外一個就是出現運行的log(日誌)。在關鍵的步驟上輸入一些信息到log文件內,提示當前程序運行到什麼地方去了(如有可能,得到系統的當前錯誤碼)。這樣當程序意外中斷的時候,可以使用這個log進行一定的判斷。

 

3.自我防禦(預防二義性)

程序應該是儘可能自糾錯的。這在程序的輸入不可預測的情況下尤爲重要。其實由於合作開發的原因,這樣的情況很多。一個程序員編寫的模塊很有可能對輸入有特定的要求,那麼當另外一個程序員調用這個模塊的時候,就會出現問題。

好的處理辦法是在模塊內對輸入進行判斷,如果有二義性,則進行合理糾錯,並有效的提示(在debug版本下)。這裏注意的是,如果糾錯了,要進行有效的提示:可以是msgbox,也可以是寫入log。

 

下面是一個例子的僞代碼:

//該模塊是對日期的統計,不計節假日

Function Stat(time)

{

int errcode;

char* errstr[MAX];//也可以定義爲全局變量

 

if (errcode =check(&time)) { //其實這個可以放到預處理裏面

fprintf(“不合法的輸入%d,糾正爲當天”,errcode);

msgbox(errstr) ; //但是對於單獨的模塊,如果不能保證有預處理

time=gettoday(); ,//得不使用這樣的辦法。

}

if (errcode =checkholiday(&time)) {

fprintf(“不統計節假日%d,糾正爲當天”,errcode);

msgbox(errstr) ;

time=gettoday();

}

。。。。。。處理

}

 

其實這裏面沒有什麼技術含量。關鍵就是一點,如果沒有自糾錯,那麼一旦有錯誤,唯一的辦法就是退出程序(或者單個線程)。這是用戶不希望看見的,使用自糾錯,可以避免一些小的錯誤導致程序的中止。

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章