明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

平臺(tái)+插件軟件設(shè)計(jì)思想及基于COM的原型完成

[摘要]引言:我們已經(jīng)習(xí)慣于一個(gè)人獨(dú)立進(jìn)行軟件開發(fā),每個(gè)人都使用自己的風(fēng)格進(jìn)行程序設(shè)計(jì),但隨著工程項(xiàng)目變大或者是對(duì)時(shí)間要求比較緊時(shí),就需要幾個(gè)人,十幾個(gè)人,甚至是上百個(gè)人協(xié)作進(jìn)行軟件開發(fā)與設(shè)計(jì),這時(shí)一個(gè)比較棘手的問題就是如何將若干人所編寫的軟件代碼(有可能是鏈接庫(kù)、組件)進(jìn)行無(wú)縫地集成,縱然進(jìn)行源代碼集成...
    引言:我們已經(jīng)習(xí)慣于一個(gè)人獨(dú)立進(jìn)行軟件開發(fā),每個(gè)人都使用自己的風(fēng)格進(jìn)行程序設(shè)計(jì),但隨著工程項(xiàng)目變大或者是對(duì)時(shí)間要求比較緊時(shí),就需要幾個(gè)人,十幾個(gè)人,甚至是上百個(gè)人協(xié)作進(jìn)行軟件開發(fā)與設(shè)計(jì),這時(shí)一個(gè)比較棘手的問題就是如何將若干人所編寫的軟件代碼(有可能是鏈接庫(kù)、組件)進(jìn)行無(wú)縫地集成,縱然進(jìn)行源代碼集成是個(gè)比較傳統(tǒng)也比較成熟的方式,適當(dāng)使用鏈接庫(kù)或組件,也可減少源代碼的泄露,但經(jīng)常的情況是每一次的程序集成和代碼維護(hù)都需要重新編譯與鏈接源代碼和重新發(fā)布新軟件,這種工作有時(shí)又是非常麻煩的。那么就有疑問產(chǎn)生,能不能有一種方法將需要開發(fā)的目標(biāo)軟件分為若干功能部件,各部件之間遵循著標(biāo)準(zhǔn)接口規(guī)定,這樣在各個(gè)部件按要求開發(fā)之后,在進(jìn)行整個(gè)軟件集成時(shí)只是將需要的部件進(jìn)行組裝,而不是集成各源代碼或鏈接庫(kù)進(jìn)行編譯與鏈接,需要新的功能組件時(shí)也是按規(guī)定開發(fā),之后只進(jìn)行組裝軟件就可以使用,這就是使用一種二進(jìn)制的軟件集成方法。答案是肯定,這就是平臺(tái)+插件的軟件設(shè)計(jì)方法。
