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

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

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

    Shao Fan

    關于JAVA與軟件工程
    posts - 31, comments - 71, trackbacks - 0, articles - 4
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理
       Design by Contract (DbC)的概念已經出現很長時間了,最先是在Eiffel的一個特色,通過DbC來提高軟件質量,目前很多語言也都有相應的實現,但是在GOOGLE上搜索中文網頁,得到的資源并不是很多.直覺上來說,DbC確實是一個很好的想法,本著拓寬眼界的原則,就簡單了解一下吧.
     
        簡單的說,DbC通過指定每個方法的前置條件,后置條件來保證代碼質量.也就是說,它的假設前提是:"任何一個方法,給予其滿足條件的輸入,應當得到一定的輸出".對于一個方法來說,如果"參數"可看作其輸入,返回值可看作輸出.那么調用這個方法的人有責任保證給予正確的參數,而當正確的參數給予后,該方法本身有責任給出正確的輸出.如果出現錯誤,那么是調用者的問題,還是被調用者的問題,可以根據前面所說的方法來確認.
     
        在實際使用中,DbC可以用來更方便的找出錯誤,確定責任.
     
        拿DbC的一個實現, iContract作例子.比如說,有一方法 foo(int a, int b).它要求輸入的a,b都要大于零.如果提供的參數滿足這個條件,那么它應保證輸出大于0.用iContract來表示,是這樣的:
     
    1 /**
    2 *@pre a>0
    3 
    *@pre b>0
    4 *@post @return
    >0
    5 */

    6 int foo( int a, int b ){
    7       //其他代碼

    8 }
     
        另一個方法調用foo:

    1 public void run(){
    2       int result = foo( 0-1 ); //注意-1不滿足條件@pre b>0

    3 }
     
     
        沒有DbC的情況下,-1的輸入可能導致foo內部產生異常,比如說NullPointerException之類的.當我們看到這樣的異常時,一般來說無法確定是foo方法本身的bug還是其他原因造成的,可能需要跟蹤進去看看才知道.
     
        如果我們用DbC,將這段代碼用一個iContract編譯工具(這里也就是iContract)編譯后(ant提供支持),可以像一般的程序一樣執行.當運行到run方法中時,由于調用時給予的參數不滿足前置條件,也會產生一個運行時異常,但是區別是,異常產生于方法剛被調用前,因此阻止了錯誤的繼續,并指明了錯誤是"調用程序run違反了add方法的前置條件",對程序員來說更加直觀.顯然用這種方式,確定責任更加迅速明確.使用DbC的原因就是,責任明晰,到底是給予的參數有問題,還是程序本身有問題,更容易查找了.契約式設計的精神就體現在于此.
     
        DbC在java上的實現中,iContract比較有名,但是其開發公司似乎人間蒸發了?ant從1.4后也提供對它的支持,但似乎很難找到它的下載,更不用說后續開發和支持了.javaworld上有對其介紹的文章.如果你想了解DbC,這篇文章也是很好的入門材料.
     
       

        不過后來在wikipedia上找到了DbC的另一種實現:JML,全稱Java Modeling Language,名字挺嚇人的樣子.主要由一些大學聯合開發,很熱鬧,資源也相當豐富.其主頁是這里.JML不只實現了DbC,還有其他的一些東西,還沒仔細看.這篇pdf是一個很好的介紹JML的材料.
     
        此外還有一些書,都可以在Google上找到.總體來說,DbC的學習語法相對簡單,學習成本還是比較低的.有興趣的話不妨一式.

    評論

    # re: 被遺忘的一種提高軟件質量的方法 -- 契約式設計 (Design by Contract)  回復  更多評論   

    2006-03-02 09:37 by GHawk
    可能現在大規模采用DbC還有些問題:
    1. 設計的代價過高。對于很多設計師來說要設計出DbC的OO系統,需要很多的學習和經驗。驗證設計出來的契約也相對比較復雜。
    2. 執行的開銷過大,畢竟,在運行時每驗證一個Contract就要多消耗一些機器資源。(但是我認為使用DbC所帶來的可靠性比起這些開銷是值得的。)
    3. 缺少語言層次的直接支持。Java的assert關鍵字還只是個語法糖而已。不過隨著AOP的普及,相信在這方面很快會有突破的。

    # re: 被遺忘的一種提高軟件質量的方法 -- 契約式設計 (Design by Contract)  回復  更多評論   

    2006-03-02 09:48 by shaofan2
    謝謝,您所知道的有沒有哪些項目采用DbC?

    # re: 被遺忘的一種提高軟件質量的方法 -- 契約式設計 (Design by Contract)  回復  更多評論   

    2006-03-02 14:37 by GHawk
    這就不太清楚了,這方面的資料和宣傳確實很少。
    在www.eiffel.com上有一些客戶應用Eiffel的成功案例??梢詤⒖家幌?。

    # re: 被遺忘的一種提高軟件質量的方法 -- 契約式設計 (Design by Contract)  回復  更多評論   

    2006-09-13 06:47 by sp1234
    如果把DBC僅僅當作一種優化方法入口參數異常檢測代碼的方法,我看應該“被遺忘”。因為我可以寫異常,然后在調試時“檢查調用語句”,這是“很平?!钡恼{試手段,DBC的聲明方式與自己寫異常沒有什么區別,區別似乎僅僅是對異常的時候顯示的源代碼位置不同而已。

    我認為DBC就是這樣被淡忘了——沒有人對后置條件重視,這說明了沒有人重視設計方面的聲明手段。
    主站蜘蛛池模板: 国产成人无码区免费网站| 鲁啊鲁在线视频免费播放| 十九岁在线观看免费完整版电影| 亚洲熟女乱综合一区二区| 一级一看免费完整版毛片| 亚洲成年看片在线观看| 成人特级毛片69免费观看| 亚洲日本中文字幕天堂网| 国产精品免费久久| 亚洲成AV人片在线观看ww| 男人进去女人爽免费视频国产| 国产亚洲高清不卡在线观看| 香蕉成人免费看片视频app下载| 亚洲综合日韩中文字幕v在线 | 日本黄色免费观看| 337P日本欧洲亚洲大胆精品| 亚洲精品国自产拍在线观看| 国产午夜成人免费看片无遮挡| 亚洲av日韩av无码| 毛片在线免费视频| 黄色毛片视频免费| 亚洲AV一宅男色影视| 成人免费视频77777| 看成年女人免费午夜视频| 国产亚洲成av片在线观看| 99久久久精品免费观看国产| 久久精品国产亚洲av瑜伽| 在线观看亚洲精品福利片| 青青草无码免费一二三区| 亚洲日韩av无码中文| 亚洲一区无码中文字幕| 亚洲毛片在线免费观看| 亚洲第一se情网站| 亚洲国产精品久久久久婷婷老年| 久久精品女人天堂AV免费观看 | 久久午夜夜伦鲁鲁片无码免费| 久久亚洲精品专区蓝色区| 国产成人亚洲精品91专区手机| 18女人水真多免费高清毛片| 国产成人 亚洲欧洲| 在线观看亚洲人成网站|