« Design Patterns--Observer | 回到主頁面 | ZETMAN 桂正和新作~~~ »

December 30, 2004

[Code Complete] 8: Defensive Programming心得(1)


將此網頁加入【百度收藏】... 加入此網頁到【del.icio.us 書籤】 technorati

Code Complete

再此寫下一些最近的讀書心得,可能太多無法一次全部寫完。但是有時間會繼續將其補其,有興趣的人再往下看吧!!

1.何謂Defensive Programming?

Defensive Programming一辭簡單明瞭,在此書章節的開頭也有提到,所謂的Defensive Programming並不是增強程式的防禦,這樣是沒有用的。有太多種未知的輸入與狀況可能會出現,如何在已知、未知的環境中,對於正確、錯誤的輸入的反應,才是真正的Defensive Programming。

2.保護你的程式--對於不正確的輸入(Input)

好的程式絕對不會產出不正確的垃圾(garbage),不論是正確的、非法的輸入下都應該如此。所以一個程式的開始,對於參數的輸入,在處理之前都應該要有檢查的機制,避免處理過程中錯誤的產生。(在此書中有提到相關概念稱為 Preconditional)在此章節中,本書提到許多詳細的方式,就讓我稍微用一些方式將其整理一下:

Check the values of all data from external source

對所有外來的變數,都應該要有做些檢查,比如說輸入字串就要能預防"Escape(\) "的輸入;對於網頁來的內容,要能分辨是不是含有非法的字串;對於數值要做"boundary check",如此一來可大大降低錯誤產生的機率。

Check the values of all routine input parameter

處理的函式中,若要傳遞參數到其他的函式前,也要將其參數做相關的檢查,如此一來可避免不必要的錯誤值加以傳遞。

Design how to handle bad inputs

OK,即使你抓到了錯誤的輸入,最重要的是,你要怎麼處理這樣的狀況,回傳預設值、回傳上一次正確值、直接改為正確值...許多的方式可以應用。

3.Assertion的應用

的確,本書對於assertion如何應用的方法算是相當的詳細,但是如果更仔細的使用(大量範例與CODE),可以去看Debugging Windows Programs裡面第三章對於assertion有相當的介紹,不過在此書還是有提到幾個比較重要的地方:

Use error-handling code for conditions you expect to occurs; use assertions for conditions that should never occur.

也就是知道有可能發生的錯誤(輸入數值錯誤、找不到資訊、無法完成的函式)要有相關的錯誤處理方式,但是對於不應該、也不會發生的錯誤(指標尚未指定,參考點消失,COM被release掉)都應該要用assertion去加以標示出來,這一點是我認為本書再此章節中最重要的一個概念。

Avoid putting excutable code into assertions

在VC++中,assertion在release build中是不會執行的,所以儘量不要有類似以下的程式碼。

ASSERT(DoWorkReturnStatus());

Use assetion to document and verify precoditions and posconditions.

針對函式內參數的應用,可以利用assertion去做一些邏輯上的檢查,藉以作一份記錄。比如說,輸入的月份應該在1~12月之間,就可以寫成

ASSERT(nMonth > 0 && nMonth <= 12);

For high robus code, assert and then handle the error anyway.

在此,作者建議。避免無法預測的錯誤,先ASSERT在針對ASSER的狀況去處理(光是assertion並不能解決問題,還是得將錯誤作一個妥善的控制才對。)這樣一來工程師可以快速的找到錯誤可能發生的地方,而程式本身也不會被不可預知的錯誤破壞。



學習文件

由 Evan 發表於 December 30, 2004 將此網頁加入【百度收藏】... 加入此網頁到【del.icio.us 書籤】 technorati
引用
本文的引用網址:


以下是前來引用的連結 '[Code Complete] 8: Defensive Programming心得(1)' 來自 Blog E
迴響

我正苦無中文的版本 有些東西 還是專業的人看的比較懂 謝謝你

November 27, 2005 05:11 PM

希望還有更多的說明 感謝妳

kenji 發表於 November 27, 2005 05:14 PM

好耶! 最近在看這本書說, 是趁當兵的空閒時間看的. 很難 @@
希望寫一下 Testing 那篇的心得, 因為英文看不太懂, 哈哈 x_x

由 FiRose 發表於 November 29, 2005 03:23 PM
發表迴響









記住我的資訊?




(請輸入以下的驗證碼)