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

天行健 君子當自強而不息

【ZT】MFC五大批判


算起來,我用Visual C++也有將近5年的歷史了。在這期間,我也曾涉獵過Visual Basic和Delphi,但都是淺嘗而止;Visual C++始終是我的主業。可是努力的成果如何呢?我用Delphi作出了十多個有規模的軟件,用VB--雖然我用在VB上的時間只有短短的兩三個月--也有兩個像樣的項目;然而,在我付出了最大熱情和最多努力的Visual C++上面,卻只作出了三個自己看得上眼的軟件。

固然,在用Visual C++的時候,MFC幫了我不少的忙。但是,在寫下這個題目之時,我就已經打定主意:在這篇文章中,只對MFC提出批評,不說MFC的好話。Visual C++的擁護者且慢發難,聽我道出其中原因。我注意到,象候捷先生這樣對MFC極其熱愛的著者,在其大著《深入淺出MFC》中對MFC的評價也是盡量的做到客觀和公允;而大師Charles Petzold和Jeff Prosise,在他們的作品中也只是給予MFC以謹慎的贊美。Charles Petzold還很客氣的指出了MFC的局限。然而另外一些編程書籍的作者,特別是某些國內的作者,似乎毫不吝惜把最華麗的語言和最夸張的贊美賦予 MFC,從書架上任意翻開一本介紹Visual C++的書籍,看看它的前言和序章,往往充斥著讓人目眩的溢美之辭。多少初學者被這些充滿暗示和誘導的辭令吸引,以為MFC是完全可視化的,象VB一樣容易掌握的東西,當他們深入以后,會不會有上當的感覺呢?我痛恨一切不負責任的夸大和炫耀,特別是只為了增加書籍銷量而不惜昧著良心說話的作者,而我的感覺是現在這樣的作者和書籍似乎已經泛濫了。本著矯枉必須過正的指導思想,我的目的很明確,就是要批評MFC。對Visual C++和MFC非常熟悉的讀者,我無慮您對本文提出批評和指責,因為您對MFC已經有了自己的觀點,不會為我所誤導;對Visual C++的入門者,我希望您在聽夠了對Visual C++和MFC的贊美之后,來聽聽另一種聲音,即使它并不完全正確(甚或是充滿謬誤),至少能讓您帶著自己的思想來看待您將要學習的東西。


對MFC的批判之一:不支持屬性,MFC憑什么同其他語言抗衡?

竊以為在編程語言中引入“Property”的概念是在面向對象的編程思想后最為重大的革新之一。其實,目前市場上絕大部分編程語言,包括VB, Delphi,C++Builder和PowerBuilder等等都支持Property。程序員只要簡單的修改對象的屬性,就能夠完成相當部分的工作,不僅是減少了無謂的勞動,更重要的是減少了出錯的機會,并且使得生成更復雜的界面和完成更復雜的工作成為相對容易的工作。我想絕大部分人會同意,如果去掉了Property這個東西,那么象VB和Delphi這樣好的RAD,包括Microsoft一直倡導的ActiveX,都會失去了絕大部分的魅力。這個道理,Microsoft應該是在推出Visual Basic 1.0的時候就認識到了。可是自從Visual C++誕生到現在,它似乎絲毫沒有使用Property的意思,雖然Visual C++這個名字在很大程序上沾了它的長兄Visual Basic的光,不過它并沒有從VB那里學到如何讓編程更簡單和更輕松的秘訣。

有人可能會說,data member of class不是property嗎?不是的,如果你用過C++Builder的話你一定能明白這種分別。MFC從來就不支持Property,而且今后看來也不會了,這意味著用MFC,你還是得干苦力活。(ActiveX?不錯,ActiveX支持Property,而且MFC支持ActiveX開發,不過這并不是三段論發揮作用的地方。)


對MFC的批判之二:單調的處理方式使本來應該簡單的工作變得復雜

應該沒有人反對這樣的觀點:用Visual C++開發界面,特別是不符合Microsoft所謂“標準”的程序,比VB,Delphi或是C++Builder都要慢得多。(附帶說一句,我不知道 Microsoft制定Windows Logo標準,并且要求程序員遵守的依據是什么;我自己的程序99%以上都不符合這個標準。)可這是為什么呢?是C++語言在這方面的天生不足?肯定不是。

