


版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、MFC ,一開始就錯了MFC ,一開始就錯了謹以此文祭奠過去多少年下來,日日夜夜學習MFC源代碼的寶貴時光。曾經(jīng)以為MFC 是世界上最神圣無比的東西,發(fā)誓在沒徹底弄透MFC 之前,絕不越雷池半步,碰都不要去碰LISP 、ERLANG 、PYTHON 、VCL 、ATL 、STL 、LOKI 、BOOST各種美妙的好東西。即使一再聽到高人說MFC 設(shè)計得不好,非常糟糕,也都至死而不悔,然后只要稍微聽到有人在說MFC 的偉大, 心里就特別高興。買了各種各樣的VC 方面的書,什么四大天王、什么幾十百千例、什么VC項目實例,徹夜苦讀,單步調(diào)試,一次又一次地徘徊在MFC套來套去的各種美妙代碼之中,觀察里
2、面各個對象的值。一次又一次地感嘆 MFC 的偉大,一直在想,這輩子,如果能徹底地掌握 MFC 里面的一切秘密,朕就心滿意足了。終于有一天,終于徹底醒悟,原來 MFC 真不是好東西,不過就是那些伎倆而已,真不該將它看得如此的偉大。這種念頭一起來,再回過頭來看 MFC 的一坨一坨代碼,只覺得清晰無比,又感覺代碼之中充滿了各種無奈。 接著再看看那些 VC 方面的書,除了四大天王還稍微有些可取之處,其他的任何一本,奇臭無比,沒有一行代碼經(jīng)得起推敲,文筆也糟糕無比,其內(nèi)容又一再重復(fù),抄來抄去,真正是一本又一本的狗屎。感嘆一下:這些書犧牲了多少寶貴的樹木,又折磨死了多少讀者的腦細胞,實在罪大惡極。在 MF
3、C 大河日下的當今的大環(huán)境之下,在下也不想對它落井添石,畢竟也在其上學到不少好東西,特別是閱讀代碼的能力,試問這么糟糕復(fù)雜的框架都可以精通,天下還有什么代碼能看不懂(別自信滿滿,你敢碰BOOST 里面的那些奇技淫巧,匪夷所思的幻碼嗎)。但實在忍受不了軀體內(nèi)另一個人日日夜夜,旦夕不停的訴求,兼之又一直恨鐵不成鋼,又為自己失去的青春陣痛不已。而VC2008 中 BCG的出現(xiàn)之后, VC2010 還依然保留著那些蠢笨無比的BCG 文件,不思悔改,終于讓某徹底對MFC 死心了,這貨沒得救了。好吧,廢話少說,趕緊進入正題。國內(nèi) C+ 界中一大俠說過,任何東西,都要先抓住其主干, 其他的一切細節(jié), 都可以
4、留待以后慢慢補充, 否則,一開始就陷入細節(jié),想跳出來就不容易了。大俠此語,實在有道理。(不知為什么,此大俠后期一直在對C+ 表示不滿,當然,人家現(xiàn)在的境界,豈是我等小民所能體會) 。不說其他,就說在 C+ 中,必須站在一個高度上,縱觀全局,才能將一切看得通通透透。于是,下面就嘗試爬上高峰,來俯瞰 MFC 中的眾生。 MFC 的主干,在下看來,既不是什么六大關(guān)鍵技術(shù), 也不是什么文檔視圖結(jié)構(gòu), 更不是 COM 的封裝,而是為了將原始的 API 中的各種對象,好比窗口、 GDI 、設(shè)備環(huán)境等,都映射成相應(yīng)的多線程安全的 C+ 對象,好比將 HWND 搞成 CWnd ,以期減輕 WINDOWS 下界
5、面開發(fā)的工作量。這種想法,其實也無可厚非,如果真能封裝得好,確實可以提高生產(chǎn)代碼效率,但是從C+ 和 WINDOWS 的設(shè)計觀念中來看,這種映射,還是存在很大的問題,稍后再述。問題在于, MFC 的實現(xiàn),異常丑陋呆板,通過幾個全局的線程安全局部變量的映射表,將句柄(Handle,此詞譯得相當令人惡心)與其相應(yīng)的C+ 對象指針形成一一對應(yīng),并且指定,在大部分的消息處理和參數(shù)傳遞中,所有的參數(shù)由原本的句柄一律由對象指針來代替,然后就高高興興地宣稱已經(jīng)完成任務(wù)了,這實在讓人哭笑不得。不說別的,即使是消息處理, MFC 即使已經(jīng)做了很大的努力,也都無法將句柄參數(shù)搞成對應(yīng)的對象指針,單是這一點,就已經(jīng)失
6、敗了。然后再看看,它最后封裝的做法,不過是將API 函數(shù)中的第一個參數(shù)為句柄的都改成相應(yīng)的C+ 對象的函數(shù)成員,好比將SetWindowText 搞成 CWnd:SetWindowText ,美其名曰,薄薄的封裝。 這真是要笑掉大牙了, 既然是這樣的薄薄的封裝,那還干脆不如不封裝了, 我想破了頭, 也看不出這樣的封裝,帶來了什么樣的好處。反而將原本全局函數(shù)的各種靈活性,都給葬送在類成員函數(shù)這個監(jiān)獄中。全局函數(shù)的各種好處,除了是全局這個缺陷之外,實在都是類成員函數(shù)沒法比的。而且,鑒于 API 中數(shù)量實在太多,于是搞出來的 C+ 對象都是龐然大物,最臭名昭著的,當然要數(shù) CWnd 和 CDC 這對
7、黑風雙煞了,使用起來,極不方便,極難學習。一個類的函數(shù)過多,無論如何, 都是失敗的設(shè)計。 還有,如果 WINDOWS 系統(tǒng)新增了什么使用到句柄的函數(shù),這些類也都要相應(yīng)地增加新成員函數(shù),再進一步說,如果用戶自己因為需要,也要開發(fā)使用到句柄的全局函數(shù),要怎么想辦法整成員函數(shù)呢。其實, MFC 中的所謂的線程安全, 其實也不過是自欺欺人的說法而已,你要想在 MFC 中多線程的使用窗口對象,即使不是不可能,那也要花費九牛二力氣才能在多線程中共享窗口對象,一切皆只因 MFC 已經(jīng)很努力地做到了不讓你在多線程下使用窗口對象。好了,再進一步考察,在這種思路的指導下,最后MFC 被設(shè)計成一個什么樣的框架。一直
8、很懷疑想,MFC 的設(shè)計者,是否不是對WINDOWS API的精神了解得不透徹,又或者對 C+ 不是很精通,否則,無論如何,斷斷都不會整出 MFC 這樣的一個人不象人、鬼不似鬼,精神分裂、做事虎頭蛇尾的鬼東西出來。要不然,我們用MFC 開發(fā),就不會覺得束手束腳,很不好施展拳腳,一再感覺一直受制于其可惡的呆板的框架之下,這并不是說框架不好,只是MFC這套框架,實在很不好擴充。這樣也罷了,問題是,MFC 在使用上,又很不人性化,你又要陷入各種各樣的細節(jié)之中,什么二段構(gòu)造,有些對象又要自己刪除,有些又不能自己刪除等,更要命的是, MFC 的運行效率又臭名昭著。有些同學就會問,貌似在MFC 開發(fā),其實
9、也很強大很靈活,殊不知這種強大和靈活,那都是源于C+ 的強大靈活,也源于WINDOWS 系統(tǒng)的強大靈活,源于MFC 只對 API 只作了一層薄薄的封裝,與MFC 本身的設(shè)計沒什么太多的關(guān)聯(lián)。當拋開 MFC ,直接用 API 和 C+ 來寫代碼,就體會到什么才叫做強大靈活,除了代碼比MFC 多一點之外,一切都要比MFC 來得清爽, 也要來得容易維護。 如果,如果設(shè)計做得好,可能總體的代碼量不會比用MFC 的多也說不定。于是,這么一個偉大的框架,表現(xiàn)出來的,很多地方都 C+ 的精神格格不入。承然, MFC 剛開始設(shè)計時, 缺乏太多的 C+ 的特性的支持,而不得不另起爐灶。但是,就算沒有 C+98
10、中的功能支持,MFC 也不該出現(xiàn)以下這么重大的設(shè)計問題。1、 不需要用到的特性,我們依然要付出種種代價。我們看到 CCmdTarget 集成了 COM 的功能, CWnd 中對 ActiveX 的支持,就算我們的代碼不包含一丁點使用到COM 的代碼,我們都要背負每個CWnd 中將近 100 個字節(jié)的大小, 運行過程中一再要忍受框架代碼中對ActiveX 變量的一次又一次地檢查。我們看到,就算不使用文檔視圖結(jié)構(gòu),CMainFrame中都要承受對它的支持代碼,和各個不必要的成員變量??傊?,MFC 中有很多特性, 就算不愿意使用, 它們還是在那里,不容許我們忽視。2、 耦合太厲害。我們看到, CWn
11、d 中居然出現(xiàn)了對子類 CView 和 CFrameWnd 的引用, CControlBar 的成員函數(shù)中有對 CToolBar 的 CAST ,然后, CFrameWnd 又引用到CControlBar 和 CView , CControlBar 和 CView 也都用到 CFrameWnd 的函數(shù),各種各樣好厲害的循環(huán)依賴, 這么糟糕的設(shè)計竟然出現(xiàn)在 C+ 的著名的界面框架,不得不令人嘆息不已。這樣的耦合,就是在MFC 之中,一個類設(shè)計得再好,也只能在某些特定的場合下使用。好比,CControlBar,CSplitterWnd 這兩個好東西只能活在CFrameWnd ,CView 的環(huán)境下
12、,想在其他的地方使用上就煞不容易了。就算是著名的文檔視圖結(jié)構(gòu),也都是問題很大,如果我的類,想要訂閱文檔中的通知消息,還要求必須派生于CView 中,這個限制也太厲害了,于是為了它這個死板的設(shè)計,有多少次,我們必須改變設(shè)計,以適應(yīng)MFC 的無理取鬧的要求。3、 功能太過單?。?MFC 僅僅是作為一個界面的基本框架而已,僅僅實現(xiàn)了從句柄到對象的映射,然后,再加上一點點所謂的文檔視圖的MVC 模式,必要的多視圖多子窗口的支持,基本的必要的COM 支持,對API 的薄薄封裝,僅此而已(至于 SOCKET 、WININET和數(shù)據(jù)庫的MFC 類,又有多少可利用的價值) 。有多少次,我們想對對話框進行拉伸的
13、操作;有多少次,我們需要用到表格控件; ,但是,這一切,想要MFC 提供更加強大的控件,完全都沒有。必須求助于第三方控件公司庫,好比,BCG 、XTREME ,你們知道,MFC 的代碼就算再爛,也還是很有分寸,還能保住最基本的底線,但是,第三方控件的代碼,那真的是,讓人大驚失色,沒有做不到的,只有想不到的。要知道,C+ 可是很強大的,但是,用它做出來的框架,卻如此的功能之小。4、 MFC 中的類的功能不單一,承載了太多的責任,導致很容易就出現(xiàn)了很多重復(fù)的代碼:好比CCmdTarget 中原本只是為了可以處理消息,后來居然還兼具COM 的功能。又好比,CList, CMapPtrToPtr 里面
14、又都包含了內(nèi)存池的實現(xiàn)代碼,原本這些內(nèi)存池的實現(xiàn)代碼就應(yīng)該剝離出來。5、 行為錯亂,神經(jīng)分裂,沒有統(tǒng)一的接口,以至于使用起來,極易出錯。很多地方,都努力地去做了,但是都做得不徹底。企圖封裝所有的WINDWOWS的界面的 API ,但無論如何,都做不到,而且它自己內(nèi)部也都知道沒辦法做到,但它還要努力地去做。各種各樣的問題,難怪MFC 的書那么多,沒有一本可以作為面向?qū)ο蟮牡浞秾W習,即使四大天王,也不過只是沒有那么惡臭而已。原來一切,皆只因為源頭本就臟了。之前還以為, MFC ,還能算是一積心堆砌而成垃圾。總體設(shè)計,雖然確實糟糕透頂,但細微上看,還能做到讓人擊節(jié)贊嘆,好比對于線程局部變量的封裝擴展,消息映射表。 可是,即使局部代碼的實現(xiàn),也都充滿了重重的缺陷。如果說 MFC 還有些可圈可點之處,VC2008 之后引進的 BCG
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 湖南軟件職業(yè)技術(shù)大學《內(nèi)部控制理論與實踐》2023-2024學年第二學期期末試卷
- 四川財經(jīng)職業(yè)學院《播音發(fā)聲學》2023-2024學年第二學期期末試卷
- 內(nèi)蒙古大學《機器學習與深度學習》2023-2024學年第二學期期末試卷
- 湖北警官學院《倉儲管理與庫存控制》2023-2024學年第二學期期末試卷
- 上海工藝美術(shù)職業(yè)學院《冶金質(zhì)量分析》2023-2024學年第二學期期末試卷
- 西安海棠職業(yè)學院《礦山裝備及自動化》2023-2024學年第二學期期末試卷
- 塔里木大學《控制工程基礎(chǔ)》2023-2024學年第二學期期末試卷
- 2024年電子體重秤項目投資申請報告代可行性研究報告
- 2024年形狀記憶合金項目資金籌措計劃書代可行性研究報告
- 銷售人員系統(tǒng)培訓
- 高空作業(yè)安全會議記錄內(nèi)容
- 00510秘書實務(wù)-自考整合版
- 護理研究中的偏倚及控制
- 小學生的齲齒預(yù)防ppt課件
- [復(fù)習]邊坡客土吹附施工方案
- 沖壓試題庫及答案文檔
- 管理人員責任追究制度
- 自動旋轉(zhuǎn)門PLC控制
- 電影場記表(雙機位)
- 畢設(shè)高密電法探測及數(shù)據(jù)處理解釋
- 華為保密制度范文
評論
0/150
提交評論