青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

拂曉·明月·彎刀

觀望,等待只能讓出現的機會白白溜走

  C++博客 :: 首頁 ::  :: 聯系 :: 聚合  :: 管理 ::

剛剛發表了《什么是契約》一文,突然發現自己通篇都在寫理論,沒有實例來證明。所以趕快補充一個反面案例——C++ IOStream。說是反面,不是因為IOStream庫設計得不精彩(恰恰相反,你很難找到比IOStream設計更為精彩的C++庫了),而是想展示一下,在沒有契約概念的思想體系里,組件設計將為權責不清的錯誤處理付出多大的代價。

大家知道,C++ IOStream庫非常經典,最先起源于Bjarne Stroustrup的Stream庫,之后經過Jerry Schwartz、Martin Carroll、Andy Koenig等人的改進,成為IOStream庫,并被并入Bell實驗室發行的USD C++庫中,廣為傳播。后來USD庫逐漸消亡了,而IOStream由于獲得廣泛應用,得以幸免,并以新的形式被置于標準庫中。

對于錯誤處理,當IOStream庫誕生的時候(大約1985-1987),C++還沒有異常機制。因此,Jerry Schwartz發明了這樣一套錯誤處理機制:

例1:經典的IOStream錯誤處理:

  ifstream ifs("filename.txt", ios::in);
  if (!ifs) {  // 這里實施了向void*轉型的操作
    // 文件打開失敗,實施錯誤處理
  }

先測試文件是否打開,再實施具體操作,這是經典IOStream庫的一個慣用法(idiom)。

我們現在設想用戶沒有很好地執行這個idiom:

  int val;
  ifstream ifs("filename.txt", ios::in);
  ifs >> val; 

如果filename.txt打開失敗,會發生什么情況?

如果哪位還有當年的Borland C++ 3.1,可以試著測試一下。我估計是什么也不發生,或者說,程序處于極端危險的“undefined behavior”狀態。

這種情況對C++庫開發者來說是不能接受的。因此,盡管問題的出現是由于用戶的錯誤(他們沒有正確地測試流狀態),但是由于非契約思想體系下的權責不清,IOStream庫的開發者開始追求足以應對用戶錯誤的組件開發技術。由此,IOStream開始在一個方向上被拖入了復雜性的泥潭之中。

我們看看標準庫中的對付這種情況采用什么辦法。標準IOStream有一個成員函數叫做exceptions(),專門用來幫助程序員切換異常模式。缺省情況下,異常觸發并沒有打開,所以情形跟經典IOStream庫相同。如果你在操作IOStream之前如下調用:

strm.exceptions(std::ios::eofbit | std::ios::failbit |
                std::ios::badbit);
則當流不處于good狀態時,執行類似 strm >> val;這樣的操作時,將會拋出異常。

這樣做看起來不錯,是嗎?

我覺得不是。請恕我C++標準的異議,這是我第一次正式對C++標準中的設計提出異議。

這種設計帶來的缺點,首先是復雜。在Nicolai Josuttis的The C++ Standard Library中,對這個機制整整用了5頁紙來解釋,還意猶未盡。復雜的設計必然帶來復雜的使用規則,而面對復雜的使用規則,用戶是可以投票的,那就是你做你的,我不用!讀這篇帖子的人,誰在實際項目中使用過exceptions()?事實上,我個人是害怕exception甚于害怕undefined behavior。

而對于用戶來說,你可以不用,卻不得不為對它付出運行性能和空間的代價。諸位有興趣,不妨追蹤一個IOStream功能的實現,看看為了支持這個異常,IOStream庫的設計這耗費了多大的心力,而你的CPU又為此耗費了多少clock。

缺點之二,是異常本身的問題——即使你抓到了異常,又當如何?程序可能已經完全離開了發生異常時的執行環境,也許你連異常為什么發生都搞不清楚,談何處理?也無非就是通知用戶一聲:“我完了,因為一個異常發生在XXXXXXXX處,你要報告的話給我發Email吧。” 是啊,你還能做什么呢?