在我看來,罪魁禍首是MFC中的CDocTemplate,這個類規定了一種非常死板和機械的機制,即一個Document,一個View和一個FrameWnd綁定在一起。遺憾的是,實際情況往往復雜的多。對界面稍微稍微要求高一點的程序大多要求一個Document有多個View,甚至在某些程序中,希望在同一個View中顯示多個Document的內容:比如,將兩個公司的業績放在一起作比較。對View和FrameWnd的關系也有類似的情況。然而,DocTemplate的機制使得這樣并不高的要求變的相當困難。想實現你的要求嗎?可以。你要添加新的View類。你要從默認的 IDR_MAINFRAME復制資源到新的類中。你要用AddDocTemplate添加自定義模板。你要用
GetFirstDocTemplatePosition和GetNextDocTemplate檢索模板列表。你要用GetDocString察看每個模板是否符合你的要求。你要重載CFrameWnd::OnCreateClient以派生新的視圖。你要用CView::SetDlgCtrlID和 CFrameWnd::SetActiveView以及CFrameWnd::RecalcLayout來在各個視圖中切換。你要用未公開的 CDocManager管理文檔模板。你要...還要嗎?反正我是怕了。


對MFC的批判之三:固步自封,不思進取

MFC 可以作為固步自封的活教材。別忘了,MFC是和Borland OWL同一時代的產物(還有多少人記得OWL呢?)當然,這不是MFC的錯誤。不過,如果以個類庫的體系自從2.0版本以來就沒有絲毫改變,是不是意味著這個類庫已經臻于完美了呢?不,即使Microsoft也不敢這么狂妄。但事實是,MFC的體系從MFC2.0以來就沒有變動過。每個版本的更新,不過是增加了一些新類,某些類的接口稍作修改,僅此而已。不,不要把ATL作為MFC的改進;ATL從來就不依賴于MFC。

誰都知道在這幾年中C++語言有了多么大的改進。包括RTTI,Dynamic Creation,Exception,Standard Template Library等等都成為新的C++標準的一部分。不過,Microsoft好像并不喜歡這些新東西,它的做法是另起爐灶;于是在同以套Visual C++中就出現了兩套互不兼容的實現。平心而論,在新的C++標準出臺前,Microsoft自己實現這些機制實在是一個相當了不起的創舉;但是歷史總是在發展的,MFC為什么不從善如流,盡量利用語言中已經實現的功能,而非要固執的用自己的一套老辦法?事實上,MFC幾乎沒有用到新的C++方案中任何有益的元素--盡管這些方案已經對MFC庫中很多問題提出了相當完美而且精練的解決方法。


對MFC的批判之四:天然的傾向性

不知道您對AppWizard生成的默認項目有什么感覺。反正我的感覺是:這種工程就是用來開發象Word,Excel這樣的程序的。好像MFC天然的就傾向于這樣一種程序。但事實上,這種程序少之又少。

在Microsoft 看來,好像每個程序都應該有一個File菜單,而且這個菜單下面一定應該有New,Open,Save,Exit這些選項。在我的實際經驗來說,我只搞過一個程序符合這樣的要求。有多少人真的要搞一個自己的字處理程序或是電子表格呢?對于很多常見的、基于數據庫的程序,你需要New,Open和Save 嗎?如果是基于網絡的程序呢?特別是在多媒體程序和游戲程序中,MFC生成的框架與其說是幫助,不如說是累贅。

這倒是符合Microsoft的一貫風格:你要的只是特定的功能,它卻一并塞給你一大串不相干的東西,并且在很多時候,這些不相干的東西反而成為麻煩制造者。于是,我不得不在新生成一個項目后,不辭勞苦的去掉AppWizard“慷慨”的贈送品,包括大量無用的菜單和工具條按鈕,然后才能開始實際的工作。說實在的,AppWizard在為我減少工作量的同時,也增加了我不少勞動量。

MFC定義了一個Document-View框架,并且把Document定義的相當寬泛,幾乎可以代表任何數據。但是在實現上,Document是相當狹窄的;比如Document定義的Serialize固定的與一個CArchive對象聯系在一起,而CArchive又固定的與一個CFile聯系在一起,這樣實際上就限定Document處理的對象只能是磁盤文件。況且,在一個 Serialize中處理所有數據的序列化也是一種相當機械而死板的機制:它只能處理小量而且是一次處理完畢的數據,而實際上,程序往往要處理大塊的數據,并且不可能一次完成。在這種情況下,CDocument的處理機制反而是個障礙。此外,在很多類型的程序中,CDocument扮演的是一個很尷尬的角色:比如在絕大部分數據庫程序中,CDocument完全是個雞肋,實際的數據處理只能靠CRecordset來完成;再比如說,在最典型的Doc- View程序--就是記事本程序--中,CDocument根本是個無能的東西,因為它存取數據反而要求助于CEditView:: SerializeRaw。

