王 超 陳云閣 張永勝
(海軍大連艦艇學(xué)院 大連 116018)
在軟件生存周期的各個階段中,軟件維護(hù)是公認(rèn)容易被忽視的活動,而事實上,軟件維護(hù)是軟件生存周期中需要資源最多的一個階段,現(xiàn)有資料表明,軟件系統(tǒng)整個生存周期中總成本的40%到70%要用于軟件維護(hù)[1~3]。
由于修改程序和評價軟件修改所引起的潛在連鎖反應(yīng)通常需要大量的軟件維護(hù)工作,因此軟件的可修改性被看作是軟件可維護(hù)性的一個主要屬性[4]。雖然軟件的可維護(hù)性己經(jīng)開始引起業(yè)界的重視,并且己有一定的研究,但僅有少量的文獻(xiàn)論述了軟件可維護(hù)性中的軟件可修改性[5~7],因此,對艦艇作戰(zhàn)軟件的可修改性開展深入的研究是非常有必要的。
軟件可修改性通常被解釋成修改構(gòu)件或者程序的難易程度[8]。因為軟件可修改性往往會與構(gòu)件之間的關(guān)聯(lián)反應(yīng)相關(guān),該特性可以看作是對軟件變更導(dǎo)致的連鎖反應(yīng)的評價,由此可知,軟件可修改性實質(zhì)上主要取決于軟件變更時構(gòu)件之間的關(guān)聯(lián)度。
根據(jù)艦艇作戰(zhàn)軟件的工作實際,決定艦艇作戰(zhàn)軟件修改難易程度的關(guān)鍵原因,是在依據(jù)軟件變更需求對某個軟件構(gòu)件實施修改時,其他軟件構(gòu)件需要同步進(jìn)行變更,即所謂的“波及效應(yīng)”[9~10],產(chǎn)生的主要原因則來源于軟件構(gòu)件間的關(guān)聯(lián)性。因此,在開展艦艇作戰(zhàn)軟件可修改性評估工作時,可以從度量軟件構(gòu)件的關(guān)聯(lián)性著手,定量評估軟件構(gòu)件的關(guān)聯(lián)度,計算構(gòu)件的可修改性,最終實現(xiàn)整個軟件可修改性的評估。
可修改性代表了軟件容易修改的程度,一個易修改的軟件應(yīng)該是內(nèi)部關(guān)聯(lián)關(guān)系清晰且容易理解的[11]。軟件內(nèi)部的關(guān)聯(lián)度主要依賴于構(gòu)件之間的耦合性、內(nèi)聚性等因素。
其中,耦合是構(gòu)件之間互相連接的緊密程度的度量,構(gòu)件之間的連接越緊密,聯(lián)系越多,耦合性就越高,其構(gòu)件獨立性就越弱。
軟件構(gòu)件之間的常見的耦合方式有九種,構(gòu)成耦合的九種類型[12],包括外部耦合、引入耦合、類型使用耦合、程調(diào)用耦合、數(shù)據(jù)耦合、標(biāo)記耦合、控制耦合、公共耦合、內(nèi)容耦合,按照耦合性從松散到緊密的程度由低至高排列,如圖1所示。

圖1 耦合類型及與構(gòu)件關(guān)聯(lián)度之間關(guān)系
內(nèi)聚是構(gòu)件內(nèi)部各個元素之間彼此結(jié)合緊密程度的度量[13]。一個構(gòu)件內(nèi)部各個元素之間的聯(lián)系越緊密,其內(nèi)聚性越高。軟件構(gòu)件之間常見的內(nèi)聚方式有七種,包括實用程序內(nèi)聚、時間內(nèi)聚、過程內(nèi)聚、順序內(nèi)聚、通信內(nèi)聚、層內(nèi)聚、功能內(nèi)聚,如圖2所示。

