摘 要: 依據(jù)網(wǎng)上信息收集系統(tǒng)構件庫" title="構件庫">構件庫中構件的開發(fā)和管理經(jīng)驗,提出一種構件模型" title="構件模型">構件模型,并闡述了此模型對基于語義的構件檢索、構件組裝和構件演化的自動化支持。
關鍵詞: 構件模型 構件庫 形式化方法 形式化描述。
在基于構件的軟件開發(fā)(CBSD)[1][2]中,作為復用" title="復用">復用基礎設施的構件庫系統(tǒng)已成為企業(yè)內部和企業(yè)間協(xié)作的必然裝備,而要建立系統(tǒng)化的構件庫,建立合適的構件模型是第一步。構件模型是構件本質特征及構件間關系的抽象描述。它定義了構件的本質屬性,規(guī)定了構件接口的結構以及構件與軟件體系結構、構件與構件之間的交互機制。構件模型通常還提供創(chuàng)建和實現(xiàn)構件的指導原則。
1 當前典型構件模型簡介與分析
在圍繞構件庫進行軟件開發(fā)的過程中,不同的角色、不同的關注點所需要的構件信息也不相同。基于這一認識北京大學信息科學技術學院軟件研究所將構件模型分為三種:構件描述、分類的模型,構件規(guī)約、組裝的模型和構件實現(xiàn)的模型。下面以這種分類方法來分析一下當前典型構件模型。
(1)構件描述、分類的模型試圖以一種綜合的方式來描述構件,使得構件易于為用戶所理解,易于在庫中被有效高效地分類、存儲和檢索。REBOOT(Reuse Based Object-Oriented Techniques)模型就是其中之一,它通過刻面的" title="面的">面的方法從各個角度刻劃軟構件屬性,來實現(xiàn)對構件的分類和檢索。
(2)構件規(guī)約、組裝的模型描述構件的功能和行為規(guī)約,并通過配置這些規(guī)約來刻劃系統(tǒng)。著名的3C模型[3]就是用來刻劃構件規(guī)約和組裝的。3C模型是一個指導性的構件模型,它從概念、內容、語境三個部分來描述構件,但是3C模型缺乏形式化定義和易懂的描述,因此僅具有一定的宏觀指導意義。
(3)構件實現(xiàn)的模型用于幫助人們決定如何用某種程序設計語言或以某種可執(zhí)行單元的形式來實現(xiàn)構件。有代表性的實現(xiàn)級工業(yè)標準構件模型有CORBA、DCOM/COM和Enterprise JavaBean,三足鼎立構成競爭與互操作并存的格局,工業(yè)構件模型最大的缺點在于其缺乏對構件語義的深入支持。
綜合考慮現(xiàn)有的構件模型,可得出以下結論:
(1)現(xiàn)有的面向構件描述和分類的模型缺乏對構件語義特別是構件領域特征的語義的描述,而這些正是理解構件基于領域的復用價值的關鍵。
(2)現(xiàn)有的面向構件規(guī)約和組裝的模型缺乏對構件演化的支持,對構件組裝的支持機制也未達到標準化。
(3)現(xiàn)有的構件模型都很少涉及有關構件復用和構件管理的信息,比如構件的復用度等。
(4)在構件庫系統(tǒng)中,構件模型的應用是既面向構件描述和分類又面向構件規(guī)約和組裝的,而目前關注如此多方面的構件模型還不多見。
2 對構件庫中構件模型的改進
人們對構件庫中構件的操作包括入庫、檢索、學習、組裝和演化等,在對構件進行這些操作時,變換支持其實現(xiàn)的底層構件模型是不現(xiàn)實的。所以,筆者試圖探求一種構件描述模型,并讓它同時支持構件的語義檢索、自動化組裝、以及對演化的自動化支持等。
2.1 構件模型所要描述的信息
在對構件進行描述之前,必須先明確有哪些信息需要被構件模型來描述。而要明確構件模型中到底需要記錄那些信息,就應該看構件庫中圍繞構件都做了哪些活動。經(jīng)過分析,構件庫中分角色對構件的操作有:
(1)構件發(fā)布者:注冊構件描述、分類信息;注冊構件實體信息(離線構件);注冊構件接口信息(在線構件)。
(2)軟件開發(fā)人員:查詢;下載構件實體(離線構件);獲取構件接口信息(在線構件);學習構件的功用和構件的用法等信息;應用構件進行應用系統(tǒng)組裝;對不適用的構件進行演化。
為了支持這些活動,構件模型中應該具有下列信息:
(1)面向構件描述和分類的信息
所有對用戶查找、理解、選擇、適應性修改以及使用構件有幫助的信息;
所有對構件庫管理者分類和管理構件及構件間關系有幫助的信息;
構件的其他屬性,包括:生產(chǎn)者、版本、使用者、反饋意見、知識產(chǎn)權控制等。
(2)面向構件規(guī)約和組裝的信息
構件對外提供的功能;
構件需要外界為它提供的功能;
構件被用于什么語境;
支持構件演化的信息。
綜上所述,不同的角色在構件庫中對構件的操作也不同。所以,對構件的信息需求也不同。在一般情況下,可以認為在企業(yè)里構件的入庫者就是構件的生產(chǎn)者[3],他們應該將主要的構件描述信息在構件入庫時錄入進去;而構件使用者對構件的行為有查找、學習、組裝和演化等,并且在構件使用者應用構件庫進行軟件開發(fā)時,在不同時期所關注的構件信息也是不同的。所以,應該分階段、分層次地把構件的信息展現(xiàn)給構件使用者。在這里,將按照查找、學習、組裝與演化三個層次來展現(xiàn)構件的性質。
2.2 構件模型
構件(Component)是指語義完整、語法正確和有可復用價值的單位軟件,是軟件復用過程中可以明確辨識的系統(tǒng)構成[4]。結構上,它是基于檢索部分、基于學習部分和基于組裝和演化部分的復合體。
Component==[RetrievalPart,StudyPart,AssemblyAndEvo-lvementPart]
也可以表示為:
Component==RetrievalPart×StudyPart×AssemblyAndEvo-lvementPart
這里,RetrievalPart是基于構件檢索的部分,查找的目的是為了能夠準確、快速地找到所需要的構件,這里支持構件查找所用的描述信息由六個刻面和復用度(一個“屬性-值”對)組成;為了能夠支持計算機檢索,這部分信息必須用形式化語言來描述。StudyPart是對構件學習的部分;學習階段的目的是進一步確定構件是否滿足軟件開發(fā)的要求,這部分工作是由構件使用者來做的,所以用自然語言" title="自然語言">自然語言描述最合適;支持構件學習的信息可以分為構件內部信息描述和構件外圍信息描述兩種,構件的內部信息是外界可見的屬性和行為,其中包括:公有屬性及對它們的自然語言描述和公有行為及對它們的自然語言描述。構件的外圍描述包括:生產(chǎn)者,版本,使用者,反饋意見,知識產(chǎn)權控制等。AssemblyAndEvolvementPart是支持構件組裝和演化的部分;組裝和演化階段軟件使用者所關心的是構件的具體功能和構件的詳細使用語境,為了使這階段支持自動化組裝,所以這部分應該用形式化語言描述。
2.2.1 基于檢索的部分
基于檢索部分描述的主要目的是為了能夠準確、快速地找到所需要的構件。很多專家學者在這方面已經(jīng)做了很多工作,目前各類構件庫中使用最多的是關鍵詞分類法,枚舉、層次分類法,屬性-值分類法和刻面分類法[5]四種。這里選用了刻面分類法來描述構件,并加入了復用度這個屬性-值對來描述構件的復用價值??堂娣诸惒糠诌x取了功能(Functionality),層次(Level),表示方法(Representation),硬件環(huán)境(HardwareEnvironment),軟件環(huán)境(SoftwareEnvironment),程序語言(Programming Language)六個刻面來描述。
定義1 基于檢索部分(RetrievalPart)。基于檢索部分可以表示為:
RetrievalPart=[Functionality,Level,Representation,Hard-wareEnvironment,SoftwareEnvironment,ProgrammingLanguage,ReuseDegree]
其中,功能選取的術語:任務管理,資源管理,時間管理,編程支持,中斷管理,異常管理,用戶界面,安全管理,網(wǎng)絡服務,數(shù)據(jù)庫管理等;層次選取的術語:需求,設計,實現(xiàn),實施,測試等;表示方法選取的術語:源代碼,目標代碼,文檔,圖表等;硬件環(huán)境選取的術語:CPU,內存,顯卡,主板等;軟件環(huán)境是所需軟件的列表,其中既包括系統(tǒng)軟件又包括應用軟件,例如:Win98,Win2000,WinXP,Linux,Office2000等;程序語言選取的術語:C,C#,Visual C++,VB,Java,Visual Foxpro等。這里給選取的術語空間加入機器學習的機制,隨著新構件的不斷入庫,更多、更規(guī)范的術語的出現(xiàn),來不斷豐富和完善各個刻面的術語空間。
定義1.1 復用度(ReuseDegree)。復用度等于初始值(Initialization)加上復用次數(shù)與入庫時間的比值。
ReuseDegree=Initialization+ReuseTime/EnterTime
初始值在軟件入庫時由入庫人員設定,并且在以后的構件庫運行過程中可以由構件庫管理人員或構件使用者更改。
2.2.2 基于學習的部分
定義2 基于學習的部分(StudyPart)?;趯W習的部分可以分兩部分來描述:內部信息描述(InnerInfo)和外圍信息描述(OuterInfo)。
StudyPart=[InnerInfo, OuterInfo]
其中,內部信息描述的是構件能向外界提供什么服務,需要外界為它提供什么服務,包括:外顯的屬性和向外提供的服務及其自然語言描述。外部信息描述的是構件的一些外部信息,如生產(chǎn)者、版本、使用者、反饋意見、知識產(chǎn)權控制等。
定義2.1 內部信息描述(InnerInfo)。內部信息描述按照構件結構分成公有屬性(PublicAttribute)和公有行為(PublicAction)兩部分描述。
InnerInfo=[PublicAttribute, PublicAction]
定義2.1.1 公有屬性。公有屬性的結構是屬性名稱(AttributeName)和相對應的自然語言描述(AttributeNatureLanguageDescription)的對偶。因為基于學習部分是讓“人”去學習,所以用自然語言描述是最合適的。
PublicAttribute=[AttributeName,AttributeNatureLanguage-Description]
定義2.1.2 公有行為。公有行為的描述結構和公有屬性的描述類似,是行為名稱(ActionName)和相對應的自然語言描述的對偶。其中,行為名稱和構件庫中構件的真實行為名稱應保持一致。
PublicAction=[ActionName,ActionNatureLanguageDesc-ription]
定義2.2 構件的外部信息。構件的外部信息包括:生產(chǎn)者(Producer),版本(Edition),使用者(User),反饋意見(Feedback),知識產(chǎn)權控制(PropertyRight),入庫時間(EnterTime),復用次數(shù)(ReuseTime)。
OuterInfo=[Producer,Edition,User,F(xiàn)eedback,Property-Right,EnterTime,ReuseTime]
2.2.3 基于組裝和演化的部分
基于組裝和演化部分描述的目的是為了更好地支持構件的組裝和演化。在支持組裝方面,此模型支持找出與構件組裝相關的其他構件,提供構件接口的語法與語義描述和提供構件的實現(xiàn)體。在支持演化方面,此模型支持找出所有與演化構件相關的構件,分析是否有必要將相關構件一起演化。
定義3 基于組裝和演化部分(AssemblyAndEvolvementPart)?;诮M裝和演化部分用來描述支持構件組裝和演化的信息。這里從構件關系語境(ComponentRelationContext)、接口(Interface)、實現(xiàn)(Implementation)三個方面來刻劃。
AssemblyAndEvolvementPart=[ComponentRelationContext,Interface, Implementation]
ComponentRelationContext:構件關系語境集合,描述構件間的關系;Interface:接口集合,接口是描述構件的通信接口規(guī)范和語法約束;Implementation:實現(xiàn)集合,實現(xiàn)是滿足接口規(guī)范和語義描述的實例。
通過網(wǎng)上信息收集系統(tǒng)的實踐和多年來的研究,總結構件間的關系有如下五種[6],如表1所示。
定義3.1 構件關系語境。根據(jù)表1中劃分的五種構件關系,構件關系語境可以表示成一系列構件的列表,其中包括:版本關系構件列表,協(xié)作關系構件列表,精化構件列表,被精化構件列表,包含構件列表,被包含構件列表,依賴構件列表,被依賴構件列表。形式如下:
ComponentRelationContext=[EditionRelTab,Cooperation-RelTab,SubtleRelTab,BeSubtleRelTab,InclusionRelTab,Be-InclusionRelTab,RelyRelTab,BeRelyRelTab]
定義3.2 接口。接口體是描述構件的通信接口規(guī)范和語法約束,它可以分為三部分描述:接口名稱(InterfaceName)、接口函數(shù)(InterfaceFunction)、接口語義(InterfaceSemantic)。
Interface=[InterfaceName,InterfaceFunction,InterfaceSe-mantic]
定義3.2.1 接口函數(shù)(InterfaceFunction)。接口函數(shù)的結構由三部分構成:函數(shù)名稱(FunctionName),函數(shù)功能(FunctionFunction),函數(shù)參數(shù)(FunctionParameter):
InterfaceFunction=[FunctionName,F(xiàn)unctionFunction,F(xiàn)un-ctionParameter]
其中,函數(shù)參數(shù)可以從參數(shù)名稱(ParaName),參數(shù)說明(ParaExplain),方向(Orientation),參數(shù)類型(ParaType)四個方面描述:
FunctionParameter=[ParaName,ParaExplain,Orientation,ParaType]
定義3.2.2 接口語義(InterfaceSemantic)。接口語義可分為接口函數(shù)功能(InterfaceFunction),前條件(ForwardCondition),后條件(AfterCondition)三部分描述。
InterfaceSemantic=[InterfaceFunction,F(xiàn)orwardCondition,AfterCondition]
定義3.3 實現(xiàn)(Implementation)。實現(xiàn)是滿足接口規(guī)范和語義描述的實例,它包括索引(Index)和實現(xiàn)體(ImplementationBody)兩個部分。
Implementation=[Index,ImplementationBody]
3 構件模型的應用
本構件模型對構件庫管理的支持是多方面,多角度的。理論上,它的提出就是為了更好地支持構件庫中構件的重用。實踐中,通過在網(wǎng)上信息收集系統(tǒng)構件庫中加入構件模型的支持,使以前難以實現(xiàn)的一些功能得以實現(xiàn),例如:基于語義的檢索,對構件組裝和演化的支持等。下面簡單介紹一下此模型在這些方面的支持機制。
3.1 如何支持構件的語義檢索
本模型支持構件的語義檢索。它從應用領域,功能,層次,表示方法,硬件環(huán)境,軟件環(huán)境,程序語言,復用度八個方面刻劃構件的特征。根據(jù)刻面的重要性和在網(wǎng)上信息收集系統(tǒng)構件庫中的實踐,筆者將各個方面的權值確定如表2。當檢索時,可以從除復用度之外的7個刻面輸入需求,然后計算出各個構件的匹配度,并且按照匹配度從高到低依次提供給構件檢索者。如果在輸入需求時沒有輸入某一刻面所需求的術語描述,則視為對這一刻面沒有要求,則這一刻面按完全匹配看待。
通過在網(wǎng)上信息收集系統(tǒng)構件庫中的應用,證明了在此模型的支持下構件的查準率和查全率都有了明顯的改善。更重要的是,這種查找支持了定量的語義匹配度查找。
3.2 如何支持構件組裝和演化
具體的組裝過程是由專門的組裝工具來實現(xiàn),此構件模型在網(wǎng)上信息收集系統(tǒng)構件庫中對構件組裝和演化的支持體現(xiàn)在提供構件組裝、演化的語境支持和組裝工具所需要的所有信息。
(1)分析作為組裝元素的構件的關系語境(ComponentRelationContext),可以得到此構件的組裝語境和演化語境。組裝語境刻劃的信息是如果使用某一構件去組裝,那么還必須使用哪些與此構件有關的其他構件來組裝。演化語境確定哪些構件與本構件演化有關,關聯(lián)的程度有多大,是否有必要也跟隨這個構件一起演化;演化語境還要確定演化后的構件與周圍構件的關系是否會發(fā)生變化,發(fā)生什么樣的變化等。
(2)提供接口、實現(xiàn)等信息給組裝工具,由組裝工具根據(jù)本構件模型所提供的信息實現(xiàn)組裝。例如構件模型中對構件接口的描述提供了構件接口的語法描述和語義描述,這些都是構件組裝時所必須的信息。
本文針對構件庫中構件的檢索、學習、組裝和演化,提出了一種構件模型。目的就是方便構件庫的管理并使構件的檢索、組裝和演化更加正確、自動。這一模型雖然在上述方面有所改進,但是它還處于對實用化構件模型的摸索階段,還有很多需要改進的地方。今后研究重點是對本構件模型的精簡,以及加強此模型對組裝和演化的支持,以實現(xiàn)組裝和演化的完全自動化。
參考文獻
1 WALINAUK B.The current state of CBSE.IEEE Software,1998;(15):37-46
2 Brown A.Large-scale component-based development.New jersey:Prentice Hall,Inc.,2000
3 邊小凡,朱建林,吳利明.基于構件的軟件開發(fā)方法在非成熟領域中的應用.河北大學學報(自然科學版),2005;(25)(增):108-110
4 賈 育,顧毓清.基于領域特征空間的構件語義表示方法.軟件學報,2002;13(2):311-316
5 王淵峰,張 涌,任洪敏等.基于刻面描述的構件檢索.軟件學報,2002;13(8):1546-1552
6 婁 健,邊小凡.教學評測與評估領域構件庫系統(tǒng)的設計與實現(xiàn).河北大學數(shù)學與計算機學院研究生論文集,2003