一、已有的軟件系統(tǒng)(平臺(tái)+插件)介紹與插件分類
   現(xiàn)在就來(lái)看一看所有軟件系統(tǒng)的根——操作系統(tǒng)(OS)。操作系統(tǒng)是系統(tǒng)軟件,是計(jì)算機(jī)不可缺少的關(guān)鍵軟件,只有安裝有操作系統(tǒng)的計(jì)算機(jī)才能為人所用,才能變?yōu)檎嬲?jì)算工具。操作系統(tǒng)除完成其基本功能以外,還為軟件開發(fā)人員提供了應(yīng)用程序開發(fā)接口(API),軟件開發(fā)人員使用API進(jìn)行軟件設(shè)計(jì)與代碼編寫,程序調(diào)試編譯以后,安裝在所依托的操作系統(tǒng)之后,用戶開發(fā)的軟件(可分為工具軟件和應(yīng)用軟件)就可以正常運(yùn)行。而這時(shí)并不需要對(duì)操作系統(tǒng)進(jìn)行修改,也不需要重新編譯和鏈接操作系統(tǒng),對(duì)于用戶軟件來(lái)說(shuō),操作系統(tǒng)是完全透明的。操作系統(tǒng)與用戶軟件是一個(gè)極好的平臺(tái)+插件實(shí)例。
   除操作系統(tǒng)之外,在用戶軟件方面也有許多這種平臺(tái)+插件的軟件系統(tǒng)實(shí)例,其中大名鼎鼎的就是Adobe公司的PHOTOSHOP圖形處理軟件。PHOTOSHOP除其圖形處理功能卓越以外,還有一項(xiàng)給開發(fā)人員印象較深的就是其插件(Plug-in)功能。為了提高圖形的處理功能PHOTOSHOP提供了標(biāo)準(zhǔn)插件開發(fā)接口,這樣第三方軟件開發(fā)商就可以按標(biāo)準(zhǔn)插件接口開發(fā)獨(dú)具特色的圖形功能擴(kuò)展,開發(fā)的插件安裝后,系統(tǒng)即可使用,而不影響主程序和其它插件,通過此種方法PHOTOSHOP擴(kuò)展了成千上萬(wàn)的濾鏡(Filter)功能插件。除PHOTOSHOP外,使用插件技術(shù)的軟件還有IE,Netscape,Macromedia公司的系列軟件,以及Microsoft的Visual Studio開發(fā)工具及Office辦公軟件等。各用戶軟件領(lǐng)域所應(yīng)用的插件技術(shù)可分為三種類型:
   1、類似批命令的簡(jiǎn)單插件(文本插件)。事實(shí)上這種插件的自由度非常低。使用這種方法的軟件有Win Hacker等,運(yùn)行這種插件后,會(huì)一步步要求用戶進(jìn)行選擇/輸入,最后根據(jù)用戶的輸入來(lái)執(zhí)行一系列事先定義好的操作。這種插件一般是文本文件。功能比較單一,可擴(kuò)展性極小。優(yōu)點(diǎn)是插件做起來(lái)非常方便,即使是對(duì)程序設(shè)計(jì)了解不多的人也可以制作。如WinAmp的Skin。
   2、使用一種特殊的腳本語(yǔ)言來(lái)實(shí)現(xiàn)的插件(腳本插件)。這種插件比較難寫,需要軟件開發(fā)者自己制作一個(gè)程序解釋內(nèi)核。比如微軟惹了很多麻煩的宏就是這種類型的。Microsoft Office就提供了開發(fā)者用于擴(kuò)展輔助功能的內(nèi)置VBScript(VBA)。這種方法的優(yōu)點(diǎn)在于無(wú)需使用其它工具來(lái)制作插件,軟件本身就可以實(shí)現(xiàn),普遍出現(xiàn)于各種辦公自動(dòng)化軟件中。
   3、利用已有的程序開發(fā)環(huán)境來(lái)制作插件(程序插件)。例如PhotoShop等軟件使用的方法。使用這種方法的軟件在程序主體中建立了多個(gè)自定義的接口,使插件能夠自由訪問程序中的各種資源。這種插件的優(yōu)勢(shì)在于自由度極大,可以無(wú)限發(fā)揮插件開發(fā)者的創(chuàng)意,這種插件是狹義范圍的插件,也是真正意義上的插件。而這種插件機(jī)制的編寫相對(duì)復(fù)雜,對(duì)于插件接口之間的協(xié)調(diào)比較困難,插件的開發(fā)也需要專業(yè)的程序員才能進(jìn)行。
   本文主要討論的是第3種類型插件,即利用已有程序開發(fā)環(huán)境制作的程序插件。