我們試著用契約觀點來分析這一狀況,如果說“先測試,再使用”在傳統上是一個idiom,那么在contract思想里上升為一個契約。對于C++來說,應該將“流處于good狀態”作為一個契約,在每一個成員函數里進行檢查。甚至你還可以設置一個調試期標志,專門用來核查用戶是否檢查過流狀態。在必要的操作進行之前,你可以先用斷言檢查用戶是否檢查過流狀態,滿足了契約。這樣一來,在契約之下,用戶將被迫以正確的方式使用組件,從而大幅度簡化組件開發的復雜度。

再來考慮異常。如果真正發生了異常,在Eiffel中提供了retry機制。Bjarne Stroustrup說過,retry可以做到,但是往往沒有意義。為什么沒有意義呢?因為C++中沒有契約的思想,異常的產生可能根本就是程序員的bug。在這種情況下,無論retry多少次,結果都是一樣的糟。可是在Eiffel里情形不同。如果各方面對于契約都做到很好的遵循,那么真正發生異常的時候,我們大可以比較有把握的說,這可能是一個很偶然的事件導致的。比如說網絡環境下,另一個用戶在那一瞬間突然對文件實施了一個操作,或者硬件的一次偶然異常。對于這種情況,“再試一次”成了合情合理的選擇。我們很可能將異常扼殺在搖籃之中,從而不給上層模塊帶來任何影響。

誰說契約思想不偉大呢?

