桂林長(zhǎng)海發(fā)展有限責(zé)任公司 勞憲銀
?
基于插件式的軟件總線構(gòu)件平臺(tái)的設(shè)計(jì)
桂林長(zhǎng)海發(fā)展有限責(zé)任公司 勞憲銀
【摘要】本文開(kāi)發(fā)的基于插件式的軟件總線構(gòu)件平臺(tái)主要為電子對(duì)抗、指揮控制等軍用軟件搭建系統(tǒng)框架,滿足現(xiàn)代軍用軟件的開(kāi)發(fā)周期短、可擴(kuò)展性和可維護(hù)性強(qiáng)的迫切需求。基于插件式的軟件總線構(gòu)件平臺(tái)采用插件體系結(jié)構(gòu)和軟件總線技術(shù)設(shè)計(jì),該平臺(tái)的復(fù)用,可大大縮短軟件的開(kāi)發(fā)周期,增強(qiáng)軟件的復(fù)用性、擴(kuò)展性和維護(hù)性,同時(shí)可節(jié)省出傳統(tǒng)的軟件開(kāi)發(fā)方法所開(kāi)發(fā)的軟件在前期系統(tǒng)框架設(shè)計(jì)、后期軟件維護(hù)所需要投入的大量人力物力。
【關(guān)鍵詞】插件;軟件總線;復(fù)用;體系結(jié)構(gòu);Qt
傳統(tǒng)的電子對(duì)抗、指揮控制等軍用軟件通常都是單一模塊的執(zhí)行程序,開(kāi)發(fā)時(shí)往往采用自頂向下逐層細(xì)分劃分為單個(gè)小模塊進(jìn)行開(kāi)發(fā)。在出現(xiàn)新的需求時(shí),由于軟件較為簡(jiǎn)單,即使全部重新開(kāi)發(fā),也相對(duì)容易。然而,隨著計(jì)算機(jī)技術(shù)和軍用軟件應(yīng)用的發(fā)展,軟件任務(wù)需求變得多樣化、復(fù)雜化,完整開(kāi)發(fā)出一個(gè)軟件或系統(tǒng)需要大量的人力物力,需要很長(zhǎng)的軟件開(kāi)發(fā)周期,而且當(dāng)前軟件更新?lián)Q代的要求越來(lái)越頻繁,傳統(tǒng)的軟件開(kāi)發(fā)方法在現(xiàn)代的復(fù)雜化、多樣化需求下顯得力不從心,所以我們需要尋找一種更好的軟件體系結(jié)構(gòu)和開(kāi)發(fā)方法。
基于插件式的軟件總線構(gòu)件平臺(tái)是一種比較靈活、通用的軟件體系結(jié)構(gòu),它采用“平臺(tái)+插件”設(shè)計(jì)模式,將軟件通用功能和擴(kuò)展機(jī)制的程序應(yīng)用框架設(shè)計(jì)成平臺(tái),而軟件其他功能分散到插件中來(lái)完成,插件可動(dòng)態(tài)地加載到平臺(tái)上,也可被自由地卸載和替換。因此,它不但大大提高軟件開(kāi)發(fā)的開(kāi)發(fā)效率,降低設(shè)計(jì)開(kāi)發(fā)難度,而且,縮短了軟件開(kāi)發(fā)周期,增強(qiáng)了軟件的可運(yùn)行性和可維護(hù)性。
2.1插件體系結(jié)構(gòu)
插件是按照預(yù)定接口實(shí)現(xiàn)的軟件功能構(gòu)件。軟件可在運(yùn)行時(shí)動(dòng)態(tài)加載插件并執(zhí)行其功能。插件體系結(jié)構(gòu)的軟件由一個(gè)插件管理平臺(tái)和多個(gè)完成子功能的插件組成,如圖1所示。
圖1 插件體系結(jié)構(gòu)
插件管理平臺(tái):主要實(shí)現(xiàn)軟件中的通用功能和擴(kuò)展機(jī)制的程序應(yīng)用框架,可以插入不同的插件,接受插件提供的服務(wù)并提供給用戶,是整個(gè)系統(tǒng)的基礎(chǔ)和主干。
插件:按照程序應(yīng)用框架的規(guī)格要求實(shí)現(xiàn)軟件其他功能,并能夠動(dòng)態(tài)地插入到軟件系統(tǒng)中,完善系統(tǒng)整體功能,是插件系統(tǒng)的重要組成部分。
接口:是使插件管理平臺(tái)和插件能夠互相結(jié)合工作而制定的一套標(biāo)準(zhǔn)和協(xié)議,它是一個(gè)邏輯上的接口,由插件管理平臺(tái)和插件各完成一部分,它們共同完成插件的加載、調(diào)用、卸載以及插件管理平臺(tái)與插件以及插件與插件之間的交互,是插件系統(tǒng)中的重要組成部分。
2.2軟件總線技術(shù)
軟件總線是一條虛擬的數(shù)據(jù)傳輸線,是硬件總線的映射,是軟件系統(tǒng)中各構(gòu)件的集成框架。它為系統(tǒng)內(nèi)各構(gòu)件之間的信息交換提供虛擬的公共數(shù)據(jù)通道和接口服務(wù)。只要符合其所制定的接口標(biāo)準(zhǔn)的構(gòu)件都能夠?qū)崿F(xiàn)即插即用。
對(duì)軟件總線的設(shè)計(jì)主要考慮4個(gè)基本要素:模塊間的數(shù)據(jù)通信、構(gòu)件的調(diào)度和管理策略、軟件總線的管理策略、軟總線和構(gòu)件庫(kù)的接口策略。針對(duì)軟件總線設(shè)計(jì)應(yīng)解決的基本要素,軟件總線的設(shè)計(jì)應(yīng)實(shí)現(xiàn)以下4個(gè)功能模塊:
數(shù)據(jù)通信模塊:該模塊主要用于協(xié)調(diào)各個(gè)“接插”在軟件總線上的由不同語(yǔ)言編寫(xiě)、不同環(huán)境下運(yùn)行、不同開(kāi)發(fā)商提供的異夠構(gòu)件之間的信息交互。
構(gòu)件調(diào)度模塊:該模塊主要通過(guò)軟件總線實(shí)現(xiàn)對(duì)構(gòu)件的調(diào)用、安裝、卸載,完成對(duì)構(gòu)件庫(kù)的管理。
總線管理模塊:該模塊主要實(shí)現(xiàn)操作系統(tǒng)與構(gòu)件庫(kù)間通信和數(shù)據(jù)交換、數(shù)據(jù)傳遞的合理分配和控制使用。
接口控制模塊:該模塊主要用來(lái)解決軟件總線和構(gòu)件的接口問(wèn)題,完成構(gòu)件同軟件總線間的信息交互,實(shí)現(xiàn)操作系統(tǒng)對(duì)構(gòu)件庫(kù)的管理和控制、構(gòu)件之間的互相通信、數(shù)據(jù)和信息的傳送。
軟件總線的總體結(jié)構(gòu)框架如圖2所示。
圖2 軟件總線框架
本文開(kāi)發(fā)的基于插件式的軟件總線構(gòu)件平臺(tái)主要為電子對(duì)抗、指揮控制等軍用軟件搭建系統(tǒng)框架,提供插件管理、總線通信、界面布局管理等功能,實(shí)現(xiàn)系統(tǒng)中必需的通用功能和擴(kuò)展機(jī)制的程序應(yīng)用框架。
3.1插件管理
插件管理主要提供以下幾方面的功能:
插件的注冊(cè)和反注冊(cè)。插件在使用前需要注冊(cè),例如ActiveX控件,必須注冊(cè)才能使用。插件只有成功注冊(cè)后,平臺(tái)才能正確找到插件的路徑,并對(duì)其初始化。平臺(tái)可以對(duì)已注冊(cè)但當(dāng)前不再的插件進(jìn)行反注冊(cè)。
插件的加載和卸載。平臺(tái)能夠根據(jù)用戶的需求,可對(duì)已注冊(cè)但暫時(shí)不需使用的插件進(jìn)行加載或卸載。
插件基本信息的顯示。平臺(tái)能顯示插件的版本、版權(quán)等信息。
3.2總線通信
實(shí)現(xiàn)插件之間的通信管理功能。為整個(gè)系統(tǒng)的運(yùn)行提供全面的通信能力。
3.3界面布局管理
實(shí)現(xiàn)系統(tǒng)界面的管理功能。為整個(gè)系統(tǒng)的界面配置及控制提供管理能力。
平臺(tái)主要由插件管理子系統(tǒng)、總線通信管理子系統(tǒng)、界面布局子系統(tǒng)組成。平臺(tái)整體結(jié)構(gòu)設(shè)計(jì)如圖3所示。
圖3 平臺(tái)整體結(jié)構(gòu)
平臺(tái)總體框架設(shè)計(jì)如圖4所示,平臺(tái)基于插件形式設(shè)計(jì),插件間的通信主要由總線通信子系統(tǒng)實(shí)現(xiàn),界面布局管理子系統(tǒng)以插件形式加載到平臺(tái),由插件管理子系統(tǒng)對(duì)插件進(jìn)行管理。核心插件(Core Plugin)負(fù)責(zé)整個(gè)平臺(tái)界面的初始化工作,界面的布局由界面管理子系統(tǒng)負(fù)責(zé)。
圖4 平臺(tái)總體框架
5.1插件管理子系統(tǒng)設(shè)計(jì)
插件管理子系統(tǒng)的工作原理如圖5所示,插件管理器在加載插件之前首先獲取插件的描述信息,判斷插件是否正確,減少了直接加載插件發(fā)生錯(cuò)誤時(shí)的系統(tǒng)開(kāi)銷(xiāo)。在插件初始化的過(guò)程中,插件管理器需要將插件注冊(cè)對(duì)象添加到公共對(duì)象池中供其他插件使用。插件管理器接收到插件卸載信號(hào)時(shí),會(huì)修改插件的狀態(tài)信息,并將該插件注冊(cè)的對(duì)象從公共對(duì)象池列表中刪除。插件管理子系統(tǒng)負(fù)責(zé)插件的加載、卸載及維護(hù)插件的狀態(tài)信息,插件的狀態(tài)包括Invalid, Read, Resolved,Loaded, Initialized, Running, Stopped, Deleted等八個(gè)狀態(tài),Invalid:起始點(diǎn),還沒(méi)有讀取插件的元數(shù)據(jù)。Read:插件的元數(shù)據(jù)被成功讀取,且其信息可通過(guò)PluginSpec取得。Resolved:description文件給出的依賴項(xiàng)被成功找到,且可以通過(guò)dependencySpecs()函數(shù)獲得。Loaded:插件的庫(kù)被加載且插件實(shí)例被創(chuàng)建(通過(guò)plugin())。Initialized:插件的實(shí)例的IPlugin:initialize()函數(shù)被調(diào)用,返回成功。Running:插件的依賴項(xiàng)被成功initialized和extensionsInitialized,加載過(guò)程完成。Stopped:插件被關(guān)閉,例如插件的IPlugin:aboutToShutdown()函數(shù)被調(diào)用之后。Deleted:插件的實(shí)例對(duì)象被釋放。
圖5 插件管理子系統(tǒng)工作原理
5.2總線通信管理子系統(tǒng)設(shè)計(jì)
平臺(tái)以插件的形式實(shí)現(xiàn)其功能,以總線的方式實(shí)現(xiàn)功能上的擴(kuò)展。插件之間需要進(jìn)行通信才能實(shí)現(xiàn)協(xié)同合作和真正意義上的功能擴(kuò)展。總線通信管理子系統(tǒng)主要負(fù)責(zé)插件之間的通信管理,其工作原理如圖6所示,插件之間主要通過(guò)Qt的信號(hào)和槽機(jī)制進(jìn)行通信,當(dāng)某個(gè)插件plugin1請(qǐng)求與另一個(gè)插件plugin2進(jìn)行通信時(shí),plugin1將發(fā)射一個(gè)信號(hào),如果plugin2有效則會(huì)接收到該信號(hào)并執(zhí)行相應(yīng)的操作,如果plugin2無(wú)效,那么通過(guò)插件管理子系統(tǒng)維護(hù)的插件狀態(tài)信息獲取plugin2的狀態(tài),返回失敗信息。
圖6 總線通信管理子系統(tǒng)工作原理
5.3界面布局管理子系統(tǒng)設(shè)計(jì)
界面布局管理子系統(tǒng)的工作原理如圖7所示,軟件的界面布局管理主要由核心插件(Core Plugin)負(fù)責(zé),核心插件提供ActionManager 和ModernManager兩個(gè)類(lèi),布局管理器ActionManager類(lèi)負(fù)責(zé)菜單、菜單欄、鍵盤(pán)快捷鍵的注冊(cè)并記錄它們的布局;而ModeManager類(lèi)負(fù)責(zé)平臺(tái)主界面上提供的FancyTabWidget工具欄上控件的添加、顯示以及控件的切換事件的處理。核心插件(Core Plugin)記錄各個(gè)插件對(duì)象及它們的布局信息,通過(guò)connect進(jìn)行連接,接收對(duì)象布局改變信號(hào),并進(jìn)行相應(yīng)的處理,然后更新界面布局,修改布局記錄。
圖7 界面布局管理子系統(tǒng)工作原理
該平臺(tái)主要采用插件式的軟件總線設(shè)計(jì)方法進(jìn)行開(kāi)發(fā),代碼使用Qt和C++進(jìn)行編寫(xiě),使用面向?qū)ο箝_(kāi)發(fā)方法的思想,按照系統(tǒng)需求分析、系統(tǒng)功能設(shè)計(jì)、系統(tǒng)技術(shù)實(shí)現(xiàn)的步驟循序漸進(jìn),平臺(tái)采用“平臺(tái)+插件”的設(shè)計(jì)模式,復(fù)用性強(qiáng),易于維護(hù)和擴(kuò)展。
參考文獻(xiàn)
[1]Jasmin Blanchette,Mark Summerfield.C++ G UI Qt 4編程(第二版)[M].北京:電子工業(yè)出版社.2011:15.
[2]王光平.OO軟件總線研究[J].計(jì)算機(jī)工程與應(yīng)用,2000,36(3):39-40.
[3]劉毅,陳慧蓉,榮鋼.Plug-in結(jié)構(gòu)應(yīng)用程序設(shè)計(jì)[J].計(jì)算機(jī)應(yīng)用,2002,22(4):9-14.
[4]劉佳,王麗宏,孫克寧.插件技術(shù)在控制系統(tǒng)中的應(yīng)用[J].計(jì)算機(jī)應(yīng)用研究,2004:117-119.