二、平臺(tái)+插件軟件設(shè)計(jì)基本思想
   插件的本質(zhì)在于不修改程序主體(平臺(tái))的情況下對(duì)軟件功能進(jìn)行擴(kuò)展與加強(qiáng),當(dāng)插件的接口公開后,任何公司或個(gè)人都可以制作自己的插件來(lái)解決一些操作上的不便或增加新的功能,也就是實(shí)現(xiàn)真正意義上的“即插即用”軟件開發(fā)。平臺(tái)+插件軟件結(jié)構(gòu)是將一個(gè)待開發(fā)的目標(biāo)軟件分為兩部分,一部分為程序的主體或主框架,可定義為平臺(tái),另一部分為功能擴(kuò)展或補(bǔ)充模塊,可定義為插件。
   在進(jìn)行軟件開發(fā)之前,是否采用平臺(tái)+插件結(jié)構(gòu)進(jìn)行軟件開發(fā),還要依據(jù)具體的軟件需求情況進(jìn)行確定,但一般來(lái)講,使用平臺(tái)+插件結(jié)構(gòu)進(jìn)行軟件設(shè)計(jì)會(huì)給所開發(fā)軟件增加新的生命力。當(dāng)確定平臺(tái)+插件的軟件結(jié)構(gòu)之后,就要分析哪些部分功能由主體完成,即平臺(tái)的基本功能,哪些部分功能由插件完成,即需要擴(kuò)展的插件功能。平臺(tái)所完成的功能應(yīng)為一個(gè)軟件系統(tǒng)的核心和基礎(chǔ),這些基本功能即可為用戶使用,也可為插件使用,就是又可以把平臺(tái)基本功能分為兩個(gè)部分,內(nèi)核功能和插件處理功能。平臺(tái)的內(nèi)核功能是整個(gè)軟件的重要功能,一個(gè)軟件的大部分功能因由內(nèi)核功能完成。平臺(tái)的插件處理功能用于擴(kuò)展平臺(tái)和管理插件,為插件操縱平臺(tái)和與插件通信提供標(biāo)準(zhǔn)平臺(tái)擴(kuò)展接口。插件所完成的功能是對(duì)平臺(tái)功能的擴(kuò)展與補(bǔ)充,一般插件完成系列化功能,例如:PHOTOSHOP的濾鏡插件完成對(duì)圖形的特殊效果處理,這些功能都有一些共性,可以進(jìn)行集中管理,并且是可以定義出標(biāo)準(zhǔn)的插件接口。
   為了實(shí)現(xiàn)平臺(tái)+插件結(jié)構(gòu)的軟件設(shè)計(jì)需要定義兩個(gè)標(biāo)準(zhǔn)接口,一個(gè)為由平臺(tái)所實(shí)現(xiàn)的平臺(tái)擴(kuò)展接口,一個(gè)為插件所實(shí)現(xiàn)的插件接口。這里需要說(shuō)明的是:平臺(tái)擴(kuò)展接口完全由平臺(tái)實(shí)現(xiàn),插件只是調(diào)用和使用,插件接口完全由插件實(shí)現(xiàn),平臺(tái)也只是調(diào)用和使用。平臺(tái)擴(kuò)展接口實(shí)現(xiàn)插件向平臺(tái)方向的單向通信,插件通過平臺(tái)擴(kuò)展接口可獲取主框架的各種資源和數(shù)據(jù),可包括各種系統(tǒng)句柄,程序內(nèi)部數(shù)據(jù)以及內(nèi)存分配等。插件接口為平臺(tái)向插件方向的單向通信,平臺(tái)通過插件接口調(diào)用插件所實(shí)現(xiàn)的功能,讀取插件處理數(shù)據(jù)等。
   平臺(tái)插件處理功能包括插件注冊(cè)、管理和調(diào)用,以及平臺(tái)擴(kuò)展接口的功能實(shí)現(xiàn)。插件注冊(cè)為按照某種機(jī)制首先在系統(tǒng)中搜索已安裝插件,之后將搜索到的插件注冊(cè)到平臺(tái)上,并在平臺(tái)上生成相應(yīng)的調(diào)用機(jī)制,這包括菜單選項(xiàng)、工具欄、內(nèi)部調(diào)用等。插件管理完成插件與平臺(tái)的協(xié)調(diào),為各插件在平臺(tái)上生成管理信息以及進(jìn)行插件的狀態(tài)跟蹤。插件調(diào)用為調(diào)用各插件所實(shí)現(xiàn)的功能。平臺(tái)插件處理功能實(shí)現(xiàn)的另一部分功能為平臺(tái)擴(kuò)展接口的具體實(shí)現(xiàn)。
   平臺(tái)+插件軟件設(shè)計(jì)步驟包括:
1、 確定平臺(tái)基本功能和插件要完成系列化功能或擴(kuò)展功能;
2、 定義平臺(tái)擴(kuò)展接口和插件接口;
3、 完成平臺(tái)設(shè)計(jì),主要是平臺(tái)插件處理功能;
4、 向插件開發(fā)者提供主平臺(tái)程序(執(zhí)行代碼),公布平臺(tái)擴(kuò)展接口和插件要實(shí)現(xiàn)的接口,可能包括開發(fā)用的SDK;
5、 插件開發(fā)者按要求開發(fā)插件,實(shí)現(xiàn)插件接口,開發(fā)者可使用提供的主平臺(tái)程序測(cè)試插件;
6、 主平臺(tái)設(shè)計(jì)者繼續(xù)完成主平臺(tái)的內(nèi)核功能,并可隨時(shí)公布新增加主平臺(tái)擴(kuò)展接口和插件接口;
7、 實(shí)現(xiàn)4-6步驟的良性循環(huán),整個(gè)軟件系統(tǒng)不斷向前進(jìn)化。
   平臺(tái)+插件軟件設(shè)計(jì)的優(yōu)點(diǎn):
