契約模式Design by Contract
背景
Design by Contract是Bertrand Meyer總結(jié)的一項設(shè)計技巧萝玷,也是Meyer發(fā)明的Eiffel語言的主要特點叶圃。不過,這條原則的作用范圍并不局限于Eiffel掘托,而是所有的程序設(shè)計語言。
那么什么是Contract呢悉患?
我們在聲明一個函數(shù)/方法的時候肩钠,對函數(shù)的輸入和輸出所具備的性質(zhì)是有所期望和規(guī)定的。有時候這種性質(zhì)會被我們明確的寫出來兽间,有時候會被我們忽略掉历葛。這些期望和規(guī)定就是Contract。
核心
核心是斷言(assertion)嘀略。所謂“斷言”恤溶,是指永遠為真的布爾型語句,如果不為真帜羊,則程序必然存在錯誤咒程。通常情況下,檢查斷言的時機讼育,應(yīng)該局限于調(diào)試(debug)階段帐姻,而不是代碼的實際執(zhí)行階段。實際上奶段,完成的程序永遠不應(yīng)期望斷言會被檢查饥瓷。
Design by Contract使用了三類斷言:post-conditions,pre-condition,以及invariants。違反這些操作會導致程序拋出異常
post-conditions痹籍,是指操作執(zhí)行完之后的情況呢铆,發(fā)生在每個操作的最后
pre-condition,是指在執(zhí)行操作之前蹲缠,期望具備的環(huán)境刺洒,發(fā)生在每個操作(方法,或者函數(shù))的最開始吼砂。
invariants逆航,是指使關(guān)于類(class)的斷言,實際上是前置條件和后置條件的交集渔肩。
歪理
從核心來看因俐,這意味著,不變量可以應(yīng)用于特定類暴露的所有公開操作的前提條件與后繼條件。在方法的執(zhí)行過程中抹剩,不變量可能為假撑帖,但是,在其他任何對象能夠與被調(diào)用方進行交互的時刻澳眷,不變量斷言必須恢復為真胡嘿。
在繼承關(guān)系中,斷言扮演著獨特的角色钳踊。繼承的風險之一在于衷敌,開發(fā)人員為子類重新定義的行為,可能會違背父類的行為拓瞪。斷言減少了這種風險缴罗。對某個類來說,其不變量和后繼條件必須能夠應(yīng)用于所有的子類祭埂。子類可以加強這兩類斷言面氓,增加更多的限制,而不能削弱它們蛆橡。而前提條件則只能削弱舌界,而不能增強。
可能有些隱晦難懂可以看這里