簡單談談組件及COM---轉載

        轉眼間,在編程道路上的行走已經快一年了,心裏突然覺得有許多話想拿出來與大家分享一下.我覺得我的路走得很不一般,首先我是學無線電出身的.與編程有點接觸,但並不是看家本領.好閒話少述,我們進入正題吧,不然斑竹要刪帖了,我的話題是屬於C++,希望我沒走錯屋子,作爲我在這個罈子裏的第一帖,我想談談我對組件的一些看法.
  簡而言之,組件就是對象。C++中沒有組件的概念,但它可以做出各種各樣的組件,C++是一門語言,而組件是一個編程模型,Delphi中叫部件,而在Visual BASIC中叫控件。
  組件是對數據和方法的簡單封裝,C++能夠實現組件就因爲C++ 對象模型具備這樣的能力。組件可以有自己的屬性和方法。屬性是組件的數據存貯單位。方法則是組件的一些簡單而可見的功能。
  爲了說明白話題,我來具個例子,我想開發一個工程,這個工程的功能是簡單得不能再簡單的計算.設這個實現1+1=2的組件的方法爲int Add(int var1=1, int var2=1),實現了這個組件後,我把這個組件買過來,進行二次開發.也就是說我的應用程序用了這個組件,但我在用的過程中我得到的並不是原碼,只是二進制的可執行碼,和相關的頭文件(.H什麼的…),還有庫文件(.lib什麼的),最後一個是.dll文件.我在應用中用的只是Add這個方法,它的實現我不知道,但它行爲的結果,我可以接受,因爲我要它算1+1=?時,它不會告訴我等於11.但是總於有那麼一天(或者真有)1+1不等於2了,我就要向賣給我這個組件的開發商說:”我說朋友呀,你最初賣給我的東西,過時了,現在都何年代了,怎麼1+1從你的產品出來的還是等於2呢?我現在呀,沒時間再改我原先的應用了,你得負責,你得讓我原來的應用得出1來呀,不然我以後不再與你合作了”,這時開發商就回去改變了它原先的組件,然後把它交給我,我當然不會再爲我原先的應用重新編譯拉,鏈接拉什麼的…我只是把它給我的.dll覆蓋掉老到掉牙的那分.dll.然後我執行我的老應用程序,奇蹟出現了,1+1真的不是2了,而是1或作別的什麼的.
這就是組件的一般用法,不過它感人的地方遠遠不只這些呀.接下來我要來點術語了和細節了.
首先提個問題(看來我的問題挺多的,呵呵)
爲什麼COM (Common Component Objce)只能提供接口(Interface接口是一個包含方法入口地址的表格,但更確切的說,它就是一個指向表格的指針變量的一個地址,是不是不好理解)給用戶訪問對像,而不能直接訪問Object的數據成員呢?
這個問題的答案是: 這並不是絕對不可以直接訪問Object的數據成員,要訪問得有條件:
1 客戶端的應用程序必須由支持指針的語言來開,例如C++, 但VB不可以.
2 一旦一個組年已經生成,也就是編譯,鏈接成.dll文件後,就不能再改變組件的數據成員了(例如,給對像加一個變量,刪除一個等),甚至把數據員聲明順序也不能改變,但接口可以擴充,記住原來的接口也不可以改變的,但可以擴充.(因爲擴充接口,和改變接口的實現,是COM較爲討人喜歡的地方之一)
要我接受這麼苛刻的要求,就相當於,1+1永遠等於2了,不能再改變了,也就是,開發商不會再爲我提供更新的服務了.如果要,的話,你得重新編譯鏈接,那麼我還開發什麼組件呀,開發商直接給我源碼得了唄.這樣看來我們最還是不要直接訪問組件對像的數據成員好了.這也是COM最基本特性之一.
爲什麼會這樣呢?
這又得從COM所採用的對象模型談起(真累呀!).不知道是巧合還是微軟有意思將COM模型建立在C++對象模型的基礎之上.也就是說現在我們的重點是放在C++對象模型上了.衆所周知C++對象模型的特點是:
1 空間和存取時間的效率較好(最起碼要比CORBA和SOM所採取的對像模型要好)
2 靈活性及彈性確不夠理想,例如,不能直接訪問對象的數據成員就表明彈性不足(但CORBA 和SOM確可以)
通常情況下,效率和彈性是一對死對頭,兩者都很Radical(極端).如果你要效率,那麼你會去相應的彈性,反之亦然.就好像VB比較可人,但運行起來要比C++大哥慢許多一樣.但它們誰也不指望誰要消失.因爲,各有各的長處就是了.
至於,C++對像模型(COM採用),表格驅動對像模型(CORBA和SOM採用)我想下次再說吧,我爲我的帖子寫了我前提到的組件(實現Add), 但不知道爲什麼原因總傳不上來,如果誰有興趣就跟貼吧,大家多頂幾下,想必這是我的第一貼,呵呵
                                                                                                                                                       (作者 : unknown)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章