在軟體開發中針對使用者的輸入往往不是我們所期待的那樣(不滿足前置條件),有時候軟體内部往往也會出現一些我們不易察覺的錯誤,針對這種情況,一些人持有樂觀的态度,而另外一些人則從一個其他的事情中得到了啟發:即由防禦式駕駛而想到的防禦式程式設計。
所謂防禦式程式設計,指的就是這樣一件事情:即我們假定使用者都是白癡,他們可能在輸入時進行各種各樣的操作,這來源于防禦式駕駛:即假定路上開車的都是瘋子,你要提前制定政策防止他們撞到你或者你撞到他們,是以你必須要保證萬無一失,而不是采取投機取巧的方法。心理學上有一個定律叫做墨菲定律,即任何你認為不會發生的事都有可能發生。
在軟體開發中也正是如此,比如我們想開發一個航班管理系統,在使用者進行一定的輸入之後就會将所有的航班資訊展示到顯示屏上。但是事情往往不順遂人意。使用者可能輸入并不存在的飛機,發往并不存在的機場,使用者也可能和你玩惡作劇,為航班不配置設定飛機,那樣的話所有人就隻能幹等。諸如此類,這僅僅是一個小小的例子,如果機場資訊版出了問題可能還不是什麼大毛病,但是假如這個開發機場管理系統的人同時也去開發了銀行管理系統,那結果可能就不太樂觀了。前些天美國用百萬年薪來招聘一些會上古語言的老程式員,因為這些程式設計語言被用作銀行管理系統幾十年,中間并沒有出過什麼大問題,是以一直沒有進行更新換代和相應的維護,從中我們也可以窺見一個魯棒性較強的平台是多麼重要,這幾十年維護省下來的錢可能也能用于更多的用途吧(;》)
ok,當我們了解到防禦式程式設計的意義之後,我們就需要考慮怎樣實作防禦式程式設計,具體而言有以下幾個方法:
▪Protecting programs from invalid inputs
▪ Assertions
▪ Exceptions
▪ Specific error handling techniques
▪ Barricade
▪ Debugging aids
在這裡我并不打算展開講述,具體可參考MIT 軟體構造課程的課件。我隻想說一下裡面的Barricade,這個所謂的障礙物模式,實際上是将程式内部與外界隔離開,我們通過人為的設定防火牆,來規避那些外界可能存在的風險,有點像設計模式中的proxy,通過中介來進行資料處理交換,将風險委托給别人,也不失為一種很好的開發政策。