組件庫
談到COM中的組件,其實用積木來形容它再恰當不過。我們小時候玩積木時,頭腦中總是想著各種各樣的東西,然後就用塊狀的積木一塊一塊地將它們壘起來。我們也可以把組件看成是一塊一塊的積木,或是一個一個的小單元,這些小單元成為應用程序的各個獨立部分
傳統應用程序的組成部分是分立的文件、模塊或類,這些組成部分經過編譯並鏈接之後才形成應用程序。要想推出應用程序的新版本,就需要將這些組成部分重新編譯,既費時又費力。有了組件的概念,就可以將改進後的新組件插入到應用程序中,並替換掉原有的舊組件,從而賦予應用程序新的活力。
另外,由此也可以有這樣的想法:把許多已經做好的組件放到一起來形成一個組件庫,好比一個類庫。當制作應用程序時,如果要用到不同的組件,只需從剛建好的組件庫中調出所需要的組件,然後將它們插入到適當的位置,來獲得所向往的功能。就像搭積木一樣,可以從包裝盒中拿出你喜歡的積木單元,扔掉不喜歡的積木單元,然後用智慧修建出屬於自己的公寓。
對於組件,我們已經知道了關於它的“塊”概念,使用組件的優點在於可以動態地將它們插入或卸出應用程序,這給應用程序制作者帶來了很大的方便。但是,實現這些功能卻需要一定的基礎。一般需要兩個條件:第一,組件必須動態鏈接;第二,各個組件必須隱藏(或封裝)其內部的實現細節。
正如上面我們曾討論過的,組件能夠動態地被調用或釋放,即我們的最終目的是使得用戶在應用程序的運行過程中能動態地使用組件。為了達到這樣一個目的,必須要求能夠將組件動態地鏈接到一起。所謂動態,也就是說不是在發布應用程序的時候就把組件同應用程序捆綁在一起,那樣也就沒有我們現在討論COM的必要,而是組件同應用表面上處於分離的位置,只有當應用程序運行的時候,組件和應用程序才有機地結合到一起。
下面我們來談一下封裝性。
我們知道應用程序和組件在工作時是處於動態鏈接狀態的。當我們將某個組件用新的組件替換掉時,必須將此組件同系統斷開,然後連入一個新的組件。顯然,新的組件必須按照與原來的組件相同的方式連接到應用程序中,否則就需要重新編譯應用程序,因為應用程序可能根本不認識新的組件,不知道從哪裡入手。這時我們就需要“封裝性’’。
為了說明得明確些,我們先介紹一些術語。首先談一下客戶。當一個程序或組件使用了其他組件時,我們就稱之為客戶。客戶與其他組件通過接口進行連接,
當某個組件被新的組件替換掉後,或者某個組件發生了變化時,如果連接客戶與組件的接口沒有任何變化,那麼原來的客戶就不需要進行任何修改。同樣,如果客戶有了變動,而接口沒有變化,那麼組件也就不需要改變。由此,我們可以看到,只要接口保持不變,組件和客戶就可以像一個個黑匣子一樣移過來移過去。
為了充分發揮動態鏈接的功能,組件及客戶都應該盡可能地不要改變它們的接口,這就意味著它們必須被封裝起來。封裝類似於將它們都做成黑匣子,組件及客戶的內容實現細節不能反映到接口中。接口同內部實現細節的隔離程度越高,組件或客戶發生變化時對接口的影響將越小。如此可以看出,在接口沒有發生任何變化時,對組件的修改將幾乎不會對應用程序的其他部分產生任何影響。
這種封裝性的要求對組件也額外地加上了一些限制。
(1)必須將實現組件的編程語言隱藏起來。
使用組件的客戶沒有那麼神通廣大,以至於知道自己正在使用的組件到底是用C編寫的,還是用Java編寫的。而任一客戶都應能夠使用任一組件,不論它們是用什麼編程語言編寫的。組件應該沒有針對編程語言之說。
世界上正有許多人在用不同的編程語言實現自己的組件,假如某個應用只能使用由C++語言編寫的組件,因為C++語言現在比較流行。但是如果某段時間後,有另外一種編程語言流行起來,從而導致人們紛紛放棄使用C++,轉而使用另一種編程語言。如此就導致原有的應用程序將不能使用新的組件,而且出現了不同的編寫組件的方法。如果某個應用程序可以使用任意一種編程語言編寫的組件,那麼它的生命力之強就可想而知了。
(2)組件必須以二進制的形式發布。
正如第1點所說,要想隱藏組件的編程語言,組件的發布形式只能是最一般的“世人皆知”的二進制形式,即組件在發布時必須已被編譯、鏈接並且馬上就可以投入使用,這也給組件的更新換代提供了很大的便利。
(3)組件不能因為自己所處位置的不同而不斷改變自己的形式。
這一點主要是針對網絡來說的。組件和使用它的應用程序不僅能夠在同一個進程或不同的進程中運行,而且還能在不同的機器上運行。客戶對本地組件的訪問及使用方式同客戶對遠程組件的訪問及使用方式應該是完全一致的。要不然,當遠程組件上某個地方的一個組件拿到本地時,就必須重新編譯客戶,以便使之能夠處理新來的組件。
(4)組件版本的兼容性。
對於新版本的組件應該有向下兼容的特性。客戶既能夠使用老版本的組件,也能夠使用新版本的組件。對於使用者來說,這無疑又是一個很大的便利,而且軟件只有朝這個方向發展才能獲得頑強的生命力。
組件庫
在前面部分,我們已經談過COM是一個說明如何建立可動態交替更新的組件的規范,它提供了為保證能夠互操作而在客戶和組件之間應該遵循的標准。但是如果只給出一套規范,而不給出一些具體的實現方式,那麼人們還是無從入手。因此COM提供了一個稱做COM庫(COM library)的API,它為所有客戶及組件提供非常有用的組件管理服務。COM提供的操作可以使得對組件的管理都以一致的方式進行,這大大節省了COM編寫人員花在組件及客戶實現上的時間。另外,對於DCOM,COM庫則提供了一些同網絡上其他組件通信所需的代碼,這不但可以節省開發人員花在網絡編程上的時間,而且可以使他們無需了解網絡編程的細節知識。
但是我們仍舊要認清另外一點,COM並不是一種計算機語言,COM是由某種編程語言實現的組件編寫規范。此外,COM也不是DLL,COM是利用DLL來給組件提供動態鏈接的能力。