本發(fā)明涉及計算機技術,特別涉及一種基于插件的軟件開發(fā)方法。
背景技術:插件技術由于其可選擇、可擴充、可替換的特性,被廣泛的應用在各種應用軟件的開發(fā)中,并取得了良好的效果。目前主要有兩類應用情景。第一類用來擴充現有的軟件功能。比較有名的應用案例有:(1)Firefox瀏覽器,有成千上萬的功能、美化、定制插件,如IETab插件、FireFTP插件。(2)Photoshop,有濾鏡、摳圖、磨皮、紋理導出等等豐富和方便其功能和使用的插件。(3)3DSMax和Maya,有數據導出插件,用于在游戲開發(fā)中導出3DSMax或Maya編輯的模型、骨骼、場景等數據為游戲需要的磁盤文件。第二類用來實現可選的技術手段。通過插件技術實現軟件的部分組成模塊,以能夠在不同的應用程序需求下,替換使用不同的組成模塊。比如在游戲引擎領域,對GL或D3D渲染器的選擇,通常就會采取插件的方式實現,比較典型的案例是OGRE引擎的渲染器。不論是第一種應用案例情景,還是第二種應用案例情景,插件都只是被作為軟件開發(fā)中的輔助手段,沒有將插件作為整個軟件的開發(fā)框架,而是將插件技術應用在了某個局部,用以改善擴展性。第一種情景下,通過實現軟件框架定義的插件接口規(guī)范來實現插件,由軟件加載和驅動插件工作,以擴充和完善軟件的功能和效果;第二種情景下,通過替換使用不同的插件,來達到軟件性能的優(yōu)化、效果的改善等。目前的基于插件的軟件開發(fā)方法,其插件通常是針對特定應用場景,事先約定調用接口規(guī)范,或基于COM(ComponentObjectModel,組件對象模型)技術的插件實現方法,其插件主要由調用方定義被調用接口,實現方實現這些接口約定和語義,調用方通過確定的插件管理器,獲取到插件實現對象,并調用其接口實現。如OGRE(Object-OrientedGraphicsRenderingEngine,面向對象圖形渲染引擎)的渲染器插件和OGRE的場景管理插件,它們的實現就約定了渲染器必須實現調用者定義的渲染接口規(guī)范,場景管理器必須實現調用者定義的場景管理接口規(guī)范。目前的基于插件的軟件開發(fā)方法,其軟件框架,都是針對特定領域的、具象的框架結構。如OGRE是游戲領域,其構建了一套圖形引擎框架結構,并給出了相關實現;再如ACE(adaptivecommunicationenvironment,是一套C++的通信庫,它提供了socket/threading/memorymanagement等多種系統(tǒng)調用的面對對象的wrapper,使C++通信軟件開發(fā)更加簡單),其是網絡模型領域。目前的基于插件的軟件開發(fā)方法,其主要存在以下缺點:a.由于其軟件框架應用局部范圍,且未解決通用插件框架的構建問題,故而針對不同類型的應用,調用方均需要搭建不同的插件管理框架實現一個新的插件的管理功能,付出了額外的實施成本。b.從插件接口的約定上,由于采用由調用方起著主導約定的定義方式,依賴框架實現,插件需要連接到框架代碼,這要求調用方具備較高的設計抽象能力。c.從軟件框架的搭建上,由于軟件框架本身和應用類型和應用局部相關,針對不同應用場景,軟件框架的設計模型不一,應用方需要具備豐富的相關領域的知識背景,提高了架構設計者本身的要求,加重了應用開發(fā)對不同應用場景架構的理解成本和實施成本,并且如果要將不同應用場景架構整合在一起時,需要對框架進行大量的改動,非常不方便。
技術實現要素:本發(fā)明要解決的技術問題是提供一種基于插件的軟件開發(fā)方法,服務框架本身和應用類型無關,可以方便嵌入到任何技術方案之中,且不需要修改,方便了功能插件和各種技術方案的整合。為解決上述技術問題,本發(fā)明提供的基于插件的軟件開發(fā)方法采用的技術方案是:分別開發(fā)一個服務框架和多個服務插件;所述服務框架,用于實現服務框架服務接口,并管理驅動服務插件運行;實現服務框架服務接口,是建立服務接口和服務名的一一對應,一個服務接口是指一個服務插件提供的功能接口,服務名是指用于查詢服務接口指針的名字;管理驅動服務插件運行,包括服務插件的加載、卸載及更新,服務框架在加載服務插件時,調用服務插件的初始化函數并輸入服務框架接口給該初始化函數;在卸載服務插件時,調用服務插件的最終化函數;在更新服務插件時,調用服務插件的更新函數并輸入上一幀開始執(zhí)行到本幀開始執(zhí)行所流逝的時間給該更新函數;每個服務插件,包含有初始化函數、最終化函數、更新函數三個全局導出函數,其中,初始化函數以服務框架接口作為參數,最終化函數無參數,更新函數以時間為參數,服務插件通過服務框架調用初始化函數時傳入的服務框架接口來和軟件的其他模塊或插件交互。所述服務框架管理驅動服務插件運行,可以包括以下步驟:一.加載服務插件,調用其初始化函數,供服務插件初始化資源;二.如果上一幀開始執(zhí)行到本幀開始執(zhí)行所流逝的時間大于設定值,則調用該服務插件的更新函數,實現該服務插件的幀更新;三.檢查服務插件是否請求退出,如果請求退出則進行步驟四,否則進行步驟二;四.調用服務插件的最終化函數,供插件回收資源。服務插件可以是以C語言方式導出的windows系統(tǒng)的dll或類Unix系統(tǒng)的so文件。本發(fā)明的基于插件的軟件開發(fā)方法,將插件技術作為軟件的開發(fā)主框架技術,分別開發(fā)一個服務框架和多個服務插件,將功能實現抽象為功能接口,并為每個功能接口命名,分別作為服務接口和服務名,注冊到服務框架的服務框架接口,供其它代碼模塊訪問。服務框架的服務框架接口由應用程序實現,服務框架接口通過建立服務接口和服務名的一一對應,利用服務名的唯一性識別來實現服務注冊、服務查詢、服務注銷,服務框架接口在服務插件初始化的時候傳入服務插件。服務插件包括初始化、最終化、更新三個全局導出函數,服務框架通過分別調用三個全局導出函數管理服務插件的加載、卸載及更新,服務插件和服務框架間無靜態(tài)連接依賴關系。本發(fā)明的基于插件的軟件開發(fā)方法,通過將服務框架接口化和構建與應用無關的插件驅動機制,使得服務插件不需要連接到服務框架,只需要服務框架程序提供服務框架接口,實現了服務插件開發(fā)和服務框架的無關性,服務框架只定義了服務名和服務接口的關聯,服務框架本身和應用類型無關,可以方便嵌入到任何技術方案之中,且不需要修改,方便了功能插件和各種技術方案的整合。附圖說明為了更清楚地說明本發(fā)明的技術方案,下面對本發(fā)明所需要使用的附圖作簡單的介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實施例,對于本領域普通技術人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據這些附圖獲得其他的附圖。圖1是本發(fā)明的基于插件的軟件開發(fā)方法的軟件結構一實施例示意圖;圖2是本發(fā)明的基于插件的軟件開發(fā)方法的軟件服務框架管理服務插件的一實施例示意圖。具體實施方式下面將結合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術方案進行清楚、完整地描述,顯然,所描述的實施例僅僅是本發(fā)明一部分實施例,而不是全部的實施例。應當理解,此處所描述的優(yōu)選實施例僅用于說明和解釋本發(fā)明,并不用于限定本發(fā)明。并且在不沖突的情況下,本發(fā)明中的實施例及實施例中的特征可以相互組合。基于本發(fā)明中的實施例,本領域普通技術人員所獲得的所有其他實施例,都屬于本發(fā)明保護的范圍。本發(fā)明的基于插件的軟件開發(fā)方法一實施方式:分別開發(fā)一個服務框架和多個服務插件,一實施例的軟件結構如圖1所示,軟件包括服務框架及分別用于擴展服務、應用服務、圖形服務、網絡服務、輸入服務或其他服務的多個服務插件;所述服務框架,用于實現服務框架服務接口,并管理驅動服務插件運行;實現服務框架服務接口,是建立服務接口和服務名的一一對應,從而利用服務名的唯一性識別來實現服務注冊、服務查詢、服務注銷,一個服務接口是指一個服務插件提供的功能接口(通常C++服務接口指含有純虛函數的class或struct),服務名是指用于查詢服務接口指針的名字(通常C++服務名指std::string);實現服務框架接口,一實施例如下:其中FRAME_API為空,主要作為修飾用;GetService根據服務名返回服務接口;RegService將服務接口注冊到指定的服務名;UnregService注銷指定服務名的服務;void*為服務接口指針,用于傳入參數和返回值;管理驅動服務插件運行,包括服務插件的加載、卸載及更新,服務框架在加載服務插件時,調用服務插件的初始化函數并輸入服務框架接口給該初始化函數;在卸載服務插件時,調用服務插件的最終化函數;在更新服務插件時,調用服務插件的更新函數并輸入上一幀開始執(zhí)行到本幀開始執(zhí)行所流逝的時間給該更新函數;所述服務框架管理驅動服務插件運行一實施例如圖2所示,包括以下步驟:一.加載服務插件,調用其初始化函數,供服務插件初始化資源;二.如果上一幀開始執(zhí)行到本幀開始執(zhí)行所流逝的時間大于設定值,則調用該服務插件的更新函數,實現該服務插件的幀更新;三.檢查服務插件是否請求退出,如果請求退出則進行步驟四,否則進行步驟二;四.調用服務插件的最終化函數,供插件回收資源。示例如下:每個服務插件,包含有初始化函數、最終化函數、更新函數三個全局導出函數,其中,初始化函數以服務框架接口作為參數,最終化函數無參數,更新函數以時間為參數,三個全局導出函數均無需返回值,服務插件通過服務框架調用初始化函數時傳入的服務框架接口來和軟件的其他模塊或插件交互,可選的更新函數提供了服務插件進行幀更新的可能。服務插件可以是以C語言方式導出的windows系統(tǒng)的dll或類Unix系統(tǒng)(如Unix、Linux、FreeBSD、MacOS、BeOS等操作系統(tǒng))的so文件。本發(fā)明的基于插件的軟件開發(fā)方法,將插件技術作為軟件的開發(fā)主框架技術,分別開發(fā)一個服務框架和多個服務插件,將功能實現抽象為功能接口,并為每個功能接口命名,分別作為服務接口和服務名,注冊到服務框架的服務框架接口,供其它代碼模塊訪問。服務框架的服務框架接口由應用程序實現,服務框架接口通過建立服務接口和服務名的一一對應,利用服務名的唯一性識別來實現服務注冊、服務查詢、服務注銷,服務框架接口在服務插件初始化的時候傳入服務插件。服務插件包括初始化、最終化、更新三個全局導出函數,服務框架通過分別調用三個全局導出函數管理服務插件的加載、卸載及更新,服務插件和服務框架間無靜態(tài)連接依賴關系。本發(fā)明的基于插件的軟件開發(fā)方法,通過將服務框架接口化和構建與應用無關的插件驅動機制,使得服務插件不需要連接到服務框架,只需要服務框架程序提供服務框架接口,實現了服務插件開發(fā)和服務框架的無關性,服務框架只定義了服務名和服務接口的關聯,服務框架本身和應用類型無關,可以方便嵌入到任何技術方案之中,且不需要修改,方便了功能插件和各種技術方案的整合。以上所述僅為本發(fā)明的較佳實施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內,所做的任何修改、等同替換、改進等,均應包含在本發(fā)明保護的范圍之內。