posted on 2011-04-19 17:00 一路風塵 閱讀(235) 評論(0)  編輯 收藏 引用 所屬分類: 轉載
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品久久久久久久久久三级| 国产精品99久久不卡二区 | 久久久精品日韩| 午夜在线观看免费一区| 性做久久久久久| 欧美专区18| 久久综合色播五月| 欧美大片91| 欧美午夜女人视频在线| 国产精品中文字幕在线观看| 国产一区二区三区不卡在线观看| 尤物精品国产第一福利三区| 亚洲人成人99网站| 亚洲一区二区在线观看视频| 久久青草久久| 亚洲人成欧美中文字幕| 99精品视频免费观看| 国产精品99久久久久久有的能看 | 美女诱惑一区| 亚洲国产精品va在线看黑人| 亚洲午夜伦理| 久久综合九色综合久99| 国产精品video| 一区二区三区在线视频观看| 日韩视频在线一区| 欧美在线视频导航| 亚洲精品一区二区在线| 欧美亚洲一区三区| 欧美日韩ab| 亚洲国产91色在线| 午夜精品久久久久久久久久久久| 免费成人高清| 亚洲欧美精品一区| 欧美精品一区二区三区蜜桃| 国产视频精品xxxx| 一区二区日韩伦理片| 久久综合久久88| 亚洲一区二区在线看| 欧美大片国产精品| 国产真实乱偷精品视频免| 亚洲免费激情| 欧美 日韩 国产 一区| 亚洲素人一区二区| 欧美激情视频在线播放| 亚洲国产色一区| 久久久久久日产精品| 亚洲精品国产欧美| 久久亚洲捆绑美女| 国产日韩亚洲欧美精品| 亚洲一区二区三区在线观看视频| 欧美激情 亚洲a∨综合| 久久精品官网| 国产毛片一区二区| 午夜精彩国产免费不卡不顿大片| 99精品欧美一区二区三区| 欧美日韩亚洲一区二区三区四区| 一本色道久久综合| 亚洲免费观看高清完整版在线观看熊 | 99精品久久久| 亚洲人在线视频| 欧美日韩国产成人精品| 日韩视频一区二区三区在线播放免费观看| 久久久亚洲人| 久久久综合免费视频| 黑人中文字幕一区二区三区| 欧美中文字幕第一页| 亚洲一区在线直播| 国产日韩欧美在线播放| 久久精品成人欧美大片古装| 午夜在线精品| 国内精品久久久久影院色 | 亚洲欧美日韩成人高清在线一区| 国产精品久久二区| 欧美一级成年大片在线观看| 欧美一区二区三区视频在线观看| 国产一区视频在线观看免费| 久久久久国产精品一区| 久久精彩视频| 最新成人av网站| 亚洲精品国久久99热| 欧美四级剧情无删版影片| 亚洲欧美日韩成人高清在线一区| 亚洲一区二区免费视频| 国产视频综合在线| 亚洲国产精品尤物yw在线观看| 欧美日韩国产一区二区三区地区| 一区二区三区国产精华| 亚洲欧美另类国产| 在线观看一区欧美| 一本色道久久88精品综合| 国产人成一区二区三区影院| 久久亚洲国产成人| 欧美噜噜久久久xxx| 久久本道综合色狠狠五月| 久久久久久久久久久久久女国产乱| 亚洲欧美国产高清| 午夜精品电影| 国产精品video| 亚洲国产精品一区二区尤物区| 午夜精品一区二区三区在线播放| 国产精品中文字幕在线观看| 免费高清在线视频一区·| 欧美国产一区二区| 欧美一区二区三区精品电影| 欧美www在线| 久久www成人_看片免费不卡| 欧美sm视频| 久久激情五月激情| 欧美人与禽性xxxxx杂性| 久久激情视频| 欧美午夜电影网| 亚洲电影欧美电影有声小说| 国产欧美高清| 在线一区免费观看| 亚洲精品一二区| 久久久久久久久久看片| 欧美亚洲一区三区| 欧美三日本三级三级在线播放| 欧美高清一区二区| 国产一区二区在线观看免费播放 | 国产一区二区av| 一本久久综合亚洲鲁鲁五月天| 亚洲国产老妈| 久久久青草青青国产亚洲免观| 欧美一区视频在线| 欧美午夜精品久久久久久孕妇| 亚洲激情国产| 亚洲精品欧美极品| 美女精品在线观看| 久久久亚洲精品一区二区三区| 国产啪精品视频| 亚洲一区二区三区午夜| 亚洲色图综合久久| 欧美久久综合| 亚洲美女在线视频| 日韩亚洲欧美成人一区| 欧美激情亚洲视频| 亚洲肉体裸体xxxx137| 亚洲久久一区二区| 欧美激情第1页| 日韩亚洲欧美一区| 亚洲亚洲精品在线观看| 欧美四级电影网站| 亚洲欧美日韩中文播放| 久久久噜噜噜久久中文字幕色伊伊| 国产亚洲aⅴaaaaaa毛片| 欧美一区视频| 欧美成人精品不卡视频在线观看| 亚洲国产日韩一区| 欧美精品一区二区三区久久久竹菊| 一本久久精品一区二区| 欧美在线free| 亚洲高清中文字幕| 欧美精品电影在线| 亚洲一区在线播放| 另类专区欧美制服同性| 亚洲精选在线| 国产精品你懂的| 久久婷婷丁香| 亚洲最新在线| 久久精品综合| 亚洲精品欧美在线| 国产精品久线观看视频| 久久久www| 在线亚洲成人| 久久视频一区二区| 国产一区二区高清| 免费中文日韩| 一本色道88久久加勒比精品| 久久精品国产99国产精品| 在线电影院国产精品| 欧美日韩亚洲激情| 欧美一级日韩一级| 亚洲日本在线观看| 欧美在线播放一区二区| 亚洲高清网站| 国产女主播一区| 欧美日韩国产精品成人| 欧美一级一区| 亚洲国产日韩美| 久久精品国产成人| 一区二区欧美日韩| 精品动漫3d一区二区三区免费| 欧美午夜电影在线| 美女精品在线观看| 亚洲一区视频在线| 亚洲三级影院| 免费人成网站在线观看欧美高清 | 性色av香蕉一区二区| 影音先锋中文字幕一区| 国产精品国产成人国产三级| 老司机免费视频一区二区| 午夜精彩国产免费不卡不顿大片| 亚洲品质自拍| 欧美aa在线视频| 久久国产一区二区| 在线一区二区三区四区五区| 91久久精品www人人做人人爽| 国产在线观看91精品一区| 国产精品久久久久三级|