1、 實(shí)現(xiàn)真正意義上的軟件組件的“即插即用”;
2、 在二進(jìn)制級(jí)上集成軟件,減少大量的軟件重新編譯與發(fā)布麻煩與時(shí)間;
3、 能夠很好實(shí)現(xiàn)軟件模塊的分工開發(fā),能夠大量吸取他人的優(yōu)長(zhǎng);
4、 可較好實(shí)現(xiàn)代碼隱藏,保護(hù)知識(shí)產(chǎn)權(quán)。
三、基于COM的原型實(shí)現(xiàn)
   平臺(tái)+插件軟件的目標(biāo)及設(shè)計(jì)思路已經(jīng)明確,那么用什么樣的方法和技術(shù)實(shí)現(xiàn)插件(程序插件),從目前已有這方面軟件的設(shè)計(jì)方法來(lái)看(Windows系統(tǒng)上的軟件),一種是使用傳統(tǒng)DLL方法的實(shí)現(xiàn),一種是使用COM方法的實(shí)現(xiàn)。下面就以COM技術(shù)為基礎(chǔ),實(shí)現(xiàn)一個(gè)基本的原型框架設(shè)計(jì)。COM技術(shù)的原理大家都已經(jīng)相當(dāng)熟悉,本文為了實(shí)現(xiàn)平臺(tái)+插件的幾方面功能,相應(yīng)地采用COM的相關(guān)方面技術(shù)與方法來(lái)介紹有關(guān)實(shí)現(xiàn)要點(diǎn)。整個(gè)原型系統(tǒng)開發(fā)環(huán)境:Windows 2000、Visual C++ 7.0,使用的開發(fā)庫(kù)包括MFC和ATL。
   插件注冊(cè)   為了管理插件首先是設(shè)計(jì)一種插件的注冊(cè)機(jī)制,通過此種機(jī)制平臺(tái)可以搜索到系統(tǒng)中所有的可用插件,并在平臺(tái)上生成各插件的調(diào)用點(diǎn)。注冊(cè)就需要為每插件設(shè)置一個(gè)特殊標(biāo)識(shí),有了這個(gè)標(biāo)識(shí)的插件,平臺(tái)就可以使用。使用COM實(shí)現(xiàn)注冊(cè)機(jī)制有一種非常好的方法,這就是組件目錄(Component Category)。組件目錄也是COM實(shí)現(xiàn)的標(biāo)準(zhǔn)接口(Interface,不同于平臺(tái)+插件中所說(shuō)的接口)。在設(shè)計(jì)COM組件時(shí),只為其定義一個(gè)目錄分類信息即可,之后就可使用標(biāo)準(zhǔn)的組件目錄接口在系統(tǒng)中搜索特定類型的組件,插件注冊(cè)與標(biāo)識(shí)就可輕松地解決了。
    插件管理與調(diào)用  由組件目錄獲得特定標(biāo)識(shí)的組件后,就需要為每個(gè)插件生成管理機(jī)制,每個(gè)插件都有一個(gè)類ID(CLSID),在平臺(tái)中為每個(gè)插件生成一個(gè)類ID數(shù)組,每個(gè)插件的每一個(gè)可調(diào)用功能均生成一個(gè)菜單項(xiàng)(動(dòng)態(tài)生成菜單項(xiàng))。對(duì)每個(gè)插件是否激活,平臺(tái)都有相應(yīng)的記錄信息。插件調(diào)用可通過菜單消息循環(huán)或內(nèi)部調(diào)用實(shí)現(xiàn)。
   平臺(tái)擴(kuò)展接口和插件接口  這兩個(gè)接口不同于COM技術(shù)中的接口,但平臺(tái)擴(kuò)展接口和插件接口可使用COM技術(shù)的接口定義實(shí)現(xiàn)。在原型系統(tǒng)的實(shí)現(xiàn)上平臺(tái)擴(kuò)展接口定義了一個(gè)IServer接口,插件接口定義了一個(gè)IPlugin接口。IServer接口用于為插件傳遞內(nèi)部數(shù)據(jù)接口,IPlugin接口用于讀取插件功能信息,并且還用于傳遞平臺(tái)消息與資源句柄。
    消息、資源與數(shù)據(jù)傳遞  平臺(tái)與插件之間需要進(jìn)行大量的消息與數(shù)據(jù)交互,其中包括:各種Windows消息、各種Windows資源句柄,以及系統(tǒng)使用的各種內(nèi)部數(shù)據(jù),有時(shí)還可能需要分配內(nèi)存。所有的消息與數(shù)據(jù)交互均由平臺(tái)擴(kuò)展接口和插件接口所定義的標(biāo)準(zhǔn)方法實(shí)現(xiàn),在原型系統(tǒng)中已經(jīng)實(shí)現(xiàn)了鼠標(biāo)消息、窗口句柄、設(shè)備句柄和程序內(nèi)部定義數(shù)據(jù)結(jié)構(gòu)的傳遞。

    結(jié)    論:原型系統(tǒng)已實(shí)現(xiàn)一種通用的平臺(tái)+插件軟件開發(fā)的框架模式,通過實(shí)踐證明這種思路和設(shè)計(jì)方法可行,可以應(yīng)用到我們的具體軟件開發(fā)上。通過這種方式可以很好地解決軟件合作開發(fā)與集成問題,對(duì)有版本級(jí)別的軟件開發(fā)更為有用。高級(jí)版的軟件安裝有高級(jí)版的插件,低級(jí)版的軟件不安裝高級(jí)版的插件,這就給程序分發(fā)和開發(fā)帶來(lái)極大的便利。對(duì)于有系列化功能的軟件,系列化功能由插件實(shí)現(xiàn)。