(合肥工業大學 計算機與信息學院, 合肥 230009)
摘 要:
針對構件的變化性問題一直都是基于構件的軟件工程(CBSE)中的一個關鍵問題,首先對構件模型以及構件匹配原則進行形式化描述,構造了構件的接口關系矩陣;然后根據構件匹配原則,對構件接口關系矩陣進行分析,動態地檢測構件的變化,判斷構件變化可能會對其他相關構件以及整個系統產生影響;最后實現了構件變化分析的輔助工具CIDT(component interface detecting tool),并在軟件開發以及維護過程中使用CIDT對系統進行動態的檢測和分析。
關鍵詞:基于構件的軟件工程; 構件; 適應性; 變化檢測; 接口矩陣
中圖分類號:TP311.56文獻標志碼:A
文章編號:1001-3695(2009)04-1360-03
Interface matrix-based detecting method for change of component
LI Xin-ke, YAN Lu-ming
(Institute of Computer Information, Hefei University of Technology, Hefei 230009, China)
Abstract:This paper analyzed the change of component in the system, and estimated the impact on both the correlative component and the whole system. Firstly described the component model and adaptation principle in formal specification, and then constructed the connection matrix of component interface. According to the above information, developed a tool CIDT, which was used in CBSE to analyze the incidence of the changed component.
Key words:CBSE; component; adaptation; detecting of change; interface matrix
基于構件的軟件工程(CBSE)已成為一種被廣泛應用的軟件工程模式。CBSE的根本目的是為了解決軟件危機問題,并促進軟件的自動化開發進程。從目前的應用現狀來看,基于構件的軟件工程的優點在于:a)大大提高了軟件的開發效率;b)提高了軟件(構件)的可復用性;c)降低了軟件開發成本;d)提高了軟件的質量。
在基于構件的軟件開發過程中,構件是開發的基本單元,新的軟件系統是通過對已有構件的組裝和集成實現的,因此構件的變化會對其他構件以及整個系統產生影響。構件變化的適應性的檢測和相容性的判斷是解決構件變化后系統正確性和穩定性問題的有效辦法。
本文在對構件模型以及構件匹配原則進行描述的同時,構造了構件的接口關系矩陣,并通過接口關系矩陣來追蹤和檢測構件動態變化的影響范圍和構件的相容情況。
1 相關研究情況
關于構件的變化檢測,研究者提出了多種方法和機制。文獻[1,2]中提出了一種符號級的構件檢測機制,該機制通過定義參數流的語法,判斷每個參數在代碼中的執行方式與順序來檢測構件的適應性。符號級的檢測方法可以準確的判斷構件接口參數對于構件匹配的影響,但是該方法要求詳細的了解構件內部結構和代碼,不適合黑盒以及灰盒構件的檢測。文獻[3]通過構件交互接口的靜態列表和鏈路來檢測軟件體系結構中構件動態變化的適應性,追蹤構件變化的影響范圍。該方法為檢測構件的動態變化性提供了方便,但是由于一個構件有多個接口,且在軟件中可能被不同的其他接口調用,因此,在該方法中需要對構件接口使用的每種情況都建立一條鏈路或者列表,增加了檢測之前的工作量,不適應大型系統的檢測。文獻[4]提出了軟件體系結構的語義模型,并利用三種構件適應結構來判斷構件的適應性。語義模型可以有效的檢測構件之間的匹配關系,但是由于缺乏整體性,該模型不利于軟件體系結構的整體分析。
2 構件模型與構件匹配原則
為了便于描述構件以及構件接口之間的關系,在本章中將對構件、構件接口以及構件匹配原則進行形式化的描述。
定義1 構件。在CBSE中,構件C=〈I,F,S〉。其中:I={I1,I2,…,In}(n∈N)為構件的接口集合,Ii(1≤i≤n)表示構件C的第i個接口;F表示構件C的功能函數,F(i)與Ii(1≤i≤n)相對應,表示接口Ii的功能函數;S={S1,S2,…,Sn}(n∈N),S為構件C的狀態集合,每個方法F(i)均使構件達到一個相應的構件狀態,記為F(i)→Si。
定義2 接口。在構件中,構件接口I=〈IIn,Iout,DIn,Dout〉。其中:
IIn={P1,P2,…,Pk}(k∈N)表示接口I的輸入接口,{Pi}表示IIn的參數集合;
Iout={P1,P2,…,Ps}(s∈N)表示接口I的輸出接口,{Pi}表示Iout的參數集合;
DIn表示I的輸入接口IIn的接口約束集合;
Dout表示I的輸入接口Iout的接口約束集合。
為了方便表示,本文用param(IIn)表示接口I相應的輸入接口參數集合,param(Iout)表示接口I的輸出接口參數集合;把一對相應的輸入輸出接口記為〈IIn,Iout〉;構件C的第i個接口記為C_Ii。
定義3 接口相同。對于任意的接口I1=〈IIn1,Iout1,DIn1,Dout1〉,I2=〈IIn2,Iout2,DIn2,Dout2〉,若(param(IIn1)=param(IIn2))∧(param(Iout1)= param(Iout2))∧(DIn1=DIn2)∧(Dout1=Dout2),則稱接口I1與I2相同,記為I1≡I2。
在構件組裝的過程中,相同的接口之間是可以相互替換的,具有相同使用接口的構件也是可以替換的。
定義4 輸入匹配。對于任意的輸入接口IIn和輸出接口Iout,若(param(Iout)=param(IIn))∧(DoutDIn),則稱從接口輸出Iout到輸入接口IIn是輸入匹配的,記為IoutΔIIn。
定義5 接口匹配。對于任意的接口I1=〈IIn1,Iout1,DIn1,Dout1〉,I2=〈IIn2,Iout2,DIn2,Dout2〉,若存在Iout1ΔIIn2或Iout2ΔIIn1,則稱I1與I2或I2與I1是接口匹配的,記為I1→I2或I2→I1。
滿足接口匹配原則的接口之間是可以進行組裝和連接的,接口匹配是構件匹配的基礎。
定義6 構件可連接性。對于構件C1=〈IC1,FC1,SC1〉,C2=〈IC2,FC2,SC2〉,若存在一組接口Ii∈IC1,Ij∈IC2,滿足Ii→Ij,則稱構件C1與C2可連接,C1與C2之間具有可連接性,記為C1→C2。
在基于構件的軟件開發過程中,可以根據以上的構件模型描述和構件連接原則來判斷構件之間的可組裝性,形成基本的軟件體系結構。
3 構件接口矩陣與分析
3.1 構件關系分析
通過上文中提出的構件模型描述以及相關連接原則,可以初步得到軟件系統的連接模型,利用有向圖的相關理論,將軟件模型中的每個構件看做有向圖的一個節點,構件的連接看做有向邊,得到相應的有向圖,即構件關系圖。構件關系圖表示了軟件體系結構中各個構件之間的連接關系。一個構件關系圖可以表示為G=(C,E)。其中:C表示關系圖中各個構件節點,簡稱為節點;E為圖中有向弧的集合。
定義7 構件鄰接性。對于構件Ci∈C、Cj∈C,若e∈E且e=(Ci,Cj),則表示構件Ci與Cj相連。其中Ci的輸出接口與Cj的輸入接口相連,Ci為輸出構件,Cj為輸入構件。同時稱構件Ci與Cj鄰接,表示為CiCj。為了方便區別鄰接構件中的輸入/輸出關系,將從Ci到Cj稱為正向鄰接,從Cj到Ci稱為逆向鄰接。
構件的鄰接性表示構件關系圖中構件之間的直接關系,當某一構件發生變化時,最可能受影響的是與該構件之間具有鄰接關系的構件。
通過構件模型的描述(定義1)可以知道,一個構件包含多個構件接口,不同的接口對應了不同的功能,構件之間是通過接口進行連接的。構件關系圖緊緊反映了構件之間的關系,因此要準確地對構件進行檢測就必須確定構件接口的關系。
定義8 接口鄰接性。在構件關系圖中,構件Ci∈C,Cj∈C,Ci=〈ICi,FCi,SCi〉,Cj=〈ICj,FCj,SCj〉,若CiCj且接口Im∈ICi,In∈ICj是構件間的連接的接口,則稱接口Im與In是鄰接接口,表示為ImIn,稱Ci與Cj時關于接口(Im,In)鄰接的;將從Im到In稱為正向鄰接,從In到Im稱為逆向鄰接。
定義9 接口連通性。在構件關系圖中,構件Ci∈C,Cj∈C,Ci=〈ICi,FCi,SCi〉,Cj=〈ICj,FCj,SCj〉,如果:
a)在構件關系圖中至少存在一條路徑使得從Ci到Cj是可達的,即Ci…Cj;
b)Im∈ICi,In∈ICj分別為Ci,Cj的連接接口,即Im…In;
則稱Im與In是接口連通的,記為Im~In,Im與In正向連通,In與Im逆向連通。
結論1 在軟件體系結構S中,當構件Ci=〈ICi,FCi,SCi〉的接口Im發生變化時,在S中任意的構件Cj=〈ICj,FCj,SCj〉滿足: In∈ICj, ImIn或InIm, Im~In或In~Im時,構件Cj將受到構件Ci的影響。
3.2 構件接口矩陣
為了便于討論,本文只考慮理想狀態下的構件關系圖,即簡單有向無環圖。
本文在3.1節中闡述了構件關系圖以及關系圖中構件之間的關系和接口之間的關系。根據有向圖理論每個有向圖都與一個鄰接矩陣相對應。在構件關系圖中,關系圖的鄰接矩陣反映的是構件之間的關系,為了準確地反映構件接口的關系,本文將根據接口關系和鄰接矩陣得出構件的接口矩陣。
根據簡單有向圖理論可知構件關系圖的鄰接矩陣可表示為A=(aij)。其中:
aij=1;從Ci到Cj是正向鄰接關系0;從Ci到Cj不是正向鄰接關系
圖1表示了一個構件關系圖,G=(C,E)。
圖1的鄰接矩陣為
A=010000001100
000011000001
000000000000
本文的目的是要通過細化軟件體系結構中構件之間的關系,通過接口來確定構件之間的相互影響。根據上文敘述的接口之間的關系,可以將構件關系圖中的鄰接矩陣轉換為相應的接口矩陣。
定義9 接口矩陣。設構件關系圖為G=(C,E),C={C1,C2,…,Cn}(n∈N),B=(bij)為G的接口矩陣。其中:
bij=(Is,It); Is∈Icj,從Is到It是正向鄰接關系
(0,0);構件Ci到Cj不是鄰接關系
接口矩陣反映了構件中接口之間的鄰接關系。由構件關系圖的鄰接矩陣和接口矩陣的定義可以看出,鄰接矩陣與接口矩陣是可以相互轉換的,鄰接矩陣中aij=0的位置對應了接口矩陣中bij=(0 0);aij=1反映了接口矩陣中相應的位置存在接口鄰接關系。
以圖1為例,假設圖1中鄰接構件之間的接關系如下:
C1_I1C2_I1;
C2_I1C3_I1;
C2_I2C4_I1;
C3_I1C5_I1;
C3_I2C6_I1;
C4_I1C6_I2
有上述關系可以得到圖1的接口矩陣為
B=
(0 0)(I1 I1)(0 0)(0 0)(0 0)(0 0)
(0 0)(0 0)(I1I1)(I2I1)(0 0)(0 0)
(0 0)(0 0)(0 0)(0 0)(I1I1)(I2I1)(I2I1)
(0 0)(0 0)(0 0)(0 0)(0 0)(I1I2)
(0 0)(0 0)(0 0)(0 0)(0 0)(0 0)
(0 0)(0 0)(0 0)(0 0)(0 0)(0 0)
4 構件變化檢測機制與工具實現
在CBSE中,構件的變化是構件內部功能方法的變化。對于構件C=〈I,F,S〉,F(i)對應了一個特定的Ii(Ii∈I),構件的變化是F(i)的變化,因此,構件的變化可以映射到相應的接口上。本文根據上述關系,在構件發生變化時,通過構件關系圖以及構件接口矩陣來檢測構件變化的影響范圍,判斷構件變化的相容性。
4.1 構件變化檢測機制
本文在3.2節中定義了構件關系圖和構件接口矩陣。由構件接口矩陣的定義可以知道,在接口矩陣中aij反映了從構件i到構件j的正向接口鄰接的關系,同時也反映了從構件j到構件i的逆向接口鄰接的關系。因此對于構件接口矩陣有以下性質:a)接口矩陣的第i行的所有向量表示了構件Ci的各個接口與其他構件接口之間的正向鄰接關系;b)接口矩陣的第j列的所有向量表示了構件Cj的各個接口與其他構件接口之間的逆向鄰接關系。
根據構件接口矩陣的性質以及構件內部特性,當軟件體系結構中構件發生變化時,可以通過對構件接口矩陣的遍歷來檢測構件變化對整個體系結構產生的影響,具體檢測方法將在下文中具體介紹。
設構件關系圖G=(C,E),C={C1,C2,…,Cn}(n∈N),構件Ci=〈ICi,FCi,SCi〉∈C,當構件Ci發生變化且對應的變化接口為Ip∈ICi時,則構件變化的檢測方法如下:
a)由構件關系圖的鄰接矩陣和構件接口匹配關系得出構件接口矩陣,B=(bij);
b)在構件接口矩陣中,檢索第i行的向量bij=(Is,It)(j=1,2,…,n),找出Is=Ip的向量,即查找接口Ck_It,從Ck_It到Ip呈逆向鄰接關系,記接口集合為A-={Ck_It};
c)檢索第i列的向量bji=(Is,It)(j=1,2,…,n),找出It=Ip的向量,即查找接口Ck_Is,從Ck_Is到Ip呈正向鄰接關系,記為集合A-={Ck_Is};
d)重復b),找出與集合A-={Ck_It}中各個元素呈逆向鄰接關系的構件接口,放入A-={Ck_It}中;
e)重復c),找出與集合A+={Ck_Is}中各個元素呈正向鄰接關系的構件接口,放入A+={Ck_Is}中。
根據構件接口矩陣的性質,在檢索后的集合中,Ip與A-中的元素Ck_It為正向連通關系,Ip與集合A+中元素Ck_Is呈逆向連通關系(圖2),集合C*=A+∪Ci∪A-是構件Ci的接口Ip變化后影響的范圍。
在上述檢測方法中,構件集合C*是原系統構件的子集,即C*C。因此,可以得到G*=(C*,E*)是圖G=(C,E)的子圖,由G*中構件構成的系統是原系統的一個子系統。所以當構件發生變化后,判斷系統的正確性以及構件變化帶來的影響等價于判斷由C*構成的子系統的正確性,這就避免了以往構件變化后需要對整個系統或者系統中一個較大范圍進行檢測的情況。
4.2 構件變化檢測工具CIDT的實現
在上述理論的基礎上,本文開發了相應構件變化檢測工具CIDT,并將CIDT在安徽省科技計劃網上申報評審系統的開發中進行了應用。CIDT主要由三個功能部分組成,即構件匹配判斷模塊(CIM)、構件接口關系生成模塊(CIR)和構件變化追蹤模塊(CID)。CIDT結構如圖3所示。
CIDT主要有以下功能:a)根據輸入的構件來判斷構件間的匹配關系;b)根據已有的匹配關系產生軟件體系結構中構件關系模型,并產生相應的構件接口矩陣;c)構件發生變化時,對變化進行追蹤,檢測變化的影響范圍,產生受影響的構件列表。在CIDT中為了方便建模引入了UML模型,并利用Rational ROSE工具對軟件體系結構進行UML建模。
5 結束語
本文通過對構件的形式描述,引入構件接口矩陣來表示軟件體系結構中構件之間的接口關系。當構件發生變化時,本文利用接口矩陣提出了一種新的構件變化檢測方法。該方法在已有方法的基礎上更精確地確定了構件變化的影響范圍,為解決CBSE中構件變化帶來的軟件一致性問題和軟件測試提供了參考。
參考文獻:
[1]胡海洋,呂建,馬曉星,等.面向對象范型體系結構中構件行為相容性研究[J].軟件學報,2006,17(6):1276-1286.
[2]XIE Xiong, ZHANG Wei-shi. A checking mechanism ofsoftware component adaptation[C]//Proc of the 5th International Conference on Grid and Cooperative Computing(GCC 2006). Washington DC: IEEE Computer Society, 2006: 347-354.
[3]FENG Tie, MALETIC J I. Applying dynamic change impact analysis in component-based architecture design[C]//Proc of the 7th ACIS International Conference on Software Engineering, Artificial Intelligence, Networking, and Parallel/Distributed Computing. Washington DC: IEEE Computer Society, 2006: 43-48.
[4]BRANDON M, PERRY A. Spartacas: automating component reuse and adaptation[J]. IEEE Trans on Software Engineering, 2004,30(9):587-600.
[5]楚旺,錢德沛.以體系結構為中心的構件模型的形式化語義[J].軟件學報,2006,17(6):1287-1297.
[6]孫瑩,陳松喬.接口連接式構件組裝的一種形式化方法[J].計算機科學,2007,33(7):253-256.
[7]柯堯,趙保華,屈玉貴.基于組件系統的可靠性分析[J].北京郵電大學學報,2005,28(6):115-119.
[8]CRAIG D C, ZUBEREK W M. Verification of component behavioral compatibility[C]//Proc of the 2nd International Conference on Dependability of Computer Systems. Washington DC: IEEE Computer Society, 2007: 347-354.