<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Shao Fan

    關(guān)于JAVA與軟件工程
    posts - 31, comments - 71, trackbacks - 0, articles - 4
      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
       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í)成本還是比較低的.有興趣的話不妨一式.

    評(píng)論

    # re: 被遺忘的一種提高軟件質(zhì)量的方法 -- 契約式設(shè)計(jì) (Design by Contract)  回復(fù)  更多評(píng)論   

    2006-03-02 09:37 by GHawk
    可能現(xiàn)在大規(guī)模采用DbC還有些問(wèn)題:
    1. 設(shè)計(jì)的代價(jià)過(guò)高。對(duì)于很多設(shè)計(jì)師來(lái)說(shuō)要設(shè)計(jì)出DbC的OO系統(tǒng),需要很多的學(xué)習(xí)和經(jīng)驗(yàn)。驗(yàn)證設(shè)計(jì)出來(lái)的契約也相對(duì)比較復(fù)雜。
    2. 執(zhí)行的開(kāi)銷過(guò)大,畢竟,在運(yùn)行時(shí)每驗(yàn)證一個(gè)Contract就要多消耗一些機(jī)器資源。(但是我認(rèn)為使用DbC所帶來(lái)的可靠性比起這些開(kāi)銷是值得的。)
    3. 缺少語(yǔ)言層次的直接支持。Java的assert關(guān)鍵字還只是個(gè)語(yǔ)法糖而已。不過(guò)隨著AOP的普及,相信在這方面很快會(huì)有突破的。

    # re: 被遺忘的一種提高軟件質(zhì)量的方法 -- 契約式設(shè)計(jì) (Design by Contract)  回復(fù)  更多評(píng)論   

    2006-03-02 09:48 by shaofan2
    謝謝,您所知道的有沒(méi)有哪些項(xiàng)目采用DbC?

    # re: 被遺忘的一種提高軟件質(zhì)量的方法 -- 契約式設(shè)計(jì) (Design by Contract)  回復(fù)  更多評(píng)論   

    2006-03-02 14:37 by GHawk
    這就不太清楚了,這方面的資料和宣傳確實(shí)很少。
    在www.eiffel.com上有一些客戶應(yīng)用Eiffel的成功案例。可以參考一下。

    # re: 被遺忘的一種提高軟件質(zhì)量的方法 -- 契約式設(shè)計(jì) (Design by Contract)  回復(fù)  更多評(píng)論   

    2006-09-13 06:47 by sp1234
    如果把DBC僅僅當(dāng)作一種優(yōu)化方法入口參數(shù)異常檢測(cè)代碼的方法,我看應(yīng)該“被遺忘”。因?yàn)槲铱梢詫?xiě)異常,然后在調(diào)試時(shí)“檢查調(diào)用語(yǔ)句”,這是“很平常”的調(diào)試手段,DBC的聲明方式與自己寫(xiě)異常沒(méi)有什么區(qū)別,區(qū)別似乎僅僅是對(duì)異常的時(shí)候顯示的源代碼位置不同而已。

    我認(rèn)為DBC就是這樣被淡忘了——沒(méi)有人對(duì)后置條件重視,這說(shuō)明了沒(méi)有人重視設(shè)計(jì)方面的聲明手段。
    主站蜘蛛池模板: 亚洲国产一区二区三区| 亚洲三级视频在线观看| 精品视频在线免费观看| 亚洲福利秒拍一区二区| 大学生高清一级毛片免费| 午夜在线免费视频| 中文字幕亚洲精品| 全部免费毛片免费播放| 久久精品私人影院免费看| 一个人免费视频在线观看www | CAOPORM国产精品视频免费| 亚洲天堂久久精品| 四虎永久免费地址在线观看| 成人免费区一区二区三区| 亚洲中文字幕AV每天更新| 亚洲AV无码一区二区二三区入口 | 黑人粗长大战亚洲女2021国产精品成人免费视频 | 18亚洲男同志videos网站| 国产成人高清精品免费鸭子| 久久久久久毛片免费播放| 免费看内射乌克兰女| 亚洲人成综合在线播放| 国产日产亚洲系列最新| 最近中文字幕无吗高清免费视频| 人妻免费一区二区三区最新| 337P日本欧洲亚洲大胆艺术图 | 国产综合亚洲专区在线| 成人片黄网站色大片免费| 久久免费视频网站| 成人a毛片视频免费看| 亚洲砖码砖专无区2023| 亚洲黄色在线电影| 久久精品国产亚洲一区二区| 国产午夜精品理论片免费观看| 亚洲国产乱码最新视频| 国产做床爱无遮挡免费视频| 日韩免费一区二区三区在线| 免费播放一区二区三区| 岛国精品一区免费视频在线观看| 精品久久亚洲一级α| 亚洲福利一区二区精品秒拍|