淺談軟體開發中的防禦式編程

  在軟體開發中針對用戶的輸入往往不是我們所期待的那樣(不滿足前置條件),有時候軟體內部往往也會出現一些我們不易察覺的錯誤,針對這種情況,一些人持有樂觀的態度,而另外一些人則從一個其他的事情中得到了啟發:即由防禦式駕駛而想到的防禦式編程。

  所謂防禦式編程,指的就是這樣一件事情:即我們假定使用者都是白痴,他們可能在輸入時進行各種各樣的操作,這來源於防禦式駕駛:即假定路上開車的都是瘋子,你要提前制定策略防止他們撞到你或者你撞到他們,因此你必須要保證萬無一失,而不是採取投機取巧的方法。心理學上有一個定律叫做墨菲定律,即任何你認為不會發生的事都有可能發生。

  在軟體開發中也正是如此,比如我們想開發一個航班管理系統,在用戶進行一定的輸入之後就會將所有的航班資訊展示到顯示器上。但是事情往往不順遂人意。用戶可能輸入並不存在的飛機,發往並不存在的機場,用戶也可能和你玩惡作劇,為航班不分配飛機,那樣的話所有人就只能幹等。諸如此類,這僅僅是一個小小的例子,如果機場資訊版出了問題可能還不是什麼大毛病,但是假如這個開發機場管理系統的人同時也去開發了銀行管理系統,那結果可能就不太樂觀了。前些天美國用百萬年薪來招聘一些會上古語言的老程式設計師,因為這些程式設計語言被用作銀行管理系統幾十年,中間並沒有出過什麼大問題,因此一直沒有進行更新換代和相應的維護,從中我們也可以窺見一個魯棒性較強的平台是多麼重要,這幾十年維護省下來的錢可能也能用於更多的用途吧(;》)

  ok,當我們了解到防禦式編程的意義之後,我們就需要考慮怎樣實現防禦式編程,具體而言有以下幾個方法:

  

  ▪Protecting programs from invalid inputs

  ▪ Assertions

  ▪ Exceptions

   ▪ Specific error handling techniques

   ▪ Barricade

   ▪ Debugging aids

  在這裡我並不打算展開講述,具體可參考MIT 軟體構造課程的課件。我只想說一下裡面的Barricade,這個所謂的障礙物模式,實際上是將程式內部與外界隔離開,我們通過人為的設置防火牆,來規避那些外界可能存在的風險,有點像設計模式中的proxy,通過中介來進行數據處理交換,將風險委託給別人,也不失為一種很好的開發策略。