摘 要:隨著軟件復用技術研究的深入和軟件構件庫應用規模的擴大,構件庫中構件的種類日益增多,構件間關系日漸復雜。這就需要對傳統的構件庫信息模型進行擴展,在完整描述構件自身信息的基礎上,增加對構件間關系信息描述的支持。為了有效地發揮構件庫的作用,提出的軟件構件庫信息模型在已有模型的基礎上采用刻面描述機制并增加了對構件間關系的描述,利用該模型不僅可以有效地描述構件的各種信息,還使得用戶可以根據構件之間的關系檢索構件。
關鍵詞:構件庫; 構件庫數據模型; 構件關系; 刻面分類
中圖分類號:
TN911-34; TP311
文獻標識碼:A
文章編號:1004-373X(2011)19
-0140
-04
Design of Component Library Information Model Supporting
Component Relationship Description
ZHANG Jing-guo, GUO Min
(College of Electronic and Control Engineering, Beijing University of Technology, Beijing 100124, China)
Abstract: With the deepening of the research on software reuse technique and the development of component library scale, the categories of components stored in the library are growing rapidly, and the relations among components become more and more complex. Thus, the traditional component library information model needs to be expanded. Based on a complete component information description, the description of relations among components is added. In order to effectively play the role of library, a component library information model is presented. On the basis of the existing model, it adopts facet classification mechanism and adds relations among components. This model can be used to describe all kinds of component information effectively, and allow users to retrieve components according to the relations among the components.
Keywords: component library; component library information model; component relation; facet classification
收稿日期:2011-05-21
0 引 言
軟件復用對于提高開發效率和軟件質量有著巨大的潛力。從某種意義上講,軟件復用可以通過恰當地使用構件庫得以實現。在構件庫支持下,軟件工程師可以“取眾家之長”,避免重復開發已有的軟件。軟件構件庫是軟件復用中管理可復用構件的基礎設施,它為基于構件的軟件開發(CBSD)中的構件生產和構件復用兩方面工作之間建立了橋梁。要減小復用成本,使用者能夠正確理解構件,更好地復用軟件構件,就需要對構件進行描述和分類[1]。此外,構件之間的關系對于構件庫而言是非常重要的資源[2],因此,構件庫的信息模型不僅能夠描述構件的基本信息,還應該能夠明確地表示構件之間的關系。然而現有的模型缺乏對分類、關系信息相應的描述機制[3]。例如:作為Web Services注冊和發現機制的UDDI,定義了其核心數據結構以及所有的應用程序接口,使用同步復制技術在各個節點之間復制信息。但是,UDDI面向電子商務應用的性質使其不能很好地對其他類型的構件進行描述和管理,也不能描述構件間關系,很難滿足作為構件庫數據模型的需要[4]。目前,構件的刻面分類描述是一種正逐步得到重視與應用的描述方法。例如,REBOOT,NATO提出的構件分類方法是采用了基于刻面的描述機制;而青鳥構件庫中的構件則是采用刻面分類為主、多種分類模式結合的方法對構件進行分類描述[5]。
1 軟件構件庫信息模型
軟件構件庫系統是一類數據庫管理系統,它不僅具備數據庫的基本特征和功能,還具備存儲構件和構件相關信息的能力[6]。因此,構件庫中的數據主要包括構件實體本身、描述性信息和構件庫的使用信息。描述性信息包括以下幾方面[7]:
(1) 構件的語義描述。描述構件功能和用途,精確定義構件語義。
(2) 構件分類。對構件相同特征的聚類。
(3) 構件技術環境。包括開發工具、配置方法和部署環境等。
(4) 構件的狀態。包括版本、歷史等時間相關構件的屬性。
模型總體由3部分組成,即基本描述部分、分類描述部分和關系描述部分,如圖1所示。
圖1 模型總體結構圖
本文設計的軟件構件庫信息模型在以上信息的基礎上,還包括了構件間關系的描述,從而豐富了以往的信息模型,也為構件庫的使用增添了一種基于構件關系導航的查詢方式。
1.1 基本描述部分
基本描述包括構件的語義描述、技術環境、構件的狀態以及構件庫的使用信息。其中構件庫的使用信息包括用戶對構件庫的使用情況,主要記錄用戶上傳和下載構件的相關信息。
(1) 用戶。構件庫的用戶使用提供者和使用者來進行描述,其中提供者包括構件提供商的信息或制作者的信息。它記錄了提供者的聯系方式(如Emails,Phonenum等)和登錄相關信息(UserID、Password等)。使用者實體與構件實體之間是多對多的關系,即一個使用者可以使用多個構件,而一個構件也可以被多個使用者進行使用。因此,抽象出另外一個實體下載信息來將其關聯,如圖2所示。然而下載信息實體與構件之間也是多對多的關系,即一個構件可以出現在多個下載信息實體中,一個下載信息實體可以包含多個構件實體。因此,再抽象出了另一個實體構件下載,解決它們之間的多對多的關系。
(2) 構件。表示的是構件庫中的構件的基本信息(名稱、尺寸、版本號等)和其他擴展信息(構件地址、內容摘要、價格等)。其中,考慮到構件運行效果是以圖片的方式展現給用戶,而圖片的大小和展現圖片數量的不同,因此,圖片單獨存儲于文件系統中,使用PictureUrl來與圖片實體進行關聯。
1.2 分類描述部分
構件的有效分類對于構件的檢索和獲取起著非常重要的作用,是軟件復用成功的關鍵[8]。刻面的分類策略與一般的層次分類策略相比,刻面分類策略更易于修改,因為對一個刻面的修改不會影響到其他的刻面。同時,每個刻面對應一個結構化的術語空間,避免了一般的關鍵詞分類策略的雜亂無章。在查詢時使用者通過選擇刻面術語,可以明確地限定構件的范疇,不會有遺漏的構件。隨著構件庫中構件種類的不斷增多,描述構件的術語會不斷的豐富。當刻面的術語空間變得很大時,使用平鋪式的結構組織術語將會使用戶不能迅速找到所需的術語。因此,通過定義術語之間的關系,以層次結構的方式組織刻面與術語可以有效的解決該問題,即通過將每個刻面所對應的術語空間中的術語進行歸類形成術語、子術語的關系。這樣用戶可以沿著刻面、術語與子術語之間的關系迅速對術語進行定位。 如圖3所示,在刻面術語空間中,TermPath用來描述術語在刻面術語樹中的位置,TermLevel標識術語屬于哪個層次,例如“1”代表的是刻面,“2”為術語。構件描述實體用來記錄對構件的詳細描述信息,描述串中的術語來自刻面術語空間。
圖2 基本描述模型
圖3 分類描述模型
1.3 關系描述部分
為了給使用者在查詢構件時提供方便,同時也為了更好地復用構件,構件庫為構件實體間預定義了以下幾種關系:
(1) 被實現關系。主要是指處于軟件生命周期相鄰階段(相鄰的抽象層次)的構件間對應關系。
(2) 版本關系。主要是指處于同一個構件演化系列中的構件間關系。
(3) 包含關系。主要是指不同形態的構件間的包含關系。
(4) 協作關系。與一個構件具有協作關系的構件主要是指與該構件相互合作、共同完成一個特定任務的構件。
構件間的關系是復雜的,在關系模型設計時必須考慮以下幾方面:
(1) 關系的復雜性。以上4種關系都是一對多的關系,如被實現關系:軟件生命周期中的需求分析構件可以采用多種軟件設計方式來實現,而每個軟件設計可以由多種編碼方式來實現。
(2) 構件關系存在的復雜性。一個構件在庫中可以與其他構件沒有任何關系,即不存在以上4種關系;也可以與其他構件存在一個或多個關系。
(3) 關系的維護。由于以上2個因素的存在使得構件間關系的維護變得復雜,然而,關系描述模型的設計必須使得當發生添加、修改或刪除構件間關系時不影響其他已有的關系。
根據以上因素,設計的關系描述模型如圖4所示。ComRelType實體包含4個屬性來描述構件間關系類型,RelTypeID用來標識不同的關系,取值分別為:1,2,4,8。“1”代表被實現關系,“2”版本關系,“4”代表包含關系,“8”代表協作關系。Components實體中Status用來表示該構件存在哪幾種關系。比如,Status值為“0”時,表明該構件與庫中其他構件不存在以上4種關系;值為“1”時,表明構件在該構件庫中存在被實現關系;當Status值為“3”時表明該構件與其他構件存在被實現關系和版本關系。由CompRelation實體來描述構件間的關系,CompID與CompID1,CompID2之間的數據完整性和一致性是通過主外鍵關系來設定的。將關系的維護限定在對一個實體的處理上,使得關系維護變得方便。
圖4 關系描述模型
2 構件描述樹字符串生成算法
基于刻面描述的構件檢索問題最終可以歸結為樹匹配的問題[9],即將對構件刻面描述的樹型結構與查詢刻面樹進行匹配。把基于刻面描述的構件樹和查詢樹用組成構件的路徑字符串連接表示,就可以實現樹的匹配到相應結點路徑匹配的轉化問題。用子字符串代表某刻面屬性路徑,即將路徑匹配轉換為字符串的匹配,應用相應的高效字符串查詢方法來實現構件查詢的目的。
在匹配之前首先要解決的問題是如何生成構件描述樹以及查詢樹的路徑字符串[10]。根據基本描述模型和分類描述模型的介紹可知,構件描述樹和查詢樹的信息均來自于刻面術語空間,分別由提供者和使用者這兩個角色提供,因此,它們的樹型結構可以采用相同的算法生成,在這里以構件描述樹字符串的生成來說明該算法。
2.1 構件描述樹的表示
定義(樹) 對于一棵樹TIT=(V,E,root(T))。其中,V表示一個有限的節點集;root(T)∈V表示樹的根節點;E表示邊集,它是V上的一個二元關系,它滿足反自反、反對稱、可傳遞性。
在程序設計中以類的方式來設計樹的數據結構如圖5所示。樹中節點使用Node類實現,構件描述樹使用CompTree類實現;label字段為構件描述樹中刻面術語的ID值(如分類模型中TermID),wasVisited屬性表示該節點是否被訪問過。在CompTree類中,構件樹節點集使用類數組Nodes來表示,節點間的關系使用adjMatrix二維數組來表示。
圖5 構件描述樹類圖
2.2 構件描述樹字符串生成算法描述與分析
2.2.1 算法描述
輸入:構件的刻面術語描述信息。
輸出:構件描述樹字符串CompDesString。
(1) 獲取構件描述樹中各節點的值和節點間的關系并將所有Node.isVisted初始化為1和adjMatrix初始化為0;
(2) 分別將各節點值和邊賦予類數組Nodes[NUM_VERTICES]和鄰接矩陣adjMatrix[NUM_VERTICES][NUM_VERTICES];
(3) 將根節點標記為訪問過Nodes[0].wasVisited=true,并壓入棧gStack中;
(4) while(gStack.Count>0)
(5) for(int j=0;j<= NUM_VERTICES-1;j++);
(6) if(當前節點v與另一節點j存在邊關系節點j未被訪問過)
(7) Return 節點v=j
(8) else v=-1;
(9) endfor
(10) if(v==-1)
(11) if(gStack.Count>3)
(12) {
(13) 調用方法CreatPathString()將堆棧gStack的數據連接形成一條路徑字符串并在末端添加后綴“#”;
(14) 調用方法JoinPathString()將各條路徑字符串連接成構件描述字符串CompDesString;
(15) }
(16) endif
(17) gStack.Pop();
(18) else
(19) {
(20) Nodes[v].wasVisted=true;
(21) gStack.Push(v);
(22) }
(23) endwhile
(24) return CompDesString
2.2.2 算法分析
本文提出的構件描述樹字符串生成算法是在圖的表示和圖的深度優先遍歷思想的基礎上提出的,樹中各節點使用類Node來表示,各節點邊的關系存儲于鄰接矩陣adjMatrix中。在構件描述樹中,每條從根節點到葉子節點的路徑表示了該構件在刻面下的語義以及分類情況,而圖的深度優先遍歷是遍歷完整棵樹,因此結合實際情況,將圖的深度優先遍歷算法修改為遍歷每條路徑將形成的所有路徑字符串加上分隔符“#”連接成整棵樹的長字符串,在后續的工作中使用查詢字符串與庫中所有構件描述樹字符串進行匹配。
雖然該算法的時間復雜度是O(n2),但是它具有很強的適應性,即當刻面術語空間中刻面以及術語不斷擴充時,構件描述樹中各節點的邊關系也會變得很多,它可以很好地適應該變化。
3 結 語
構件庫是支持基于構件軟件開發(CBSD)的重要基礎設施。隨著軟件復用和構件技術的發展,構件的種類日益增多,構件關系也越來越復雜。構件庫信息模型應該能夠適應隨著這些變化而產生的需求。本文對傳統的構件庫信息模型進行了擴展,在完整描述構件自身信息的基礎上,增加了對構件間關系信息描述的支持。利用本模型不僅可以有效地描述構件的各種信息,還使得用戶可以根據構件之間的關系來檢索構件。最后給出了構件描述樹字符串生成算法,雖然該算法的時間復雜度是O(n2),但是可以很好地適應樹中邊關系很多的情況。
參 考 文 獻
[1]MILI H, MILI F, MILI A. Reusing software: issues and research directions \\. IEEE Transaction on Software Engineering, 1995, 21(6): 528-562.
[2]薛大宇,潘穎,謝冰,等.一種支持構件關系管理的關系描述模型[C]//2004全國軟件和應用學術會議論文集.北京:機械工業出版社,2004:50-55.
[3]李琰,鄒艷珍,潘穎,等.一種可擴展的構件庫數據模型[J].計算機科學,2006,33(5):282-286.
[4]鄒艷珍,謝冰,李琰,等.軟件構件管理規范信息模型標準介紹[J].信息技術與標準化,2006(6):14-18.
[5]CHANG Ji-chuan, LI Ke-qin, GUO Li-feng, et al. Representing and retrieving reusable software components in JB system \\. Electronics Journal, 2000, 28(8): 20-24.
[6]王淵峰,朱沅.刻面分類構件的匹配模型[J].軟件學報,2003,14(3):401-408.
[7]王志堅, 費玉奎,婁源清.軟件構件技術及其應用[M].北京:科學出版社,2005.
[8]DANIEL Lucredio, ANTONIO Francisco do Prado. A survey on software components search and retrieval \\. \\: St. Louis,MO,USA: IEEE Computer Society, 2005.
[9]WANG Shun-yan, ZHONG Luo,JIANG De-sheng,et al. Facet description and searching of component resource \\// IEEE International Conference on Computer Science and Software Engineering. \\: IEEE, 2008: 24-31.
[10]張韜.基于刻面描述的構件檢索方法及實現[D].武漢:華中科技大學,2008.