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

拂曉·明月·彎刀

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

  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>
            精品999在线观看| 欧美在线3区| 香蕉尹人综合在线观看| 亚洲五月婷婷| 欧美一区2区三区4区公司二百| 欧美亚男人的天堂| 国产精品入口麻豆原神| 国产一区二区三区的电影 | 欧美激情精品久久久六区热门| 毛片av中文字幕一区二区| 欧美岛国激情| 亚洲线精品一区二区三区八戒| 亚洲综合精品| 麻豆9191精品国产| 国产精品sss| 在线播放一区| 亚洲欧美日韩国产成人精品影院| 亚洲国产精品专区久久| 在线亚洲美日韩| 亚洲视频在线视频| 久久国产欧美| 欧美日韩一区自拍| 国产又爽又黄的激情精品视频| 亚洲国产第一页| 亚洲欧美日本国产专区一区| 快she精品国产999| 亚洲视频在线观看网站| 久久免费少妇高潮久久精品99| 欧美日韩国产高清视频| 国产在线乱码一区二区三区| 99re热这里只有精品视频| 欧美在线视频免费观看| 亚洲日本在线视频观看| 欧美中文字幕第一页| 欧美日韩一区二区在线观看 | 久久亚洲视频| 国产精品免费观看视频| 亚洲精品欧美一区二区三区| 久久精品国产综合精品| 999在线观看精品免费不卡网站| 久久国产欧美| 国产日韩欧美一二三区| 亚洲一区免费在线观看| 亚洲国产精品一区在线观看不卡 | 欧美一级电影久久| 欧美日产国产成人免费图片| 亚洲电影免费在线| 久久尤物电影视频在线观看| 亚洲综合精品一区二区| 欧美午夜不卡在线观看免费| 日韩亚洲综合在线| 免费观看亚洲视频大全| 久久精品三级| 影音欧美亚洲| 免费在线欧美黄色| 久久久久久穴| 亚洲国产精品成人综合| 免费成人黄色| 麻豆freexxxx性91精品| 136国产福利精品导航网址| 久久亚洲一区二区| 久久一区精品| 亚洲精品免费一区二区三区| 亚洲国产一区二区三区高清| 美国成人直播| 日韩一级在线| 一区二区三区偷拍| 国产欧美一区二区精品忘忧草| 欧美中文字幕视频在线观看| 欧美一区二区视频观看视频| 狠狠色丁香久久婷婷综合丁香| 久久成人免费日本黄色| 亚洲男人的天堂在线| 国产精品毛片在线看| 久久午夜精品| 一区二区不卡在线视频 午夜欧美不卡在 | 亚洲嫩草精品久久| 欧美久久久久免费| 亚洲午夜av在线| 亚洲一区免费视频| 国产亚洲日本欧美韩国| 麻豆91精品91久久久的内涵| 猛男gaygay欧美视频| 亚洲九九精品| 亚洲女优在线| 亚洲国产精品嫩草影院| 亚洲精品一区二区三区樱花| 国产精品普通话对白| 久久久综合视频| 欧美激情视频在线播放| 性伦欧美刺激片在线观看| 久久久久久久激情视频| 一本色道久久88精品综合| 亚洲欧美福利一区二区| 亚洲国产精品久久久久秋霞不卡| 亚洲九九爱视频| 韩国三级电影久久久久久| 91久久国产综合久久蜜月精品| 欧美日韩国产麻豆| 久久综合精品国产一区二区三区| 欧美韩国日本综合| 久久国产精品久久w女人spa| 欧美成人激情在线| 久久爱另类一区二区小说| 欧美高清在线精品一区| 久久精品动漫| 国产精品a久久久久久| 欧美成人自拍视频| 国产伦精品一区二区| 亚洲人永久免费| 亚洲二区免费| 欧美影院久久久| 亚洲一区二区三区午夜| 老司机精品久久| 欧美一区二区三区在| 欧美日本精品在线| 亚洲成色最大综合在线| 国精品一区二区| 亚洲人成在线播放| 欧美在线视频在线播放完整版免费观看| 亚洲高清视频一区二区| 午夜影视日本亚洲欧洲精品| 9人人澡人人爽人人精品| 久久激情五月激情| 午夜欧美精品久久久久久久| 欧美日产在线观看| 亚洲国产人成综合网站| 狠狠入ady亚洲精品| 性18欧美另类| 欧美在线观看网站| 欧美四级在线观看| 99热这里只有精品8| 亚洲免费成人av| 欧美成人一区二区在线| 欧美电影在线| 亚洲人成在线观看| 蜜桃av久久久亚洲精品| 嫩草影视亚洲| 亚洲国产一区二区视频| 噜噜噜91成人网| 欧美成人性生活| 亚洲欧洲视频| 欧美乱在线观看| 一本大道久久a久久综合婷婷| 一本色道婷婷久久欧美| 欧美视频第二页| 亚洲自拍偷拍色片视频| 性18欧美另类| 一区视频在线播放| 美女久久网站| 日韩午夜一区| 欧美一级久久久| 国产亚洲欧美日韩美女| 久久久成人精品| 亚洲第一精品夜夜躁人人躁| 亚洲每日更新| 国产精品欧美精品| 欧美一区二区国产| 欧美成人一品| 亚洲特色特黄| 国产亚洲制服色| 欧美成人精精品一区二区频| 99国产精品久久久久老师| 午夜精品福利在线观看| 国产在线播精品第三| 蜜桃久久精品一区二区| 中国成人在线视频| 久久中文字幕一区| 一本色道88久久加勒比精品| 国产日本精品| 欧美成人精品福利| 亚洲欧美成人精品| 欧美国产一区二区三区激情无套| 亚洲视频在线观看网站| 国内精品久久久久久影视8| 欧美福利专区| 亚洲欧美国产另类| 亚洲国产天堂网精品网站| 欧美一级电影久久| 亚洲精品日日夜夜| 国产亚洲欧美一区二区| 欧美激情综合在线| 欧美一区二区三区久久精品| 亚洲国产精品成人综合| 欧美一区二区三区免费大片| 亚洲精品在线视频| 加勒比av一区二区| 国产精品三级久久久久久电影| 裸体素人女欧美日韩| 国产精品美女www爽爽爽| 欧美在线观看一区二区| 一本大道久久a久久精二百| 欧美成人精品一区二区| 性做久久久久久久久| 99在线热播精品免费| 在线观看日韩欧美| 国产午夜精品一区二区三区欧美| 欧美日韩一区在线播放| 欧美激情按摩在线| 美女黄网久久|