Design by Contract (DbC)的概念已經(jīng)出現(xiàn)很長(zhǎng)時(shí)間了,最先是在Eiffel的一個(gè)特色,通過(guò)DbC來(lái)提高軟件質(zhì)量,目前很多語(yǔ)言也都有相應(yīng)的實(shí)現(xiàn),但是在GOOGLE上搜索中文網(wǎng)頁(yè),得到的資源并不是很多.直覺(jué)上來(lái)說(shuō),DbC確實(shí)是一個(gè)很好的想法,本著拓寬眼界的原則,就簡(jiǎn)單了解一下吧.
簡(jiǎn)單的說(shuō),DbC通過(guò)指定每個(gè)方法的前置條件,后置條件來(lái)保證代碼質(zhì)量.也就是說(shuō),它的假設(shè)前提是:"任何一個(gè)方法,給予其滿足條件的輸入,應(yīng)當(dāng)?shù)玫揭欢ǖ妮敵觯?對(duì)于一個(gè)方法來(lái)說(shuō),如果"參數(shù)"可看作其輸入,返回值可看作輸出.那么調(diào)用這個(gè)方法的人有責(zé)任保證給予正確的參數(shù),而當(dāng)正確的參數(shù)給予后,該方法本身有責(zé)任給出正確的輸出.如果出現(xiàn)錯(cuò)誤,那么是調(diào)用者的問(wèn)題,還是被調(diào)用者的問(wèn)題,可以根據(jù)前面所說(shuō)的方法來(lái)確認(rèn).
在實(shí)際使用中,DbC可以用來(lái)更方便的找出錯(cuò)誤,確定責(zé)任.
拿DbC的一個(gè)實(shí)現(xiàn), iContract作例子.比如說(shuō),有一方法 foo(int a, int b).它要求輸入的a,b都要大于零.如果提供的參數(shù)滿足這個(gè)條件,那么它應(yīng)保證輸出大于0.用iContract來(lái)表示,是這樣的:
1 /**
2 *@pre a>0
3 *@pre b>0
4 *@post @return>0
5 */
6 int foo( int a, int b ){
7 //其他代碼
8 }
另一個(gè)方法調(diào)用foo:
1 public void run(){
2 int result = foo( 0, -1 ); //注意-1不滿足條件@pre b>0
3 }
沒(méi)有DbC的情況下,-1的輸入可能導(dǎo)致foo內(nèi)部產(chǎn)生異常,比如說(shuō)NullPointerException之類的.當(dāng)我們看到這樣的異常時(shí),一般來(lái)說(shuō)無(wú)法確定是foo方法本身的bug還是其他原因造成的,可能需要跟蹤進(jìn)去看看才知道.
如果我們用DbC,將這段代碼用一個(gè)iContract編譯工具(這里也就是iContract)編譯后(ant提供支持),可以像一般的程序一樣執(zhí)行.當(dāng)運(yùn)行到run方法中時(shí),由于調(diào)用時(shí)給予的參數(shù)不滿足前置條件,也會(huì)產(chǎn)生一個(gè)運(yùn)行時(shí)異常,但是區(qū)別是,異常產(chǎn)生于方法剛被調(diào)用前,因此阻止了錯(cuò)誤的繼續(xù),并指明了錯(cuò)誤是"調(diào)用程序run違反了add方法的前置條件",對(duì)程序員來(lái)說(shuō)更加直觀.顯然用這種方式,確定責(zé)任更加迅速明確.使用DbC的原因就是,責(zé)任明晰,到底是給予的參數(shù)有問(wèn)題,還是程序本身有問(wèn)題,更容易查找了.契約式設(shè)計(jì)的精神就體現(xiàn)在于此.
DbC在java上的實(shí)現(xiàn)中,iContract比較有名,但是其開(kāi)發(fā)公司似乎人間蒸發(fā)了?ant從1.4后也提供對(duì)它的支持,但似乎很難找到它的下載,更不用說(shuō)后續(xù)開(kāi)發(fā)和支持了.javaworld上有對(duì)其介紹的
文章.如果你想了解DbC,這篇文章也是很好的入門(mén)材料.

不過(guò)后來(lái)在
wikipedia上找到了DbC的另一種實(shí)現(xiàn):
JML,全稱Java Modeling Language,名字挺嚇人的樣子.主要由一些大學(xué)聯(lián)合開(kāi)發(fā),很熱鬧,資源也相當(dāng)豐富.其主頁(yè)是
這里.JML不只實(shí)現(xiàn)了DbC,還有其他的一些東西,還沒(méi)仔細(xì)看.
這篇pdf是一個(gè)很好的介紹JML的材料.
此外還有一些書(shū),都可以在Google上找到.總體來(lái)說(shuō),DbC的學(xué)習(xí)語(yǔ)法相對(duì)簡(jiǎn)單,學(xué)習(xí)成本還是比較低的.有興趣的話不妨一式.