Doc-View框架有可能突破這些限制嗎?完全可能。不過,你要有心理準備,如果你要這么作,你就必須求助于一大堆的未公開函數和類型,這些東西完全沒有文檔,依賴于你對MFC“底下的東西”究竟有多么熟悉,以及你是否愿意鉆研MFC的源代碼--在絕大多數情況下這不是一件愉快的工作。如果你使用這些未公開的東西出了問題,或者你不知道如何使用,對不起,Microsoft不會給你任何支持--誰教你不按照 Microsoft的邏輯工作來著!


對MFC的批判之五:什么是封裝?

好像這不成為一個問題。但是對MFC而言,封裝的定義是不成立的。這句話的意思是說,如果你不想生產玩具的話,如果你需要調試程序的話,如果你的代碼需要有比 AppWizard更多的東西,那么,MFC對你來說就不是封裝的。如果你的程序運行出了錯,對不起,問題不在你的代碼里面,而在MFC庫的某個文件中, Visual C++會為你打開這個文件,至于“為什么會出錯?”“這個函數究竟是用來干什么的?”MFC不會給你答案,你自求多福吧。如果你除了MSDN中的公開文檔以外,對MFC的源代碼從不關心,那么恭喜你,你是個快樂的程序員,但是你永遠不能生產出真正有用的程序。

候捷先生在其著作《深入淺出MFC》中也曾提到:或許有人會產生疑問,追尋“黑盒子底下的東西”,豈不有違面向對象編程的初衷?但是沒有辦法,不去熟悉MFC的源代碼,永遠只能生產玩具。候先生說的很委婉,盡量不批評MFC。但是,我可以這樣說:使用VB,Delphi,C++Builder,Java這些語言的程序員幾乎從來不去關心類庫的源代碼,可是這些語言并不是用來生產玩具的!


posted on 2007-09-26 14:32 lovedday 閱讀(768) 評論(0)  編輯 收藏 引用 所屬分類: ▲ C++ Program

公告

導航

統計

常用鏈接

隨筆分類(178)

