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