圖2 內(nèi)聚類型及與構(gòu)件關(guān)聯(lián)度之間的關(guān)系
根據(jù)軟件構(gòu)件關(guān)聯(lián)性影響因素的分析,為實現(xiàn)軟件構(gòu)件關(guān)聯(lián)度的定量度量,首先應(yīng)識別出影響軟件構(gòu)件關(guān)聯(lián)性的關(guān)鍵變量,然后依據(jù)關(guān)鍵變量的種類、個數(shù)與其他構(gòu)件的相關(guān)程度,來來評估該構(gòu)件的修改難度系數(shù)。
圖3 為軟件可修改性評估的基本思路。通過對軟件代碼的掃描進(jìn)行代碼詞法分析和語法分析,識別出軟件的內(nèi)部結(jié)構(gòu),包括軟件構(gòu)件內(nèi)部的控制流和數(shù)據(jù)流,統(tǒng)計所有的關(guān)鍵變量,計算各個軟件構(gòu)件的關(guān)聯(lián)度量化值,進(jìn)而計算構(gòu)件和軟件的可修改性。

圖3 軟件可修改性計算的基本思路
1)確定關(guān)聯(lián)元
關(guān)聯(lián)元是軟件構(gòu)件中能夠傳遞關(guān)聯(lián)關(guān)系的變量。對于構(gòu)件P 來說,假設(shè)存在一行賦值語句,賦值代碼中某個賦值運算符的左邊是構(gòu)件P 的扇出元,右邊是變量m,則稱m 為關(guān)聯(lián)元。根據(jù)程序的語法規(guī)則,在軟件代碼掃描的過程中可以識別出構(gòu)件的關(guān)聯(lián)元。
2)構(gòu)件關(guān)聯(lián)元關(guān)聯(lián)程度的評價
假設(shè)構(gòu)件P1有一個關(guān)聯(lián)元m,m 通過數(shù)據(jù)流或控制流關(guān)聯(lián)影響到另一構(gòu)件P2的扇入元β ,導(dǎo)致構(gòu)件P2可能進(jìn)一步將這種關(guān)聯(lián)關(guān)系延伸到別的構(gòu)件。這種由于相互關(guān)聯(lián)給構(gòu)件P2帶來程序修改的難度,稱為構(gòu)件關(guān)聯(lián)元的關(guān)聯(lián)程度。構(gòu)件關(guān)聯(lián)元關(guān)聯(lián)程度的評價通過搜索構(gòu)件P2的扇出元數(shù)量、計算構(gòu)件內(nèi)部復(fù)雜度來實現(xiàn)。
3)構(gòu)件與軟件可修改性的評估
構(gòu)件的可修改性根據(jù)該構(gòu)件平均每個關(guān)聯(lián)元造成的傳遞性修改難度來確定,通過綜合各個構(gòu)件可修改性來實現(xiàn)整個軟件系統(tǒng)的可修改性評估。
根據(jù)軟件可修改性評估的思路和原理,建立了軟件可修改性的評估模型。
1)構(gòu)件P 的原始關(guān)聯(lián)度評估:

其中,F(xiàn)P是構(gòu)件P 的扇出元個數(shù),CP是構(gòu)件P 量化的內(nèi)部復(fù)雜性,可以采用經(jīng)典的McCabe 方法計算。
2)關(guān)聯(lián)元m(m ∈P)關(guān)聯(lián)影響構(gòu)件Q 的次數(shù):

其中,β 可能是普通變量或數(shù)據(jù)結(jié)構(gòu)變量。
在分析關(guān)聯(lián)元對外傳遞產(chǎn)生關(guān)聯(lián)關(guān)系的時候發(fā)現(xiàn),一個關(guān)聯(lián)元對其它構(gòu)件產(chǎn)生關(guān)聯(lián)影響的次數(shù)是不同的,可能是一次,也可能是多次,具有不同的關(guān)聯(lián)影響效果,因此,計算軟件關(guān)聯(lián)程度時需要統(tǒng)計關(guān)聯(lián)元影響構(gòu)件的次數(shù)。
3)關(guān)聯(lián)元累積的綜合關(guān)聯(lián)度:

其中,NPm是指受關(guān)聯(lián)元m 關(guān)聯(lián)影響的所有構(gòu)件。
一個關(guān)聯(lián)元有可能會關(guān)聯(lián)影響到某個構(gòu)件的多個扇出元,而各扇出元又可能同時對多個構(gòu)件造成傳遞的關(guān)聯(lián)影響,因此,一個關(guān)聯(lián)元累積的綜合關(guān)聯(lián)度是由關(guān)聯(lián)影響構(gòu)件的次數(shù)和構(gòu)件的原始關(guān)聯(lián)度共同決定的。
4)RSP:構(gòu)件P 的軟件修改難度:

