l

2014年1月22日 星期三

有紀律的例外處理原則

Jan. 21 22:18~ Jan. 22 00:13

image

好的運動員必須要有紀律的練習

 

Teddy今天正式把《笑談軟體工程:例外處理設計的逆襲》的初稿寫完了,約10萬6千字。自己校正了一次,現在請「小幫手」幫忙二校,過完農曆年就準備交給出版社。快的話應該可以在三月底左右出版。

寫了這麼多有關例外處理的文章,鄉民們可能以為Teddy變不出什麼新把戲了。今天拿出「壓箱寶」,介紹一個對Teddy影響很大的例外處理設計原則,叫做:Disciplined Exception Handling Principle(以下簡稱DEHP),中文姑且翻譯成「有紀律的例外處理原則」。這個原則由Bertrand Meyer所提出,最早投稿至ECOOP(European Conference on Object-Oriented Programming,歐洲物件導向研討會,論文可在此下載),但是被reject(拒收)了。根據Bertrand Meyer表示,早年他的論文「有系統性的」被學術研討會拒絕(暗示有人在背後搞他挑眉質疑),直到後來他寫了一本得獎名著《Object-Oriented Software Construction》,之後大紅大紫,這個情況才改善。哇,原來大師也有被「打壓」的過往。

***

言歸正傳,DEHP好就好在它只有兩條規則,簡單、好記、好學。好聽又不會跳針:

  • Retrying(重試):嘗試改變造成例外的狀況然後重頭開始重新執行一次函數(attempt to change the conditions that led to the exception and to execute the routine again from the start)。
  • Failure(失效):清理環境,中止函數執行然後回報失效給呼叫者(clean up the environment, terminate the call and report failure to the caller)。這條規則又叫做organized panic,對岸有人翻做「忙而不亂」。

如果鄉民們一直有在注意Teddy所寫的例外處理文章,Retrying這一條規則,其實就等於「強健度等級三:行為回復」(請參考〈敏捷式例外處理設計的第一步:決定例外處理等級〉)。翻成白話文就是說,就算是遭遇到例外狀況,函數不可以失效,要想辦法達成原本規格中所賦予該函數的任務,接近於C++所稱的「不丟擲保證(no-throw guarantee)」(請參考〈你的汽車有多耐撞?談談例外安全性〉)。

Failure這一條規則,就是告訴函數「你可以放棄了」。雖說是放棄也不是胡亂放棄,至少要把環境打掃乾淨,不要導致資源洩漏。最後,要透過丟出例外的方式,回報函數失效給它的呼叫者。只所以又稱為organized panic,因為函數無法達成任務是一件很痛苦的事(panic),但是雖然痛苦,也要讓這個痛苦是在「受控制」、「有組織」(organized)的情況下發生。

Failure相當於「強健度等級二:狀態回復」,對應到C++的例外安全性,應該涵蓋基本保證(basic guarantee)與強烈保證(strong guarantee)。

***

看到這邊鄉民們不知道有沒有發現,很多事情道理其實是一樣的,但是不同的人會用不同的方式、不同的用語和名詞來解釋,搞得大家暈頭轉向。

DEHP的好處在於簡單,但缺點則是過於簡單。但對於如何設計例外處理完全沒有任何觀念或想法的團隊而言,由DEHP入門,也不失為一個不錯的途徑。

***

友藏內心獨白:DEHP原本設計給Eiffel用的,應該很適用於Ruby吧。

沒有留言:

張貼留言