3D游戲編程相關鏈接

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美chengren| 欧美日韩国产片| 在线观看视频一区二区| 久久精品日韩欧美| 午夜国产精品视频| 国产精品美腿一区在线看| 亚洲网站啪啪| 99亚洲伊人久久精品影院红桃| 欧美日韩国产精品成人| 这里只有精品视频| aa级大片欧美三级| 国产精品免费看| 欧美影院精品一区| 欧美专区亚洲专区| 尤物九九久久国产精品的分类| 久久婷婷久久| 久久夜色精品国产亚洲aⅴ| 亚洲电影在线| 91久久综合| 另类图片国产| 亚洲乱码国产乱码精品精天堂| 亚洲国产成人高清精品| 麻豆国产精品一区二区三区| 亚洲精品久久久久久久久久久久| 亚洲啪啪91| 国产精品福利av| 久久国产精品99国产精| 久久久精品性| 亚洲精品永久免费精品| 99国内精品| 国产模特精品视频久久久久 | 亚洲精品乱码久久久久久按摩观| 欧美全黄视频| 午夜免费日韩视频| 久久成人一区| 亚洲国内精品| av成人免费在线观看| 国产美女精品视频| 欧美高清在线一区二区| 欧美日韩国产综合在线| 欧美一区在线直播| 快播亚洲色图| 99热这里只有成人精品国产| 亚洲一区二区三区四区在线观看 | 国产一区二区在线观看免费播放| 免费在线欧美视频| 欧美电影打屁股sp| 午夜老司机精品| 久久久久久久一区二区| 日韩亚洲欧美在线观看| 亚洲女女女同性video| 亚洲风情在线资源站| 亚洲精品美女在线观看| 国产伦精品一区二区三区高清| 美女黄网久久| 国产精品国产福利国产秒拍| 久久综合99re88久久爱| 欧美日韩国产精品 | 国产区在线观看成人精品| 麻豆精品传媒视频| 欧美三级网址| 老司机一区二区三区| 欧美日韩中文字幕| 久久综合精品国产一区二区三区| 欧美另类高清视频在线| 欧美与欧洲交xxxx免费观看| 欧美 日韩 国产在线| 欧美在线视频一区二区三区| 欧美丰满少妇xxxbbb| 欧美一区免费视频| 欧美国产日韩一区二区在线观看 | 亚洲视频欧洲视频| 久久高清一区| 在线综合视频| 美女999久久久精品视频| 亚洲欧美激情四射在线日| 美日韩精品视频免费看| 欧美一区二区三区视频免费| 欧美精品粉嫩高潮一区二区| 久久精品成人| 欧美三级午夜理伦三级中视频| 女主播福利一区| 国产欧美日韩视频一区二区三区| 亚洲精品免费电影| 在线免费观看成人网| 亚洲欧美另类久久久精品2019| 日韩午夜av| 玖玖国产精品视频| 久久精品一区二区三区中文字幕 | 欧美午夜电影完整版| 牛牛国产精品| 国产深夜精品福利| 99re66热这里只有精品3直播| 亚洲国产精品高清久久久| 香蕉视频成人在线观看| 在线视频你懂得一区| 卡一卡二国产精品| 久久五月婷婷丁香社区| 国产伦精品一区二区三区免费迷| 日韩视频在线播放| 亚洲人成高清| 久久夜色精品国产欧美乱| 久久婷婷丁香| 国产亚洲精品aa午夜观看| 亚洲视频综合| 亚洲一区视频| 欧美日韩精品一区二区| 亚洲黄色免费电影| 亚洲国语精品自产拍在线观看| 欧美一区二区三区免费观看视频| 亚洲欧美国产日韩天堂区| 欧美日韩免费观看一区二区三区| 亚洲第一色中文字幕| 亚洲高清自拍| 久久尤物视频| 欧美成在线观看| 黄色免费成人| 久久精品国产精品| 久久久噜噜噜久久狠狠50岁| 国产日韩欧美一区二区三区四区| 亚洲一区在线播放| 午夜一区不卡| 国产九色精品成人porny| 亚洲一区二区免费| 性欧美video另类hd性玩具| 国产精品久久久久天堂| 亚洲视频www| 亚洲欧美中文日韩在线| 国产精品福利影院| 亚洲一级片在线看| 先锋影音网一区二区| 国产精品一区二区黑丝| 午夜精品免费在线| 久久久人成影片一区二区三区观看| 国产偷自视频区视频一区二区| 欧美一区二区三区免费大片| 久久久久亚洲综合| 亚洲高清视频中文字幕| 男人的天堂成人在线| 亚洲国产另类精品专区 | 亚洲国产精品电影| 欧美**字幕| 亚洲娇小video精品| 99国产精品国产精品久久| 欧美成人一区二区三区片免费| 亚洲欧洲综合另类| 一区二区三区国产| 国产精品mv在线观看| 亚洲欧美日韩直播| 久久婷婷国产麻豆91天堂| 在线日本成人| 欧美绝品在线观看成人午夜影视| 一本大道av伊人久久综合| 午夜亚洲福利| 精品成人a区在线观看| 欧美91福利在线观看| 99精品视频免费观看视频| 欧美亚洲视频一区二区| 国产综合自拍| 欧美成人在线影院| 一级日韩一区在线观看| 欧美中在线观看| 亚洲第一在线综合网站| 欧美大片在线看| 亚洲午夜激情| 久久免费视频这里只有精品| 亚洲激情二区| 国产精品久久久免费| 久久激情婷婷| 最新亚洲电影| 亚洲欧美日韩另类精品一区二区三区 | 欧美国产欧美亚洲国产日韩mv天天看完整| 亚洲精品国久久99热| 国产精品v欧美精品v日韩精品| 欧美一区二区在线免费播放| 亚洲高清在线观看| 亚洲欧美综合国产精品一区| 国内精品国产成人| 欧美韩日一区二区| 亚洲免费在线视频一区 二区| 牛牛精品成人免费视频| 亚洲免费婷婷| 1204国产成人精品视频| 欧美午夜视频在线观看| 久久裸体艺术| 一区二区欧美亚洲| 免费久久久一本精品久久区| 一区二区高清在线| 国产真实精品久久二三区| 欧美国产第二页| 性久久久久久久| 亚洲伦理一区| 久久视频在线视频| 亚洲尤物影院| 在线日韩av片| 国产视频欧美| 欧美日韩日本国产亚洲在线| 久久久xxx| 亚洲一级在线观看| 亚洲欧洲在线观看|