構(gòu)件的修改難度可以根據(jù)該構(gòu)件平均每個關(guān)聯(lián)元造成的傳遞性修改難度來確定,其中,TP是構(gòu)件P 關(guān)聯(lián)元的數(shù)量,E 是代表經(jīng)驗系數(shù)的常量,1 ≥RSP≥0,RSP=0 表示構(gòu)件P 的修改難度最小,RSP=1表示構(gòu)件P 的修改難度最大。
5)MP:構(gòu)件P 的可修改性:

MP=0 表示構(gòu)件P 具有最差的可修改性,MP=1表示構(gòu)件P 具有最好的可修改性。
6)M :整個軟件的可修改性:

其中,CNS 表示軟件構(gòu)件數(shù)量,M 的值域同MP。
基于軟件可修改性評估的原理,我們設(shè)計并實現(xiàn)了一個軟件可修改性自動評估的系統(tǒng)。系統(tǒng)的體系結(jié)構(gòu)如圖4 所示,主要由軟件靜態(tài)分析組件和可修改性度量組件組成。
為實現(xiàn)軟件可修改性的度量,首先需要對軟件的源代碼進(jìn)行靜態(tài)分析,通過詞法分析和語法分析識別、分析出軟件代碼的基礎(chǔ)架構(gòu)信息和數(shù)據(jù)控制信息。該組件主要由源代碼關(guān)鍵字匹配器、源程序語法分析器和程序信息庫構(gòu)成。
1)源代碼語句模式匹配器:通過詞法分析并經(jīng)過語句模式匹配,識別代碼的語句類型,將源程序細(xì)分為若干個程序塊,進(jìn)行分類存儲。
2)源代碼語法識別器:根據(jù)程序的語法規(guī)則,構(gòu)造用于識別軟件控制信息和數(shù)據(jù)信息的有限自動機(jī),并在語句模式匹配的基礎(chǔ)上,調(diào)用相應(yīng)類型的有限自動機(jī)對源代碼語法信息進(jìn)行識別和分析。
3)源代碼信息庫:將語法識別器分析出來的軟件信息按照可修改性度量的需要進(jìn)行篩選和存儲。
可修改性度量組件以軟件靜態(tài)分析數(shù)據(jù)為基礎(chǔ),采用軟件可修改性評估模型對軟件可修改性進(jìn)行計算。該組件主要包括代碼關(guān)聯(lián)程度分析器、構(gòu)件復(fù)雜度度量器和可修改性解算器。
1)代碼關(guān)聯(lián)程度分析器:運用源代碼信息庫數(shù)據(jù),對軟件構(gòu)件之間由于耦合性而引起的關(guān)聯(lián)關(guān)系進(jìn)行分析,建立構(gòu)件關(guān)聯(lián)關(guān)系影響鏈圖。
2)構(gòu)件復(fù)雜度計算器:在軟件靜態(tài)分析的基礎(chǔ)上,使用經(jīng)典的McCabe 方法計算構(gòu)件的內(nèi)部復(fù)雜度。
3)可修改性解算器:在構(gòu)件關(guān)聯(lián)程度分析和復(fù)雜度度量基礎(chǔ)上,運用3.3 節(jié)建立的軟件可修改性評估模型計算構(gòu)件和軟件的可修改屬性值。

圖4 軟件可修改性評估系統(tǒng)體系結(jié)構(gòu)
依據(jù)軟件可修改性評估系統(tǒng),對多個軟件項目進(jìn)行了測試,結(jié)果表明系統(tǒng)解算的軟件可修改性度量值與人工分析一致,說明提出的軟件可修改性評估方法對于軟件項目具有一定的實用性和可操作性,為軟件可修改性的驗證提供了途徑。
此外,通過實施軟件可修改性評估,能夠在軟件開發(fā)階段就對今后軟件修改的難易程度進(jìn)行預(yù)測,并根據(jù)預(yù)測結(jié)果,對軟件產(chǎn)品和過程進(jìn)行改進(jìn),對于提高軟件質(zhì)量、減少下一步軟件維護(hù)階段所占用的資源,將發(fā)揮積極有效的作用。