(合肥工業(yè)大學(xué) 計(jì)算機(jī)與信息學(xué)院, 合肥 230009)
摘 要:
針對(duì)構(gòu)件的變化性問題一直都是基于構(gòu)件的軟件工程(CBSE)中的一個(gè)關(guān)鍵問題,首先對(duì)構(gòu)件模型以及構(gòu)件匹配原則進(jìn)行形式化描述,構(gòu)造了構(gòu)件的接口關(guān)系矩陣;然后根據(jù)構(gòu)件匹配原則,對(duì)構(gòu)件接口關(guān)系矩陣進(jìn)行分析,動(dòng)態(tài)地檢測(cè)構(gòu)件的變化,判斷構(gòu)件變化可能會(huì)對(duì)其他相關(guān)構(gòu)件以及整個(gè)系統(tǒng)產(chǎn)生影響;最后實(shí)現(xiàn)了構(gòu)件變化分析的輔助工具CIDT(component interface detecting tool),并在軟件開發(fā)以及維護(hù)過程中使用CIDT對(duì)系統(tǒng)進(jìn)行動(dòng)態(tài)的檢測(cè)和分析。
關(guān)鍵詞:基于構(gòu)件的軟件工程; 構(gòu)件; 適應(yīng)性; 變化檢測(cè); 接口矩陣
中圖分類號(hào):TP311.56文獻(xiàn)標(biāo)志碼:A
文章編號(hào):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
基于構(gòu)件的軟件工程(CBSE)已成為一種被廣泛應(yīng)用的軟件工程模式。CBSE的根本目的是為了解決軟件危機(jī)問題,并促進(jìn)軟件的自動(dòng)化開發(fā)進(jìn)程。從目前的應(yīng)用現(xiàn)狀來看,基于構(gòu)件的軟件工程的優(yōu)點(diǎn)在于:a)大大提高了軟件的開發(fā)效率;b)提高了軟件(構(gòu)件)的可復(fù)用性;c)降低了軟件開發(fā)成本;d)提高了軟件的質(zhì)量。
在基于構(gòu)件的軟件開發(fā)過程中,構(gòu)件是開發(fā)的基本單元,新的軟件系統(tǒng)是通過對(duì)已有構(gòu)件的組裝和集成實(shí)現(xiàn)的,因此構(gòu)件的變化會(huì)對(duì)其他構(gòu)件以及整個(gè)系統(tǒng)產(chǎn)生影響。構(gòu)件變化的適應(yīng)性的檢測(cè)和相容性的判斷是解決構(gòu)件變化后系統(tǒng)正確性和穩(wěn)定性問題的有效辦法。
本文在對(duì)構(gòu)件模型以及構(gòu)件匹配原則進(jìn)行描述的同時(shí),構(gòu)造了構(gòu)件的接口關(guān)系矩陣,并通過接口關(guān)系矩陣來追蹤和檢測(cè)構(gòu)件動(dòng)態(tài)變化的影響范圍和構(gòu)件的相容情況。
1 相關(guān)研究情況
關(guān)于構(gòu)件的變化檢測(cè),研究者提出了多種方法和機(jī)制。文獻(xiàn)[1,2]中提出了一種符號(hào)級(jí)的構(gòu)件檢測(cè)機(jī)制,該機(jī)制通過定義參數(shù)流的語法,判斷每個(gè)參數(shù)在代碼中的執(zhí)行方式與順序來檢測(cè)構(gòu)件的適應(yīng)性。符號(hào)級(jí)的檢測(cè)方法可以準(zhǔn)確的判斷構(gòu)件接口參數(shù)對(duì)于構(gòu)件匹配的影響,但是該方法要求詳細(xì)的了解構(gòu)件內(nèi)部結(jié)構(gòu)和代碼,不適合黑盒以及灰盒構(gòu)件的檢測(cè)。文獻(xiàn)[3]通過構(gòu)件交互接口的靜態(tài)列表和鏈路來檢測(cè)軟件體系結(jié)構(gòu)中構(gòu)件動(dòng)態(tài)變化的適應(yīng)性,追蹤構(gòu)件變化的影響范圍。該方法為檢測(cè)構(gòu)件的動(dòng)態(tài)變化性提供了方便,但是由于一個(gè)構(gòu)件有多個(gè)接口,且在軟件中可能被不同的其他接口調(diào)用,因此,在該方法中需要對(duì)構(gòu)件接口使用的每種情況都建立一條鏈路或者列表,增加了檢測(cè)之前的工作量,不適應(yīng)大型系統(tǒng)的檢測(cè)。文獻(xiàn)[4]提出了軟件體系結(jié)構(gòu)的語義模型,并利用三種構(gòu)件適應(yīng)結(jié)構(gòu)來判斷構(gòu)件的適應(yīng)性。語義模型可以有效的檢測(cè)構(gòu)件之間的匹配關(guān)系,但是由于缺乏整體性,該模型不利于軟件體系結(jié)構(gòu)的整體分析。
2 構(gòu)件模型與構(gòu)件匹配原則
為了便于描述構(gòu)件以及構(gòu)件接口之間的關(guān)系,在本章中將對(duì)構(gòu)件、構(gòu)件接口以及構(gòu)件匹配原則進(jìn)行形式化的描述。
定義1 構(gòu)件。在CBSE中,構(gòu)件C=〈I,F(xiàn),S〉。其中:I={I1,I2,…,In}(n∈N)為構(gòu)件的接口集合,Ii(1≤i≤n)表示構(gòu)件C的第i個(gè)接口;F表示構(gòu)件C的功能函數(shù),F(xiàn)(i)與Ii(1≤i≤n)相對(duì)應(yīng),表示接口Ii的功能函數(shù);S={S1,S2,…,Sn}(n∈N),S為構(gòu)件C的狀態(tài)集合,每個(gè)方法F(i)均使構(gòu)件達(dá)到一個(gè)相應(yīng)的構(gòu)件狀態(tài),記為F(i)→Si。
定義2 接口。在構(gòu)件中,構(gòu)件接口I=〈IIn,Iout,DIn,Dout〉。其中:
IIn={P1,P2,…,Pk}(k∈N)表示接口I的輸入接口,{Pi}表示IIn的參數(shù)集合;
Iout={P1,P2,…,Ps}(s∈N)表示接口I的輸出接口,{Pi}表示Iout的參數(shù)集合;
DIn表示I的輸入接口IIn的接口約束集合;
Dout表示I的輸入接口Iout的接口約束集合。
為了方便表示,本文用param(IIn)表示接口I相應(yīng)的輸入接口參數(shù)集合,param(Iout)表示接口I的輸出接口參數(shù)集合;把一對(duì)相應(yīng)的輸入輸出接口記為〈IIn,Iout〉;構(gòu)件C的第i個(gè)接口記為C_Ii。
定義3 接口相同。對(duì)于任意的接口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。
在構(gòu)件組裝的過程中,相同的接口之間是可以相互替換的,具有相同使用接口的構(gòu)件也是可以替換的。
定義4 輸入匹配。對(duì)于任意的輸入接口IIn和輸出接口Iout,若(param(Iout)=param(IIn))∧(DoutDIn),則稱從接口輸出Iout到輸入接口IIn是輸入匹配的,記為IoutΔIIn。
定義5 接口匹配。對(duì)于任意的接口I1=〈IIn1,Iout1,DIn1,Dout1〉,I2=〈IIn2,Iout2,DIn2,Dout2〉,若存在Iout1ΔIIn2或Iout2ΔIIn1,則稱I1與I2或I2與I1是接口匹配的,記為I1→I2或I2→I1。
滿足接口匹配原則的接口之間是可以進(jìn)行組裝和連接的,接口匹配是構(gòu)件匹配的基礎(chǔ)。
定義6 構(gòu)件可連接性。對(duì)于構(gòu)件C1=〈IC1,F(xiàn)C1,SC1〉,C2=〈IC2,F(xiàn)C2,SC2〉,若存在一組接口Ii∈IC1,Ij∈IC2,滿足Ii→Ij,則稱構(gòu)件C1與C2可連接,C1與C2之間具有可連接性,記為C1→C2。
在基于構(gòu)件的軟件開發(fā)過程中,可以根據(jù)以上的構(gòu)件模型描述和構(gòu)件連接原則來判斷構(gòu)件之間的可組裝性,形成基本的軟件體系結(jié)構(gòu)。
3 構(gòu)件接口矩陣與分析
3.1 構(gòu)件關(guān)系分析
通過上文中提出的構(gòu)件模型描述以及相關(guān)連接原則,可以初步得到軟件系統(tǒng)的連接模型,利用有向圖的相關(guān)理論,將軟件模型中的每個(gè)構(gòu)件看做有向圖的一個(gè)節(jié)點(diǎn),構(gòu)件的連接看做有向邊,得到相應(yīng)的有向圖,即構(gòu)件關(guān)系圖。構(gòu)件關(guān)系圖表示了軟件體系結(jié)構(gòu)中各個(gè)構(gòu)件之間的連接關(guān)系。一個(gè)構(gòu)件關(guān)系圖可以表示為G=(C,E)。其中:C表示關(guān)系圖中各個(gè)構(gòu)件節(jié)點(diǎn),簡稱為節(jié)點(diǎn);E為圖中有向弧的集合。
定義7 構(gòu)件鄰接性。對(duì)于構(gòu)件Ci∈C、Cj∈C,若e∈E且e=(Ci,Cj),則表示構(gòu)件Ci與Cj相連。其中Ci的輸出接口與Cj的輸入接口相連,Ci為輸出構(gòu)件,Cj為輸入構(gòu)件。同時(shí)稱構(gòu)件Ci與Cj鄰接,表示為CiCj。為了方便區(qū)別鄰接構(gòu)件中的輸入/輸出關(guān)系,將從Ci到Cj稱為正向鄰接,從Cj到Ci稱為逆向鄰接。
構(gòu)件的鄰接性表示構(gòu)件關(guān)系圖中構(gòu)件之間的直接關(guān)系,當(dāng)某一構(gòu)件發(fā)生變化時(shí),最可能受影響的是與該構(gòu)件之間具有鄰接關(guān)系的構(gòu)件。
通過構(gòu)件模型的描述(定義1)可以知道,一個(gè)構(gòu)件包含多個(gè)構(gòu)件接口,不同的接口對(duì)應(yīng)了不同的功能,構(gòu)件之間是通過接口進(jìn)行連接的。構(gòu)件關(guān)系圖緊緊反映了構(gòu)件之間的關(guān)系,因此要準(zhǔn)確地對(duì)構(gòu)件進(jìn)行檢測(cè)就必須確定構(gòu)件接口的關(guān)系。
定義8 接口鄰接性。在構(gòu)件關(guān)系圖中,構(gòu)件Ci∈C,Cj∈C,Ci=〈ICi,F(xiàn)Ci,SCi〉,Cj=〈ICj,F(xiàn)Cj,SCj〉,若CiCj且接口Im∈ICi,In∈ICj是構(gòu)件間的連接的接口,則稱接口Im與In是鄰接接口,表示為ImIn,稱Ci與Cj時(shí)關(guān)于接口(Im,In)鄰接的;將從Im到In稱為正向鄰接,從In到Im稱為逆向鄰接。
定義9 接口連通性。在構(gòu)件關(guān)系圖中,構(gòu)件Ci∈C,Cj∈C,Ci=〈ICi,F(xiàn)Ci,SCi〉,Cj=〈ICj,F(xiàn)Cj,SCj〉,如果:
a)在構(gòu)件關(guān)系圖中至少存在一條路徑使得從Ci到Cj是可達(dá)的,即Ci…Cj;
b)Im∈ICi,In∈ICj分別為Ci,Cj的連接接口,即Im…In;
則稱Im與In是接口連通的,記為Im~I(xiàn)n,Im與In正向連通,In與Im逆向連通。
結(jié)論1 在軟件體系結(jié)構(gòu)S中,當(dāng)構(gòu)件Ci=〈ICi,F(xiàn)Ci,SCi〉的接口Im發(fā)生變化時(shí),在S中任意的構(gòu)件Cj=〈ICj,F(xiàn)Cj,SCj〉滿足: In∈ICj, ImIn或InIm, Im~I(xiàn)n或In~I(xiàn)m時(shí),構(gòu)件Cj將受到構(gòu)件Ci的影響。
3.2 構(gòu)件接口矩陣
為了便于討論,本文只考慮理想狀態(tài)下的構(gòu)件關(guān)系圖,即簡單有向無環(huán)圖。
本文在3.1節(jié)中闡述了構(gòu)件關(guān)系圖以及關(guān)系圖中構(gòu)件之間的關(guān)系和接口之間的關(guān)系。根據(jù)有向圖理論每個(gè)有向圖都與一個(gè)鄰接矩陣相對(duì)應(yīng)。在構(gòu)件關(guān)系圖中,關(guān)系圖的鄰接矩陣反映的是構(gòu)件之間的關(guān)系,為了準(zhǔn)確地反映構(gòu)件接口的關(guān)系,本文將根據(jù)接口關(guān)系和鄰接矩陣得出構(gòu)件的接口矩陣。
根據(jù)簡單有向圖理論可知構(gòu)件關(guān)系圖的鄰接矩陣可表示為A=(aij)。其中:
aij=1;從Ci到Cj是正向鄰接關(guān)系0;從Ci到Cj不是正向鄰接關(guān)系
圖1表示了一個(gè)構(gòu)件關(guān)系圖,G=(C,E)。
圖1的鄰接矩陣為
A=010000001100
000011000001
000000000000
本文的目的是要通過細(xì)化軟件體系結(jié)構(gòu)中構(gòu)件之間的關(guān)系,通過接口來確定構(gòu)件之間的相互影響。根據(jù)上文敘述的接口之間的關(guān)系,可以將構(gòu)件關(guān)系圖中的鄰接矩陣轉(zhuǎn)換為相應(yīng)的接口矩陣。
定義9 接口矩陣。設(shè)構(gòu)件關(guān)系圖為G=(C,E),C={C1,C2,…,Cn}(n∈N),B=(bij)為G的接口矩陣。其中:
bij=(Is,It); Is∈Icj,從Is到It是正向鄰接關(guān)系
(0,0);構(gòu)件Ci到Cj不是鄰接關(guān)系
接口矩陣反映了構(gòu)件中接口之間的鄰接關(guān)系。由構(gòu)件關(guān)系圖的鄰接矩陣和接口矩陣的定義可以看出,鄰接矩陣與接口矩陣是可以相互轉(zhuǎn)換的,鄰接矩陣中aij=0的位置對(duì)應(yīng)了接口矩陣中bij=(0 0);aij=1反映了接口矩陣中相應(yīng)的位置存在接口鄰接關(guān)系。
以圖1為例,假設(shè)圖1中鄰接構(gòu)件之間的接關(guān)系如下:
C1_I1C2_I1;
C2_I1C3_I1;
C2_I2C4_I1;
C3_I1C5_I1;
C3_I2C6_I1;
C4_I1C6_I2
有上述關(guān)系可以得到圖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 構(gòu)件變化檢測(cè)機(jī)制與工具實(shí)現(xiàn)
在CBSE中,構(gòu)件的變化是構(gòu)件內(nèi)部功能方法的變化。對(duì)于構(gòu)件C=〈I,F(xiàn),S〉,F(xiàn)(i)對(duì)應(yīng)了一個(gè)特定的Ii(Ii∈I),構(gòu)件的變化是F(i)的變化,因此,構(gòu)件的變化可以映射到相應(yīng)的接口上。本文根據(jù)上述關(guān)系,在構(gòu)件發(fā)生變化時(shí),通過構(gòu)件關(guān)系圖以及構(gòu)件接口矩陣來檢測(cè)構(gòu)件變化的影響范圍,判斷構(gòu)件變化的相容性。
4.1 構(gòu)件變化檢測(cè)機(jī)制
本文在3.2節(jié)中定義了構(gòu)件關(guān)系圖和構(gòu)件接口矩陣。由構(gòu)件接口矩陣的定義可以知道,在接口矩陣中aij反映了從構(gòu)件i到構(gòu)件j的正向接口鄰接的關(guān)系,同時(shí)也反映了從構(gòu)件j到構(gòu)件i的逆向接口鄰接的關(guān)系。因此對(duì)于構(gòu)件接口矩陣有以下性質(zhì):a)接口矩陣的第i行的所有向量表示了構(gòu)件Ci的各個(gè)接口與其他構(gòu)件接口之間的正向鄰接關(guān)系;b)接口矩陣的第j列的所有向量表示了構(gòu)件Cj的各個(gè)接口與其他構(gòu)件接口之間的逆向鄰接關(guān)系。
根據(jù)構(gòu)件接口矩陣的性質(zhì)以及構(gòu)件內(nèi)部特性,當(dāng)軟件體系結(jié)構(gòu)中構(gòu)件發(fā)生變化時(shí),可以通過對(duì)構(gòu)件接口矩陣的遍歷來檢測(cè)構(gòu)件變化對(duì)整個(gè)體系結(jié)構(gòu)產(chǎn)生的影響,具體檢測(cè)方法將在下文中具體介紹。
設(shè)構(gòu)件關(guān)系圖G=(C,E),C={C1,C2,…,Cn}(n∈N),構(gòu)件Ci=〈ICi,F(xiàn)Ci,SCi〉∈C,當(dāng)構(gòu)件Ci發(fā)生變化且對(duì)應(yīng)的變化接口為Ip∈ICi時(shí),則構(gòu)件變化的檢測(cè)方法如下:
a)由構(gòu)件關(guān)系圖的鄰接矩陣和構(gòu)件接口匹配關(guān)系得出構(gòu)件接口矩陣,B=(bij);
b)在構(gòu)件接口矩陣中,檢索第i行的向量bij=(Is,It)(j=1,2,…,n),找出Is=Ip的向量,即查找接口Ck_It,從Ck_It到Ip呈逆向鄰接關(guān)系,記接口集合為A-={Ck_It};
c)檢索第i列的向量bji=(Is,It)(j=1,2,…,n),找出It=Ip的向量,即查找接口Ck_Is,從Ck_Is到Ip呈正向鄰接關(guān)系,記為集合A-={Ck_Is};
d)重復(fù)b),找出與集合A-={Ck_It}中各個(gè)元素呈逆向鄰接關(guān)系的構(gòu)件接口,放入A-={Ck_It}中;
e)重復(fù)c),找出與集合A+={Ck_Is}中各個(gè)元素呈正向鄰接關(guān)系的構(gòu)件接口,放入A+={Ck_Is}中。
根據(jù)構(gòu)件接口矩陣的性質(zhì),在檢索后的集合中,Ip與A-中的元素Ck_It為正向連通關(guān)系,Ip與集合A+中元素Ck_Is呈逆向連通關(guān)系(圖2),集合C*=A+∪Ci∪A-是構(gòu)件Ci的接口Ip變化后影響的范圍。
在上述檢測(cè)方法中,構(gòu)件集合C*是原系統(tǒng)構(gòu)件的子集,即C*C。因此,可以得到G*=(C*,E*)是圖G=(C,E)的子圖,由G*中構(gòu)件構(gòu)成的系統(tǒng)是原系統(tǒng)的一個(gè)子系統(tǒng)。所以當(dāng)構(gòu)件發(fā)生變化后,判斷系統(tǒng)的正確性以及構(gòu)件變化帶來的影響等價(jià)于判斷由C*構(gòu)成的子系統(tǒng)的正確性,這就避免了以往構(gòu)件變化后需要對(duì)整個(gè)系統(tǒng)或者系統(tǒng)中一個(gè)較大范圍進(jìn)行檢測(cè)的情況。
4.2 構(gòu)件變化檢測(cè)工具CIDT的實(shí)現(xiàn)
在上述理論的基礎(chǔ)上,本文開發(fā)了相應(yīng)構(gòu)件變化檢測(cè)工具CIDT,并將CIDT在安徽省科技計(jì)劃網(wǎng)上申報(bào)評(píng)審系統(tǒng)的開發(fā)中進(jìn)行了應(yīng)用。CIDT主要由三個(gè)功能部分組成,即構(gòu)件匹配判斷模塊(CIM)、構(gòu)件接口關(guān)系生成模塊(CIR)和構(gòu)件變化追蹤模塊(CID)。CIDT結(jié)構(gòu)如圖3所示。
CIDT主要有以下功能:a)根據(jù)輸入的構(gòu)件來判斷構(gòu)件間的匹配關(guān)系;b)根據(jù)已有的匹配關(guān)系產(chǎn)生軟件體系結(jié)構(gòu)中構(gòu)件關(guān)系模型,并產(chǎn)生相應(yīng)的構(gòu)件接口矩陣;c)構(gòu)件發(fā)生變化時(shí),對(duì)變化進(jìn)行追蹤,檢測(cè)變化的影響范圍,產(chǎn)生受影響的構(gòu)件列表。在CIDT中為了方便建模引入了UML模型,并利用Rational ROSE工具對(duì)軟件體系結(jié)構(gòu)進(jìn)行UML建模。
5 結(jié)束語
本文通過對(duì)構(gòu)件的形式描述,引入構(gòu)件接口矩陣來表示軟件體系結(jié)構(gòu)中構(gòu)件之間的接口關(guān)系。當(dāng)構(gòu)件發(fā)生變化時(shí),本文利用接口矩陣提出了一種新的構(gòu)件變化檢測(cè)方法。該方法在已有方法的基礎(chǔ)上更精確地確定了構(gòu)件變化的影響范圍,為解決CBSE中構(gòu)件變化帶來的軟件一致性問題和軟件測(cè)試提供了參考。
參考文獻(xiàn):
[1]胡海洋,呂建,馬曉星,等.面向?qū)ο蠓缎腕w系結(jié)構(gòu)中構(gòu)件行為相容性研究[J].軟件學(xué)報(bào),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]楚旺,錢德沛.以體系結(jié)構(gòu)為中心的構(gòu)件模型的形式化語義[J].軟件學(xué)報(bào),2006,17(6):1287-1297.
[6]孫瑩,陳松喬.接口連接式構(gòu)件組裝的一種形式化方法[J].計(jì)算機(jī)科學(xué),2007,33(7):253-256.
[7]柯堯,趙保華,屈玉貴.基于組件系統(tǒng)的可靠性分析[J].北京郵電大學(xué)學(xué)報(bào),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.