趙昶宇,胡平
(1.天津津航計算技術(shù)研究所,天津 300308;2.海軍工程大學(xué)艦船與海洋學(xué)院,湖北 武漢 430033)
簡潔友好的用戶界面是嵌入式系統(tǒng)的重要功能組成,通過用戶界面接收系統(tǒng)輸入的數(shù)據(jù),并顯示軟件處理的結(jié)果。隨著嵌入式系統(tǒng)復(fù)雜性的不斷提高,對系統(tǒng)人機交互界面提出了越來越高的要求。一般來講,嵌入式軟件系統(tǒng)中的人機界面設(shè)計占據(jù)大約50%的代碼量,軟件系統(tǒng)的執(zhí)行時間有近50%的時間在執(zhí)行人機界面。從某種程度上說,人機界面設(shè)計已成為嵌入式軟件系統(tǒng)開發(fā)中最耗時、最困難的技術(shù)之一。傳統(tǒng)的人機界面的設(shè)計方法存在較多缺陷:①由于界面開發(fā)和程序設(shè)計語言、開發(fā)平臺之間存在緊耦合性,同樣的軟件功能使用不同的程序設(shè)計語言、在不同的平臺下運行,軟件開發(fā)的代碼量存在不小的差異和改動;②如果界面的控件元素較多,僅對這些控件元素進行布局和生成就會耗費大量的時間和精力,且后期一個小小的改動都會使人機界面的維護工作量巨大。
如何花費最少的人力財力,并且在最短的時間內(nèi)開發(fā)出滿足用戶不斷變化需求的能夠獨立于各種界面設(shè)計工具的圖形化人機界面,已經(jīng)成為嵌入式軟件系統(tǒng)需要亟待解決的問題。為了解決和改進當(dāng)前嵌入式軟件系統(tǒng)人機界面設(shè)計存在的代碼靈活性、可移植性和維護性差以及耗時耗力等問題,很有必要開發(fā)設(shè)計一種基于界面控件自動生成和布局的通用模式。傳統(tǒng)的界面開發(fā)工具在界面設(shè)計和功能代碼之間仍然存在著必要的耦合關(guān)系,本文為實現(xiàn)嵌入式軟件界面的可配置管理和自動生成,提出一種基于XML 技術(shù)的界面生成和管理方法,利用XML 構(gòu)建界面配置文件和界面元素,根據(jù)用戶需求自動生成嵌入式軟件界面。
可擴展標(biāo)記語言XML ( Extensible Markup Language)是一種面向Internet 應(yīng)用的可跨平臺的、依賴于內(nèi)容的通用語言規(guī)范,它是處理分布式結(jié)構(gòu)信息的有效工具,學(xué)術(shù)界將其作為未來網(wǎng)絡(luò)發(fā)展的技術(shù)基石。
XML 語言是一種純文本的文件格式,XML 文檔由XML 元素構(gòu)成,包括開始標(biāo)簽、結(jié)束標(biāo)簽以及2個標(biāo)簽之間的元素內(nèi)容。XML 中可以實現(xiàn)元素中再嵌套別的元素,XML 文檔的對象還包括處理指令、根元素、子元素、屬性以及注釋。雖然XML 文檔占用的存儲空間比二進制文檔要多,但是由于XML 語言通常采用簡單的標(biāo)記用來描述數(shù)據(jù),使其可以在任何應(yīng)用程序中方便地進行數(shù)據(jù)存儲和傳輸,它已經(jīng)成為目前進行數(shù)據(jù)交換的唯一公共語言。XML 語言的這種簡單的結(jié)構(gòu)特性使其可以與各種操作系統(tǒng)下生成的數(shù)據(jù)進行結(jié)合,通過加載并分析XML 數(shù)據(jù)文件,輸出XML 格式的結(jié)果[1]。
在XML 文檔中,用戶不可隨意定義標(biāo)記,必須按照特定的語法規(guī)則,并根據(jù)需要來定義標(biāo)記。在XML文檔中按照語法規(guī)則編寫的文檔結(jié)構(gòu)必須是完整的,這樣才能保證XML 處理器或者瀏覽器能夠正確讀取并解析文檔的內(nèi)容。XML 文檔的基本規(guī)則包括以下幾點:①文檔必須以XML 聲明,所有標(biāo)記必須配對,不能省去任何結(jié)束標(biāo)記,且XML 文檔必須包含在一個單一元素中;②XML 元素是XML 文檔中出現(xiàn)的標(biāo)簽,一個標(biāo)簽中可以嵌套若干子標(biāo)簽,但所有標(biāo)簽必須合理的嵌套,不允許有交叉嵌套;③XML 文檔的屬性必須有值,且值必須用引號括起來,元素中的屬性不允許重復(fù);④處理指令是為XML 解析器提供信息,使其能夠正確解析元素內(nèi)容,它是為使用一段特殊代碼而設(shè)計的標(biāo)記;⑤XML 文檔中有且只有一個根元素,其他元素都是該根元素的子元素或?qū)O元素,XML 元素是對大小寫敏感的;⑥對于XML 元素中出現(xiàn)的所有空格和換行,XML 解析程序都會當(dāng)作元素內(nèi)容進行處理。
基于XML 語言的嵌入式軟件界面描述文件,不僅需要考慮到利用其能夠自動生成軟件界面的特點,還需要關(guān)注界面元素易于修改和維護的情形。通常來講,嵌入式軟件的界面描述文件一般包含以下內(nèi)容:①定義軟件界面的框架結(jié)構(gòu);②定義和描述字段的屬性信息;③描述界面元素(各種控件)的上下文內(nèi)容;④描述界面元素的嵌套層次關(guān)系。
嵌入式軟件人機界面上的控件類型一般分為通用容器類控件和基本類型控件,通用容器類控件一般包括選項卡面板、滾動面板和分割式面板,基本類控件包括按鈕類、靜態(tài)文本類、文本編輯框類、組合框、列表框、單選框以及復(fù)選框等。通用容器類控件的XML 描述見表1,基本類型控件的XML 描述見表2。
表1 通用容器類控件的XML 描述
表2 基本類型控件的XML 描述
為實現(xiàn)軟件界面設(shè)計和任務(wù)功能設(shè)計的分離,提出一種基于XML 的界面動態(tài)生成技術(shù)。該方法利用XML 描述用戶界面并進行持久存儲,通過讀取并解析XML 配置文件的表示層信息,在運行時生成界面元素,使系統(tǒng)每次啟動時都按XML 配置文件提供的信息來顯示界面,無需重新編譯和連接,實現(xiàn)了任意交互界面的動態(tài)創(chuàng)建,為最終用戶提供了靈活的界面維護修改功能。嵌入式軟件的界面自動生成模型共分為3層設(shè)計:界面表示層、邏輯處理層和數(shù)據(jù)存儲層。自動生成模型見圖1[2]。
圖1 嵌入式軟件界面自動生成模型
界面表示層位于自動生成模型的最上層,主要完成將界面控件對象描述信息(控件對象的屬性值)存儲到XML 文件中,并通過XML API 解析軟件界面配置文件信息。邏輯處理層位于自動生成模型的中間位置,它是軟件界面自動生成的核心層,用于完成和界面表示層、數(shù)據(jù)存儲層的交互工作。它不僅可以獲取軟件界面控件對象的具體描述信息,還能獲取界面自動生成時依賴的界面元素數(shù)據(jù)。
數(shù)據(jù)存儲層位于自動生成模型的最下層,它用于存儲界面元素數(shù)據(jù)信息,主要包括界面控件的相關(guān)信息、字段類型和約束條件等內(nèi)容。通過訪問數(shù)據(jù)庫接口,完成數(shù)據(jù)存儲層和邏輯處理層的數(shù)據(jù)信息交互。
雖然界面表示層、邏輯處理層和數(shù)據(jù)存儲層在邏輯結(jié)構(gòu)上是相互獨立的,但它們之間又存在著數(shù)據(jù)交互。該嵌入式軟件界面自動生成模型將界面控件對象的描述信息與代碼實現(xiàn)分離,利用XML 文檔技術(shù)實現(xiàn)了從界面隨意配置到界面的自動生成[3]。該模型具有以下幾個特點:①由于XML 技術(shù)不僅支持多種開發(fā)工具,而且具有與使用語言無關(guān)的特性,軟件設(shè)計人員只需關(guān)注界面控件對象的描述信息和描述方式,無需考慮開發(fā)工具的差異性,極大地提高了界面控件設(shè)計的通用性;②當(dāng)用戶對嵌入式軟件界面的使用需求發(fā)生改變時,無需修改程序代碼,只需根據(jù)用戶需求修改界面定制配置文件即可。該模型不僅滿足用戶不斷變化的需求,還支持用戶跨平臺執(zhí)行界面程序,具有良好的可擴展性;③通過界面表示層、邏輯處理層和數(shù)據(jù)存儲層實現(xiàn)了軟件界面的外在形式、界面元素信息和界面數(shù)據(jù)邏輯處理的層次化模型的建立,并在軟件界面運行時可通過動態(tài)修改資源配置文件的方式實現(xiàn)界面的多樣化顯示。
嵌入式軟件的界面自動生成技術(shù)由XML 文檔(存儲界面描述信息)、界面管理組件、界面生成組件、界面定制工具和編程語言組件庫等組成。首先通過解析XML 文檔,獲取界面描述對象的具體信息,然后通過調(diào)用編程語言組件庫完成組件的構(gòu)建工作,并為相關(guān)組件設(shè)置事件監(jiān)聽類,最終實現(xiàn)了用戶界面的自動生成。
嵌入式軟件界面管理組件根據(jù)界面配置文件中相關(guān)文件路徑以及對應(yīng)的界面信息,獲取到界面描述對象,并創(chuàng)建當(dāng)前界面配置信息,同時界面配置組件將界面描述對象信息返回給界面管理組件;如果用戶曾經(jīng)定制過界面,則界面管理組件通過調(diào)用定制后的界面配置信息,創(chuàng)建定制后的界面描述對象,然后由界面定制組件將定制后的界面描述對象返回給界面管理組件;界面管理組件通過遞歸調(diào)用界面動態(tài)生成組件,獲取界面上所有的表示信息,完成了最終的頁面樣式;最后界面管理組件完成了動態(tài)生成界面的加載,并在界面上顯示出來。嵌入式軟件界面動態(tài)生成的UML時序圖見圖2。
圖2 嵌入式軟件界面自動生成時序圖
嵌入式軟件界面的自動生成算法步驟如下。
步驟1:采用XML Schema 工具驗證界面配置文件的內(nèi)容合法性,若內(nèi)容合法,利用XML API 解析配置文件內(nèi)容,生成對應(yīng)的內(nèi)存數(shù)據(jù),執(zhí)行步驟2;若內(nèi)容不合法,算法結(jié)束。
步驟2:通過XML API 將步驟1 生成的內(nèi)存數(shù)據(jù)翻譯成格式化文本,完成界面配置文件的更新操作,然后通過數(shù)據(jù)存取類接口讀寫數(shù)據(jù)存儲層中的界面數(shù)據(jù)信息,并存儲在自定義數(shù)據(jù)結(jié)構(gòu)中。
步驟3:加載上述2 步獲取的數(shù)據(jù)信息,循環(huán)生成界面元素,若生成界面元素結(jié)束,則轉(zhuǎn)向步驟7,否則繼續(xù)執(zhí)行步驟4。
步驟4:通過遍歷所有類型的控件節(jié)點,檢查該控件節(jié)點是否存在,若存在,則根據(jù)用戶的不同操作得到控件的主鍵值,通過XML 配置文件讀取界面表示層信息,執(zhí)行步驟5;若不存在,執(zhí)行步驟6。
步驟5:加載每個控件節(jié)點的屬性數(shù)據(jù),判斷每個控件節(jié)點下是否存在相應(yīng)的事件節(jié)點,若存在,則判斷該事件類型,并加載該節(jié)點相應(yīng)事件,執(zhí)行步驟6;若不存在,執(zhí)行步驟7。
步驟6:自動生成軟件界面并顯示所有控件。
步驟7:判斷界面配置文件是否讀取結(jié)束,若到達(dá)文件尾,則算法結(jié)束,否則,轉(zhuǎn)向步驟3。
本文提出了一種嵌入式軟件界面的自動生成方法,建立了相應(yīng)模型,并闡述了該方法的技術(shù)實現(xiàn)原理。該方法一方面極大降低了軟件開發(fā)人員的工作量,更重要的是使得界面生成代碼具有良好的可移植性和可維護性,大大提高了軟件代碼的重用率和代碼穩(wěn)定性。