董 強,許長霞
(西南計算機有限責(zé)任公司,重慶 400060)
伴隨信息化技術(shù)的飛速發(fā)展,軟件產(chǎn)品逐漸滲透應(yīng)用到社會的各個領(lǐng)域??蛻羝谕浖a(chǎn)品能夠滿足更多的功能需求,快速適應(yīng)功能需求變更,縮短產(chǎn)品研制周期等要求[1]。本文先分析傳統(tǒng)應(yīng)用框架的缺陷,再結(jié)合實際工程應(yīng)用需求,基于微內(nèi)核設(shè)計思想,構(gòu)建一套能夠支撐軟件產(chǎn)品高效、快速開發(fā)的應(yīng)用框架。
傳統(tǒng)應(yīng)用框架主要用于對各類基礎(chǔ)功能和業(yè)務(wù)功能進行整體性封裝,并實現(xiàn)對各功能適時調(diào)度和流程控制;基礎(chǔ)功能是一種與業(yè)務(wù)功能無關(guān)的功能,具有粒度小,復(fù)用度高的特點;業(yè)務(wù)功能主要用于實現(xiàn)軟件產(chǎn)品的業(yè)務(wù)需求?;A(chǔ)功能與基礎(chǔ)功能、業(yè)務(wù)功能與業(yè)務(wù)功能、基礎(chǔ)功能與業(yè)務(wù)功能之間都可能直接發(fā)生信息交互(包括功能調(diào)用、數(shù)據(jù)交換、消息交互等),傳統(tǒng)應(yīng)用框架基本組成如圖1所示。
圖1 傳統(tǒng)應(yīng)用框架基本組成圖Fig.1 Basic composition diagram of the traditional application framework
用戶對軟件產(chǎn)品功能需求的增多,軟件產(chǎn)品所包含的各類功能也隨之增多,功能之間的耦合程度變得更加緊密。新功能的增加和原功能的變更,都會導(dǎo)致應(yīng)用框架和各類功能受到一定程度的影響,造成軟件產(chǎn)品修改、維護、擴展困難的問題,無法滿足客戶對軟件產(chǎn)品的高要求[2]。
微內(nèi)核(Micro kernel)是提供操作系統(tǒng)核心功能內(nèi)核的精簡版本[3],是內(nèi)核的一種精簡形式。它提供一組“最基本”的服務(wù),如進程調(diào)度、進程間通信、存儲管理、處理I/O 設(shè)備。其他服務(wù),如文件管理、網(wǎng)絡(luò)支持等作為擴展服務(wù)通過接口連接到微內(nèi)核[4]。將通常與內(nèi)核集成在一起的系統(tǒng)服務(wù)層被分離出來,變成可以根據(jù)需求加入的選件,這樣就可提供更好的可擴展性和更加有效的應(yīng)用環(huán)境。使用微內(nèi)核設(shè)計,對系統(tǒng)進行升級,只要用新模塊替換舊模塊,不需要改變整個操作系統(tǒng)[5]。微內(nèi)核具有可移植性、靈活性和擴展性,以及健壯性等特點[6]。微內(nèi)核示意圖如圖2 所示。
圖2 微內(nèi)核示意圖Fig.2 Schematic diagram of microkernel
組件化是指解耦復(fù)雜系統(tǒng)時將多個功能模塊拆分、重組的過程,有多種屬性、狀態(tài)反映其內(nèi)部特性。為了達到解耦的目的[7],按照軟件產(chǎn)品需求將軟件產(chǎn)品拆分成多個組件[8],確定各組件的邊界和職責(zé)。拆分出來的各組件由于耦合度低,基本上互不影響,便于開發(fā)人員同步開展各組件的開發(fā)工作。開發(fā)完成的獨立組件按照集成規(guī)范集成到應(yīng)用框架,由測試人員實施單元測試。當(dāng)各獨立組件完成單元測試后,將所有組件集成到應(yīng)用框架,進行集成測試,對測試過程暴露出軟件問題,只需要修改相應(yīng)的組件。針對用戶變更的需求,定位變更組件后進行修改即可;針對用戶新增的需求,重新按照拆分組件、開發(fā)組件、組件單元測試、集成測試、修改組件等流程,最終形成軟件產(chǎn)品。組件化的意義還在于提升代碼復(fù)用性[9],可以直接將相同功能的組件運用到其他項目,而無所重新開發(fā),或者是對該組件進行重構(gòu),讓其復(fù)用程度更高,也便于后續(xù)軟件產(chǎn)品的復(fù)用[10],提高軟件產(chǎn)品的開發(fā)效率。
借鑒微內(nèi)核操作系統(tǒng)設(shè)計思想和組件化的設(shè)計方法,將傳統(tǒng)軟件應(yīng)用框架核心功能分離出來,作為軟件應(yīng)用框架的內(nèi)核服務(wù),負責(zé)完成與具體業(yè)務(wù)功能無關(guān)的最基本功能,如組件管理、組件通信、組件連接等,它不會因為各類功能的擴展而不斷修改,僅用于支撐軟件產(chǎn)品的基本運行。由于其精簡形式的核心設(shè)計,更容易對其充分測試,保證整個系統(tǒng)的穩(wěn)定性。
基礎(chǔ)組件通過組件連接服務(wù)實現(xiàn)應(yīng)用框架的基礎(chǔ)功能擴展,而不影響整體系統(tǒng)的穩(wěn)定性;根據(jù)軟件產(chǎn)品功能需求,開發(fā)或復(fù)用相應(yīng)的業(yè)務(wù)組件,通過組件連接服務(wù)按需集成所有業(yè)務(wù)組件?;谖?nèi)核設(shè)計思想的軟件應(yīng)用框架總體設(shè)計如下頁圖3 所示。
圖3 基于微內(nèi)核設(shè)計思想的軟件應(yīng)用框架總體設(shè)計圖Fig.3 Overall design diagram of software application framework based on microkernel design concept
按照基于微內(nèi)核設(shè)計思想的軟件應(yīng)用框架總體設(shè)計思路,細化內(nèi)核服務(wù)功能,將其設(shè)計成基于微內(nèi)核設(shè)計思想的軟件應(yīng)用框架,它包括一個組件描述文件規(guī)范和組件管理服務(wù)、組件連接服務(wù)、組件通信服務(wù)等三種集成接口服務(wù)。組件管理服務(wù)提供加載組件、注冊組件、查詢組件、調(diào)度組件、卸載組件等功能;組件連接服務(wù)提供連接組件、獲取接口類集合、初始化組件、釋放組件等功能;組件通信服務(wù)用于各組件間的信息交互,包括發(fā)送信息和接收信息等?;谖?nèi)核設(shè)計思想的軟件應(yīng)用框架組成如圖4 所示。
圖4 基于微內(nèi)核設(shè)計思想的軟件應(yīng)用框架組成圖Fig.4 Composition diagram of software application framework based on microkernel design concept
其中,基礎(chǔ)組件用于完成某類應(yīng)用需求而構(gòu)建的通用化功能模塊;業(yè)務(wù)組件用于完成特定應(yīng)用需求而構(gòu)建的專業(yè)化功能模塊。
軟件產(chǎn)品啟動時,宿主程序直接調(diào)用微內(nèi)核應(yīng)用框架提供的導(dǎo)出函數(shù),由其函數(shù)自動啟動組件管理服務(wù);組件管理服務(wù)先依次加載各組件,再調(diào)用組件連接服務(wù)獲取各組件連接對象,然后將各組件注冊到組件管理服務(wù)中;各組件啟動時按需向組件管理服務(wù)注冊組件接收信息對象。
軟件產(chǎn)品運行中,各組件按需調(diào)用組件通信服務(wù)中的發(fā)送信息對象向其他組件發(fā)送交互信息;發(fā)送信息對象經(jīng)過一系列的數(shù)據(jù)預(yù)處理,通過接收信息對象將交互信息分發(fā)到指定組件;接收到交互信息的組件,根據(jù)交互信息標(biāo)識符進入對應(yīng)的處理流程。
軟件產(chǎn)品退出時,組件管理服務(wù)調(diào)用組件連接服務(wù)釋放并卸載各組件。
組件描述文件規(guī)范是一種結(jié)構(gòu)化的描述模板,定義了組件基本信息,以及組件與外部發(fā)生交互關(guān)系所需信息。具體包括組件信息、集成信息、交互信息、接口類信息的規(guī)范;其中,組件信息中組件標(biāo)識符用于唯一標(biāo)識某個組件;集成信息中集成接口標(biāo)識符用于唯一標(biāo)識某個組件功能點;交互信息中交互信息標(biāo)識符用于唯一標(biāo)識某個組件傳遞的某條信息;接口類信息中接口類標(biāo)識符用于唯一標(biāo)識某個組件的接口類。
考慮到組件描述文件規(guī)范應(yīng)具備跨平臺、易閱讀、可擴展、可視化等特性,建議采用XML 文件格式來存儲組件描述信息。組件描述文件規(guī)范如圖5所示。
各組件參照組件描述文件規(guī)范,編寫專屬組件描述文件,并編碼實現(xiàn)其描述文件中定義的外部交互標(biāo)識符所對應(yīng)的邏輯代碼,再由組件管理服務(wù)通過組件描述文件中定義的外部交互標(biāo)識符間接調(diào)用組件內(nèi)部的邏輯代碼。組件描述文件規(guī)范使用原理圖如圖6 所示。
圖6 組件描述文件規(guī)范使用原理圖Fig.6 Schematic diagram of the use specification of component description files
組件管理服務(wù)為各類組件提供加載、注冊、查詢、調(diào)度和卸載等功能。
組件管理服務(wù)啟動時,自動掃描所有組件描述文件,將描述信息轉(zhuǎn)換成內(nèi)存結(jié)構(gòu)化數(shù)據(jù),再按照順序逐個加載組件,調(diào)用組件連接服務(wù)創(chuàng)建組件連接對象,通過組件連接對象獲取組件接口類集合,最后將已加載組件存儲到注冊組件集合中,實現(xiàn)組件的注冊。當(dāng)某組件需要獲取其他組件提供的服務(wù)時,通過組件管理服務(wù)查詢組件接口集合;當(dāng)不再使用某組件時,由組件管理服務(wù)對其卸載,并釋放軟件內(nèi)存空間。組件管理服務(wù)注冊組件流程圖如圖7 所示。
圖7 組件管理服務(wù)注冊組件流程圖Fig.7 Flow chart of registered components of component management service
組件連接服務(wù)為各組件提供連接到組件管理服務(wù)的規(guī)范,各組件參照組件連接服務(wù)規(guī)范,編寫其具體邏輯代碼,實現(xiàn)組件連接功能。組件連接規(guī)范由一個組件連接(全局)函數(shù)和一個組件連接(基類)組成。
組件連接(全局)函數(shù)定義為一個函數(shù)名為*CreatePluginObject()的導(dǎo)出函數(shù)。各組件按規(guī)范定義該導(dǎo)出函數(shù),并在其函數(shù)內(nèi)部調(diào)用new 方法創(chuàng)建一個組件連接子類對象,并返回該組件連接子對象。組件管理服務(wù)在加載組件后,直接調(diào)用組件連接(全局)函數(shù)用于獲取組件連接子對象。
組件連接(基類)包括獲取接口類集合、初始化組件、釋放組件等接口。各組件從組件連接(基類)派生各自的組件連接子類,并實現(xiàn)其接口功能。在組件連接(基類)和各組件連接子類對象中使用關(guān)鍵字virtual 定義的接口函數(shù)都會有建立一個與其對應(yīng)的虛函數(shù)表,該虛函數(shù)表中存放每一個對象的虛函數(shù)入口地址。對于各組件來講,它會繼承基類的虛函數(shù)表同時增加自己的虛函數(shù)入口地址,當(dāng)子類重寫基類的虛函數(shù),繼承過來的虛函數(shù)入口地址將被子類的重寫虛函數(shù)入口地址替代。程序運行時會發(fā)生動態(tài)綁定,將基類指針綁定到實例化的子對象,由組件連接基類根據(jù)組件連接子類對象來執(zhí)行不同的成員方法,已達到按需調(diào)用組件連接子類功能的目的。組件連接服務(wù)原理圖如下頁圖8 所示。
圖8 組件連接服務(wù)原理圖Fig.8 Schematic diagram of component connection service
組件通信服務(wù)為各組件之間的信息交互提供必要的通信鏈路。組件通信服務(wù)由發(fā)送信息和接收信息組成。組件通信服務(wù)原理圖如圖9 所示。
圖9 組件通信服務(wù)原理圖Fig.9 Schematic diagram of component communication service
發(fā)送信息用于某組件向其他組件發(fā)送交互信息。在組件通信服務(wù)內(nèi)部創(chuàng)建一個由發(fā)送信息(基類)派生的發(fā)送信息(子類),實現(xiàn)發(fā)送信息接口功能,該接口包含全局數(shù)據(jù)交互標(biāo)識符和數(shù)據(jù)流兩個參數(shù)。當(dāng)該接口被調(diào)用時,根據(jù)全局數(shù)據(jù)交互標(biāo)識符在注冊組件集合中查詢對應(yīng)的交互規(guī)則,按照指定的傳輸模式進行組件信息傳遞。當(dāng)傳輸模式設(shè)定為寄存模式,發(fā)送的數(shù)據(jù)流將被存放在發(fā)送隊列中,按照數(shù)據(jù)交互信息優(yōu)先原則從隊列中逐條取出并進入分發(fā)流程;當(dāng)傳輸模式設(shè)定為及時模式時,發(fā)送的數(shù)據(jù)流將直接進入分發(fā)流程。在分發(fā)流程中,解析(接收)組件標(biāo)識符來確定該條信息的通信方式(如:點播、組播和廣播3 種方式)。
點播:一個組件發(fā)送交互信息到一個指定組件對象
組播:一個組件發(fā)送交互信息到多個指定組件對象
廣播:一個組件發(fā)送交互信息到其他所有組件對象
寄存模式利用隊列“先進先出”(FI FO —First-In/First-Out)的重要特性,按照組件提出交互請求的順序依次存入數(shù)據(jù)緩存隊列,如圖10 所示。
圖10 寄存模式的數(shù)據(jù)緩存隊列Fig.10 Data cache queue in registration mode
針對寄存模式,先判斷輪詢定時器是否啟動,如果沒有啟動則啟動輪詢定時器,按照δt(ms)時間間隔查詢數(shù)據(jù)緩存隊列中的交互請求,查詢成功,則從隊列頭部取出一條交互請求,進入分發(fā)流程;循環(huán)查詢數(shù)據(jù)緩存隊列,直到查詢失敗,則停止輪詢定時器。
針對及時模式,暫停當(dāng)前發(fā)送任務(wù),直接進入分發(fā)流程,處理完成后恢復(fù)到之前的發(fā)送狀態(tài)。
接收信息用于某組件接收其他組件發(fā)送到本組件的交互信息。各組件從組件接收(基類)派生各自的組件接收(子類)實體類,并編碼處理其接收到的組件交互信息。組件通信服務(wù)經(jīng)過一系列的預(yù)處理,通過調(diào)用接收信息(基類)間接調(diào)用各組件的接收信息(子類)實體類,組件接收方再依據(jù)約定的全局信息標(biāo)識符對數(shù)據(jù)流進行解析,進入自身交互信息處理流程。
本文設(shè)計了一種基于微內(nèi)核設(shè)計思想的軟件應(yīng)用框架,支持項目團隊同步開發(fā)基礎(chǔ)組件和業(yè)務(wù)組件,通過基礎(chǔ)組件實現(xiàn)軟件應(yīng)用框架功能的持續(xù)擴展,按照軟件產(chǎn)品需求加載對應(yīng)業(yè)務(wù)組件,以達到最終實現(xiàn)具體軟件產(chǎn)品。利用本設(shè)計能夠適應(yīng)軟件產(chǎn)品“短、頻、快”的開發(fā)特點,滿足用戶對產(chǎn)品的需求。該應(yīng)用框架已應(yīng)用到某領(lǐng)域的信息系統(tǒng)軟件中。