亚洲狠狠干,亚洲国产福利精品一区二区,国产八区,激情文学亚洲色图

一種面向?qū)ο筌浖淖詣踊貥嫹椒ㄅc流程

文檔序號:12176421閱讀:517來源:國知局
一種面向?qū)ο筌浖淖詣踊貥嫹椒ㄅc流程

本發(fā)明涉及軟件質(zhì)量的改善技術領域,尤其涉及一種面向?qū)ο筌浖淖詣踊貥嫹椒ā?/p>



背景技術:

在軟件開發(fā)和維護的過程中,不斷變更的需求導致系統(tǒng)的原始設計架構被打破,使得結構越發(fā)混亂,代碼難以理解,軟件的重用和維護也變得越來越困難。軟件重構是改善軟件質(zhì)量的一種重要手段,它在不改變軟件外部行為特性的情況下,通過調(diào)整軟件內(nèi)部結構以提高軟件的可理解性、可維護性和可擴展性。然而,軟件重構是一項耗時且復雜的代碼調(diào)整活動,要求軟件開發(fā)人員對代碼整體進行感知,并針對“何處、何時以及如何”進行重構做出復雜的決策。因此,自動化重構技術作為降低重構成本、提高重構效果的重要途徑,可為開發(fā)人員提供決策的輔助支持,進而降低軟件重構難度。

“高內(nèi)聚、低耦合”是程序開發(fā)的重要指導準則,研究表明,該準則不僅可以將軟件變化引起的波及效應控制在比較小的范圍內(nèi),而且能夠減少后期軟件維護的成本。內(nèi)聚和耦合性問題能夠引起如下的代碼壞味道:

(1)依戀情結(Feature Envy):函數(shù)對某個類的依賴程度高于對自身所在類的依賴程度;

(2)狎昵關系(Inappropriate Intimacy):兩個類的函數(shù)調(diào)用或?qū)傩允褂藐P系過于親密;

(3)過大類(God Class):類包含的過多的函數(shù)和屬性,實現(xiàn)了過多功能,導致代碼的可理解性,可讀性變差。

開發(fā)人員可以通過搬移函數(shù)或?qū)傩缘脚c之依賴關系更緊密的類來去除依賴情結和狎昵關系,通過提煉類重構操作,將大類中功能內(nèi)聚性高的一部分方法和屬性提煉到一個新類中,從而分解類的責任。針對于搬移函數(shù)重構操作,Czibula等人在《Clustering Based Adaptive Refactoring》文中基于k-means聚類算法定義了實體與類之間的相似性距離,如果實體與其他類的相似性距離小于其自身類,則認為該實體是搬移操作的對象。Bowman等人利用多目標遺傳算法結合耦合性、內(nèi)聚性度量指標實現(xiàn)搬移函數(shù)重構,與其他啟發(fā)式搜索算法相比,多目標遺傳算法在迭代過程中可以修正次優(yōu)的重構建議。Han等人提出了最大依賴集合的概念,利用其可以自動化識別搬移函數(shù)重構建議來最大程度地提高軟件系統(tǒng)的可維護性。近期,Bavota等人提出了“Methodbook”的新算法用以移除依戀情結和狎昵關系的壞味道,結合語義和結構相似性度量指標共同評估函數(shù)之間的“友誼”,尋找到與每個函數(shù)關系最親密的類,作為搬移重構操作的目標類。Fokaefs等人基于層次聚類算法實現(xiàn)了自動化提煉類重構工具JDeodorant,該工具同時集成了Tsantalis提出的搬移函數(shù)重構算法,利用entity placement metric(EP)度量指標評估實體之間的耦合程度,進而以此作為指導原則對大類進行分解。Bavota等人利用最大流最小割算法來分解“God class”,該算法與圖論相結合,將語義緊密相關的函數(shù)和屬性提煉出來形成新類。然而,最大流最小割算法只能夠?qū)⒋箢惙殖蓛蓚€部分,而在實際應用過程中,“God class”可能同時實現(xiàn)了多于兩種功能,因此,利用該算法無法完美的進行分割操作。為了克服這個缺陷,Bavota等人實現(xiàn)了自動化重構工具ARIES,可將大類根據(jù)其自身結構,以“高內(nèi)聚、低耦合”為原則分解為多于兩個的新類。

上述算法只能實現(xiàn)單一的重構操作來改善系統(tǒng)的內(nèi)聚性,且提煉類重構操作均屬于半自動化的算法,需要開發(fā)人員手動輸入需要進行分解的大類,從而進行進一步的分析,具有一定的局限性。



技術實現(xiàn)要素:

針對現(xiàn)有技術的缺陷,本發(fā)明提供一種面向?qū)ο筌浖淖詣踊貥嫹椒?,從整個軟件系統(tǒng)全局內(nèi)聚性及耦合性角度出發(fā),結合語義相似性、結構相似性和層次聚類算法,同時生成搬移函數(shù)、搬移屬性和提煉類重構操作建議,對待重構軟件系統(tǒng)進行自動化重構,從而提高代碼的可理解性、可重用性和可維護性。

本發(fā)明提供一種面向?qū)ο筌浖淖詣踊貥嫹椒?,包括以下步驟:

步驟1:以類為節(jié)點、以類間依賴關系為邊,將待重構軟件系統(tǒng)構建為類級多層依賴有向網(wǎng)絡模型;

步驟2:進行重構預處理;根據(jù)類級多層依賴有向網(wǎng)絡模型,將非繼承體系類節(jié)點與繼承體系中的葉子節(jié)點提取出來,作為重構的對象;

步驟3:依次合并由非繼承體系節(jié)點與繼承體系中的葉子節(jié)點構成的類級網(wǎng)絡連通片,并且將每個類級網(wǎng)絡連通片轉(zhuǎn)換為同種類型的實體集合,實體包括方法和屬性兩種類型;

步驟4:分析每個實體集合元素之間的語義和結構耦合關系,得到相應耦合關系網(wǎng)絡,并對其加權求和,將實體集合構建成方法級耦合無向網(wǎng)絡模型;

語義耦合關系是指抽取每個方法的方法名、變量名及注釋構建成該方法的詞匯庫,根據(jù)潛在語義相似性算法,將每個方法轉(zhuǎn)化成對應的語義詞匯空間向量,計算向量之間的余弦夾角作為此函數(shù)對語義相似性的權值;

結構耦合關系包括共享屬性關系、方法調(diào)用關系和功能耦合關系;如果兩個方法同時使用了一個屬性,則它們之間存在共享屬性關系;當一個方法調(diào)用了另一個方法時,它們具有方法調(diào)用關系;若將方法體視為一個功能域,則兩個方法在同一個功能域中被執(zhí)行時,稱該方法對具有功能耦合關系;

步驟5:確定待重構軟件系統(tǒng)的方法級耦合無向網(wǎng)絡中節(jié)點間不同類型耦合關系權值的最優(yōu)系數(shù),為待重構軟件系統(tǒng)調(diào)節(jié)出一組最合適的系數(shù);

步驟6:依次遍歷每個方法級網(wǎng)絡,根據(jù)方法間的耦合強度,對每個方法級網(wǎng)絡進行社團劃分,從而得到待重構軟件系統(tǒng)的新的系統(tǒng)結構;

步驟7:將每個由聚類分析得到的方法社團視為一個類,對比新類與原始的結構,設定保證代碼行為的重構前提條件,從而生成搬移函數(shù)、搬移屬性和提煉類的重構建議;

步驟8:按照生成的搬移函數(shù)、搬移屬性和提煉類重構建議對待重構軟件系統(tǒng)執(zhí)行重構操作。

進一步地,所述步驟1具體包括如下步驟:

步驟1.1:讀取待重構軟件系統(tǒng)編譯后的jar包,通過掃描分析語法分析樹結構,解析出待重構軟件系統(tǒng)中類、模塊、接口、函數(shù)、屬性和它們之間的依賴關系,過濾掉編譯文件中包含的Java虛擬機中的工具類和方法,只保留待重構軟件系統(tǒng)自身的類;

步驟1.2:讀取待重構軟件系統(tǒng)的源文件,抽取源文件中每個方法的變量名、方法名和注釋的語義信息,構建每個方法所對應的詞匯庫;

步驟1.3:分別構建以類為節(jié)點、類繼承關系為邊和類非繼承關系為邊的有向網(wǎng)絡模型,即類級繼承關系有向網(wǎng)絡和類非繼承關系有向網(wǎng)絡,有向網(wǎng)絡模型中的網(wǎng)絡層次之間的節(jié)點一一對應。

進一步地,所述步驟2具體包括如下步驟:

步驟2.1:遍歷類級繼承關系有向網(wǎng)絡模型中的每個節(jié)點,記錄其中所有入度大于零的類節(jié)點,并將其視為繼承體系中的非葉子節(jié)點;

步驟2.2:在非繼承關系有向網(wǎng)絡中依次移除繼承體系中的非葉子類節(jié)點以及與這些類相連接的邊,所得的剩余網(wǎng)絡只包含非繼承體系中的類節(jié)點以及繼承體系中的葉子節(jié)點。

進一步地,所述步驟3具體包括如下步驟:

步驟3.1:依次合并由非繼承體系節(jié)點與繼承體系中的葉子節(jié)點構成的類級網(wǎng)絡連通片,并且將每個類級網(wǎng)絡連通片轉(zhuǎn)換為一個實體(方法和屬性)集合;

步驟3.2:將集合中的屬性視為實現(xiàn)其自身存取操作的取值方法Getter()及賦值方法Setter(),即將集合中不同類型的元素轉(zhuǎn)化為同種類型。

進一步地,所述步驟4具體包括如下步驟:

步驟4.1:分別建立方法級語義耦合、共享屬性、方法調(diào)用及功能耦合關系加權無向網(wǎng)絡,具體確定方法如下,

步驟4.1.1:確定方法之間的語義耦合權值,得到方法級語義耦合關系網(wǎng)絡,根據(jù)步驟1.2抽取的每個方法的方法名、變量名和注釋,構建成方法的詞匯庫,根據(jù)潛在語義相似性算法,將任意方法mk轉(zhuǎn)化成對應的語義詞匯空間向量將方法向量之間的余弦夾角作為此方法對語義相似性的權值,即式(1);

其中,mi和mj分別表示兩個方法,SSW(mi,mj)表示方法mi和方法mj之間的語義耦合權值,和分別表示方法mi和mj對應的語義詞匯空間向量;

步驟4.1.2:確定方法之間的共享屬性耦合權值,即式(3),得到方法級共享屬性關系網(wǎng)絡;

其中,SAW(mi,mj)表示方法mi和mj之間的共享屬性耦合權值,Ai和Aj分別表示方法mi和mj使用的屬性集合;

步驟4.1.3:確定方法之間的方法調(diào)用耦合權值,即式(3),得到方法級方法調(diào)用關系網(wǎng)絡;

MIW(mi,mj)=max(MIWij,MIWji) (3)

其中,MIW(mi,mj)表示方法mi和mj之間的方法調(diào)用耦合權值,MIW(mi,mj)為MIWij與MIWji的最大值;MIWij表示方法mi調(diào)用mj的權值,如式(4)所示,MIWij等于I(mi,mj)與方法mj在軟件系統(tǒng)中被調(diào)用的總次數(shù)之比,MIWji表示方法mj調(diào)用mi的權值;I(mi,mj)表示方法mi調(diào)用方法mj的次數(shù),I(mk,mj)表示方法mi調(diào)用方法mj的次數(shù),n表示系統(tǒng)中的方法總數(shù);

步驟4.1.4:確定方法之間的方法功能耦合權值,即式(5),得到方法級功能耦合關系網(wǎng)絡;

其中,SEW(mi,mj)表示方法mi和mj之間的方法功能耦合權值,ETij表示方法mi和mj在同一個功能域中執(zhí)行的次數(shù),ETi和ETj分別表示方法mi和mj執(zhí)行的總次數(shù);

步驟4.2:將上述步驟4.1得到的方法級語義耦合、共享屬性、方法調(diào)用及功能耦合關系網(wǎng)絡的耦合權值加權求和,得到每對方法節(jié)點之間耦合關系的強度,即邊權值,從而得到方法級耦合無向網(wǎng)絡模型G=(V,E,Z),其中,V為方法節(jié)點集合,E為方法間耦合關系集合,Z為方法間耦合權值矩陣,Z=(zij)V|×|V|,zij為方法間耦合權值矩陣Z的矩陣的i行j列的元素,表示每對方法節(jié)點之間的邊權值,如式(6)所示;

zij=α×SAW(mi,mj)+β×MIW(mi,mj)+γ×SEW(mi,mj)+η×SSW(mi,mj) (6)

其中,α、β、γ和η分別表示方法級語義耦合、共享屬性、方法調(diào)用和功能耦合關系網(wǎng)絡的耦合權值系數(shù),α+β+γ+η=1。

進一步地,所述步驟5具體包括如下步驟:

步驟5.1:隨機選取待重構軟件系統(tǒng)中Np對內(nèi)聚度高于平均值且相互依賴的類對進行合并,Np等于系統(tǒng)中類總數(shù)的四分之一;

步驟5.2:將每一個人工合并而成的大類建立成方法級耦合無向網(wǎng)絡;

步驟5.3:不斷變化步驟4中的耦合權值系數(shù),每一組系數(shù)下人工大類進行一次聚類劃分操作,通過對比聚類后的結果與原始類結構的差異計算出重構的準確率;Np個人工大類平均準確率最高的一組系數(shù),即為該待重構軟件系統(tǒng)的最佳耦合權值系數(shù)。

進一步地,所述步驟6具體包括如下步驟:

步驟6.1:初始時,將繼承體系葉子節(jié)點中調(diào)用從其父類繼承而來的方法節(jié)點或重寫父類方法的節(jié)點綁定為一個社團,方法級耦合網(wǎng)絡中的其余方法節(jié)點各自視為一個獨立社團;

步驟6.2:根據(jù)方法對之間耦合關系的耦合權值確定模塊度增益矩陣中每一個元素的值,即

其中,CNi和CNj分別表示兩個社團,ΔQij表示合并社團CNi和CNj能夠為軟件系統(tǒng)帶來的模塊度增益值,W表示方法級耦合無向網(wǎng)絡中所有邊權值之和,Si和Sj分別表示連接社團CNi和CNj內(nèi)所有節(jié)點的邊權值之和,Sin(CNi,CNj)表示連接社團CNi和社團CNj之間所有邊的權值之和;

步驟6.3:選擇模塊度增益最大的一對社團CNp及CNq進行合并,合并為社團CNp,并刪除模塊度增益矩陣中對應的第q行和第q列,同時更新與合并社團CNp關聯(lián)的模塊度增益值;

步驟6.4:判斷模塊度增益矩陣中的最大值是否小于或等于零,若否,則重復執(zhí)行步驟6.3,若是,則合并操作停止,此時所得的社團結構即為最優(yōu)劃分。

由上述技術方案可知,本發(fā)明的有益效果在于:本發(fā)明提供的一種面向?qū)ο筌浖淖詣踊貥嫹椒ǎ瑢⒋郎y軟件非繼承體系中的類節(jié)點與繼承體系中的葉子節(jié)點合并起來,結合語義耦合度量與結構耦合度量方法,將合并的類級連通片建立為方法級加權無向網(wǎng)絡同時,為待重構的軟件系統(tǒng)定制的最佳方法間耦合權重系數(shù)的方法,能獲得最佳重構效果;為保證代碼行為不變,設定重構的一系列前提條件,利用層次聚類算法得到使得系統(tǒng)模塊度增量最大的類劃分方式;在通過對比重構前后的社團結構差異,自動化地生成搬移函數(shù)、搬移屬性及提煉類的多種類型的重構建議,提高了系統(tǒng)的內(nèi)聚性,同時有益于系統(tǒng)的可理解性、可重用性和可維護性。

附圖說明:

圖1為本發(fā)明實施例提供的面向?qū)ο筌浖淖詣踊貥嫹椒鞒虉D;

圖2為本發(fā)明實施例提供的示例代碼所對應的類級多層有向網(wǎng)絡模型結構示意圖;

圖3為本發(fā)明實施例提供的步驟6的具體流程圖;

圖4為本發(fā)明實施例提供的示例代碼所對應的聚類過程示意圖;

圖5為本發(fā)明實施例提供的示例代碼所對應的方法級網(wǎng)絡重構結果示意圖。

具體實施方式:

下面結合附圖和實施例,對本發(fā)明的具體實施方式作進一步詳細描述。以下實施例用于說明本發(fā)明,但不用來限制本發(fā)明的范圍。

本實施例中以如下面向?qū)ο筌浖膶嵗a作為待重構的軟件系統(tǒng),經(jīng)過面向?qū)ο筌浖淖詣踊貥嫹椒▽ζ溥M行重構:

本實施例提供的一種面向?qū)ο筌浖淖詣踊貥嫹椒?,如圖1所示,具體包括如下步驟。

步驟1:以類為節(jié)點、以類間依賴關系為邊,將待重構軟件系統(tǒng)抽象構建為類級多層依賴有向網(wǎng)絡模型,具體包括如下步驟:

步驟1.1:讀取待重構軟件系統(tǒng)編譯后的iar包,通過掃描分析語法分析樹結構,解析出待重構軟件系統(tǒng)中類、模塊、接口、函數(shù)、屬性以及它們之間的依賴關系,過濾掉編譯文件中包含的Java虛擬機中的工具類及方法,只保留待重構軟件系統(tǒng)自身的類;

步驟1.2:讀取軟件系統(tǒng)的源文件,抽取每個方法的變量名、方法名和注釋的語義信息,構建每個方法所對應的詞匯庫;

步驟1.3:分別構建以類為節(jié)點、類繼承關系為邊以及類非繼承關系為邊的有向網(wǎng)絡模型G=G1∪G2,其中,G1=(V,E1)為非繼承關系網(wǎng)絡模型,G2=(V,E2)為繼承關系網(wǎng)絡模型,網(wǎng)絡層次之間的節(jié)點具有一一對應的關系,其中,V表示方法節(jié)點集合,E1表示類間非繼承關系集合,E2表示類間繼承關系集合。

上述的面向?qū)ο筌浖膶嵗a中,待重構的軟件系統(tǒng)由6個類構成,其中,類DrawingPanel是PerPanel和SVGPanel的父類,類NetPanel繼承于PerPanel,而類UndoRedoManager和RestoreDataEdit屬于非繼承體系,并且類NetPanel和PerPanel依賴于類UndoRedoManager,該軟件系統(tǒng)對應的類級多層有向網(wǎng)絡模型如圖2所示。

步驟2:進行重構的預處理操作,根據(jù)類級多層依賴有向網(wǎng)絡模型,將非繼承體系類節(jié)點與繼承體系中的葉子節(jié)點提取出來,為了保證重構前后代碼的行為不發(fā)生變化,只對提取出的該部分節(jié)點進行重構,具體包括如下步驟:

步驟2.1:遍歷類級繼承關系網(wǎng)絡模型G2中的每個節(jié)點,記錄其中所有入度大于零的類CLi,CLi∈V,并將其視為繼承體系中的非葉子節(jié)點,加入到待刪除節(jié)點集合VD中;

步驟2.2:在非繼承關系有向網(wǎng)絡中依次移除繼承體系中的非葉子類節(jié)點以及與這些類相連接的邊ED,所得的剩余網(wǎng)絡只包含非繼承體系中的類節(jié)點以及繼承體系中的葉子節(jié)點,其中,

步驟3:依次合并由非繼承體系節(jié)點與繼承體系中的葉子節(jié)點構成的類級網(wǎng)絡連通片,并且將每個類級網(wǎng)絡連通片轉(zhuǎn)換為同種類型的實體集合,實體包括方法和屬性兩種類型,具體包括如下步驟:

步驟3.1:依次合并由非繼承體系節(jié)點與繼承體系中的葉子節(jié)點構成的類級網(wǎng)絡連通片,并且將每個類級網(wǎng)絡連通片轉(zhuǎn)換為一個實體集合;

步驟3.2:將集合中的屬性視為實現(xiàn)其自身存取操作的取值方法Getter()及賦值方法Setter()方法,即將集合中不同類型的元素轉(zhuǎn)化為同種類型,將屬性元素轉(zhuǎn)化成方法元素。

步驟4:分析每個實體集合元素之間的語義和結構耦合關系網(wǎng)絡,并對其加權求和,將實體集合構建成方法級耦合無向網(wǎng)絡模型,語義耦合關系是指抽取每個方法的方法名、變量名及注釋構建成該方法的詞匯庫,根據(jù)潛在語義相似性算法,將每個方法轉(zhuǎn)化成對應的語義詞匯空間向量,計算向量之間的余弦夾角作為此函數(shù)對語義相似性的權值,結構耦合關系包括共享屬性關系、方法調(diào)用關系和功能耦合關系,具體包括以下步驟:

步驟4.1:確定方法之間的語義耦合權值,得到方法級語義耦合關系網(wǎng)絡,根據(jù)步驟1.2抽取的每個方法的方法名、變量名和注釋,構建成方法的詞匯庫,根據(jù)潛在語義相似性算法,將任意方法mk轉(zhuǎn)化成對應的語義詞匯空間向量將方法向量之間的余弦夾角作為此方法對語義相似性的權值SSW(mi,mj),如式(1)所示;

其中,mi和mj分別表示兩個方法,SSW(mi,mj)表示方法mi和方法mj之間的語義耦合權值,和分別表示方法mi和mj對應的語義詞匯空間向量;

步驟4.2:如果兩個函數(shù)同時使用了一個屬性,則它們之間存在共享屬性關系,確定方法之間的共享屬性耦合權值,如式(2)所示,得到方法級共享屬性關系網(wǎng)絡;

其中,SAW(mi,mj)表示方法mi和mj之間的共享屬性耦合權值,Ai和Aj分別表示方法mi和mj使用的屬性集合;

步驟4.3:當一個函數(shù)調(diào)用了另一個函數(shù)時,它們具有函數(shù)調(diào)用關系,確定方法之間的方法調(diào)用耦合權值,如式(3)所示,得到方法級方法調(diào)用關系網(wǎng)絡;

MIW(mi,mj)=max(MIWij,MIWji) (3)

其中,MIW(mi,mj)表示方法mi和mj之間的方法調(diào)用耦合權值,MIW(mi,mj)為MIWij與MIWji的最大值;MIWij表示方法mi調(diào)用mj的權值,如式(4)所示,MIWij等于I(mi,mj)與方法mj在軟件系統(tǒng)中被調(diào)用的總次數(shù)之比,MIWji表示方法mj調(diào)用mi的權值;I(mi,mj)表示方法mi調(diào)用方法mj的次數(shù),I(mk,mj)表示方法mi調(diào)用方法mj的次數(shù),n表示系統(tǒng)中的方法總數(shù);

步驟4.4:若將方法體視為一個功能域,則兩個方法在同一個功能域中被執(zhí)行時,稱該方法對具有功能耦合關系,確定方法之間的方法功能耦合權值,如式(5)所示,得到方法級功能耦合關系網(wǎng)絡;

其中,SEW(mi,mj)表示方法mi和mj之間的方法功能耦合權值,ETij表示方法mi和mj在同一個功能域中執(zhí)行的次數(shù),ETi和ETj分別表示方法mi和mj執(zhí)行的總次數(shù);

步驟4.5:將上述步驟4.1至步驟4.4得到的四種方法級關系網(wǎng)絡的耦合權值加權求和,得到每對方法節(jié)點之間耦合關系的強度,即邊權值,從而得到方法級耦合無向網(wǎng)絡模型G=(V,E,Z),其中,V為方法節(jié)點集合,E為方法間耦合關系集合,Z為方法間耦合權值矩陣,Z=(zij)|V|×|V|,zij為方法間耦合權值矩陣Z的矩陣的i行j列的元素,表示每對方法節(jié)點之間的邊權值,如式(6)所示;

zij=α×SAW(mi,mj)+β×MIW(mi,mj)+γ×SEW(mi,mj)+η×SSW(mi,mj) (6)

其中,α、β、γ和η分別表示方法級語義耦合、共享屬性、方法調(diào)用和功能耦合關系網(wǎng)絡的耦合權值系數(shù),α+β+γ+η=1。

步驟5:確定待重構軟件系統(tǒng)的方法級耦合無向網(wǎng)絡中節(jié)點間不同類型耦合關系權值的最優(yōu)系數(shù),具體包括如下步驟:

步驟5.1:隨機選取待重構軟件系統(tǒng)中50對內(nèi)聚度高于平均值且相互依賴的類對進行合并;

步驟5.2:將每一個人工合并而成的大類建立成方法級耦合無向網(wǎng)絡;這里的人工合成,是指不是系統(tǒng)中本來存在的類,將系統(tǒng)中兩個原始類,合并成一個大類,人為制造出一個大類,并且將這個人工大類視為必須要分解的類,進行聚類劃分,與未合并前的原始結構進行對比,與原始結構越相近,則劃分的準確率越高;

步驟5.3:不斷變化步驟4中的四個耦合權值系數(shù),每一組系數(shù)下進行一次聚類劃分操作,即根據(jù)高內(nèi)聚低耦合,將類進行分解操作,將一個大類分解為若干新類,且保證新類之間的耦合性降低,新類內(nèi)部內(nèi)聚性較高,通過對比聚類后的結果與原始類結構的差異計算出重構的準確率;50個人工大類平均準確率最高的一組系數(shù),即為該待重構軟件系統(tǒng)的最佳耦合權值系數(shù)。

不斷變化耦合權值系數(shù)的過程為:在滿足α+β+γ+η=1的條件下,迭代變化四個耦合權值系數(shù):α∈[0,0.1,...,1]、β∈[0,0.1,...,1-α]、γ∈[0,0.1,...,1-α-β]且η∈[0,0.1,...,1-α-β-γ]。

重構準確率利用文獻《An effectiveness measure for software clustering algorithms》中提出的度量值MoJoFM(MoJo eFfectiveness Metric)進行評估,將原始類的結構視為標準分割:

式中,MoJoFM(PAnew,PAori)為度量值,表示重構的準確率,在數(shù)值上表示兩種不同的社團劃分結構之間的差異程度,差異越小,其數(shù)值越接近于1,若將原始類的結構視為標準劃分,那么重構后社團結構與原始結構越接近,則重構準確率越高;PAnew為聚類分析后的劃分結構,PAori為原始類的結構,mno(PAnew,PAori)表示從結構PAnew到標準分割PAori的最小距離,而表示從結構PAnew變換成PAori最大元素搬移次數(shù)。

步驟6:依次遍歷每個方法級網(wǎng)絡,根據(jù)方法間的耦合強度,對每個方法級網(wǎng)絡進行社團劃分,從而得到待重構軟件系統(tǒng)的新的系統(tǒng)結構,如圖3所示,具體包括如下步驟:

步驟6.1:為保證重構前后代碼行為不變,初始時,將繼承體系葉子類點中調(diào)用從其父類繼承而來的方法節(jié)點或重寫父類方法的節(jié)點,即不可分割的方法節(jié)點綁定為一個社團,方法級耦合網(wǎng)絡中的其余方法節(jié)點各自視為一個獨立社團;

步驟6.2:根據(jù)方法對之間耦合關系的耦合權值確定模塊度增益矩陣中每一個元素的值;模塊度增益按式(7)確定:

其中,CNi和CNj分別表示兩個社團,ΔQij表示合并社團CNi和CNj能夠為軟件系統(tǒng)帶來的模塊度增益值,W表示方法級耦合無向網(wǎng)絡中所有邊權值之和,Si和Sj分別表示連接社團CNi和CNj內(nèi)所有節(jié)點的邊權值之和,Sin(CNi,CNj)表示連接社團CNi和社團CNj之間所有邊的權值之和;

步驟6.3:選擇模塊度增益最大的一對社團CNp及CNq進行合并操作,合并為社團CNp,由于社團數(shù)目的減少,刪除模塊度增益矩陣中對應的第q行和第q列,同時更新與合并社團CNp關聯(lián)的模塊度增益值;

步驟6.4:重復執(zhí)行步驟6.3,直到待重構軟件系統(tǒng)中模塊度增益矩陣中的最大值小于或等于零時,合并操作停止,此時所得的社團結構即為最優(yōu)劃分,每一個社團代表一個類。模塊度增量矩陣中的最大值是一個遞減過程,在社區(qū)劃分過程中,兩兩合并到最后,結構一定會趨于穩(wěn)定,即模塊度增量的最大值小于等零。

本實施例中,待重構的實例軟件系統(tǒng)中,合并其非繼承體系的類以及繼承體系的葉子節(jié)點RestoreDataEdit,NetPanel和UndoRedoManager,建立方法級無向耦合網(wǎng)絡后,其聚類劃分過程如圖4所示,首先將使用從父類super方法的實體在聚類劃分之前綁定為一個社團;屬性與其自身的Getter()或Setter()方法由于具有較高內(nèi)聚性,因此在聚類的過程中優(yōu)先被合并在一起;經(jīng)過19步合并操作后,最終得到如下4個新類:

類1、RestoreDataEdit(...);oldRestoreData_get_set();addEdit(...);getPresentationName();replaceEdit(...);newRestoreData_get_set();

類2、figure_get_set();redoData(...);redoEdit(...);getlabelsRedo();labelsRedo_get_set();RedoactionPerformed(...);redoProgress(...);redoAction_get_set();getRedoAction();

類3、getlabelsUndo();labelsUndo_get_set();undoOrRedo(...);undoOrRedoInProgress;updateActions(...);UndoactionPerformed(...);undoProgress(...);getUndoAction();undoAction_get_set();undoDrawing(...);undoData(...);UndoDrawing_get_set();

類4、NetPanel(...);addDefaultCreationButtonsTo(...);addCreationButtonsTo(...);strokeDecorationPopupButton;addStrokePlacementButtonTo(...);strokeWidthPopupButton;addStrokeDecorationButtonTo(...)。

步驟7:將每個由聚類分析得到的方法社團視為一個類,對比新類與原始的結構,設定保證代碼行為的重構前提條件,從而生成一系列包括搬移函數(shù)、搬移屬性和提煉類的重構建議。

可視化聚類劃分結果如圖5所示,本實施例的實例軟件系統(tǒng)經(jīng)重構后,為提高系統(tǒng)的模塊度,生成的重構建議為:類UndoRedoManager建議被拆分,內(nèi)聚度較高的方法集合M={getlabelsRedo(),labelsRedo,RedoactionPerformed(...),redoProgress(...),redoAction,getRedoAction()}共同實現(xiàn)了與“Redo”操作相關的功能,應該提煉為新類UndoRedoManagernew1;而方法RestoreDataEdit.redoData(...),RestoreDataEdit.redoEdit(...)和屬性RestoreDataEdit.Figure由于被類UndoRedoManagernew1中的方法所頻繁使用,建議搬移到UndoRedoManagernew1中,以去除“Feature Envy”的壞味道;同理,NetPanel.undoDrawing(...),NetPanel.undoData(...)及NetPanel.UndoDrawing建議搬移到與其有更緊密關系的類UndoRedoManagernew2中。

步驟8:按照生成的搬移函數(shù)、搬移屬性及提煉類重構建議對軟件系統(tǒng)執(zhí)行重構操作。

本實施提供的面向?qū)ο筌浖淖詣踊貥嫹椒?,可以直接應用于面向?qū)ο筌浖到y(tǒng)的自動化重構中,輔助程序員做出復雜的重構決策,從而降低重構難度并提高重構效率。為了便于驗證所述方法的可行性和優(yōu)勢,該部分從代碼被重構前后的可理解性、可重用性、靈活性、可維護性以及內(nèi)聚度的度量指標的變化情況進行對比分析。

以開源軟件系統(tǒng)JHotDraw 7.0.6、JFreeChart 0.9.7、jEdit 2.7、HSQLDB 1.8.1.4和Jmol 9.0分別為例,對重構方案的有效性進行驗證,利用文獻《A Hierarchical Model for ObjectOriented Design Quality Assessment》提出的QMOOD模型以及《Identification of Move Method Refactoring Opportunities》提出內(nèi)聚度指標EP評估系統(tǒng)重構前后的質(zhì)量變化情況。評價指標的計算方法如下:

Reusability=-0.25×Coupling+0.25×Cohesion+0.5×Messaging+0.5×Design Size (11)

Flexibility=0.25×Encapsultion-0.25×Coupling+0.5×Composition+0.5×Polymorphism (12)

Ma int ainability=ko×1/(LCOM×CBO×WMC×DIT×NOC×RFC) (14)

通過上述的公式(11)至公式(16)的評價指標評價本實施例的重構方法得到的集成測試序列與傳統(tǒng)方法得到的結果對比分析,如表1所示。

表1 本實施例得到的集成測試序列與傳統(tǒng)方法結果對比分析

其中,指標EP可同時度量軟件系統(tǒng)的內(nèi)聚度和耦合度的值,EP的值等于耦合度與內(nèi)聚度之比,因此,EP的值越小,重構效果越好。通過對比可發(fā)現(xiàn),利用本實施例提供的面向?qū)ο筌浖淖詣踊貥嫹椒▽Υ貥嬡浖到y(tǒng)進行重構后,系統(tǒng)的各項綜合指標均有一定程度的改善,最為明顯的是系統(tǒng)的可維護性,平均增長到重構前的2.4倍。由此可見,本實施例的方法能夠提高軟件質(zhì)量,降低軟件維護成本,是一種有效提高軟件質(zhì)量的手段。

最后應說明的是:以上實施例僅用以說明本發(fā)明的技術方案,而非對其限制;盡管參照前述實施例對本發(fā)明進行了詳細的說明,本領域的普通技術人員應當理解:其依然可以對前述實施例所記載的技術方案進行修改,或者對其中部分或者全部技術特征進行等同替換;而這些修改或者替換,并不使相應技術方案的本質(zhì)脫離本發(fā)明權利要求所限定的范圍。

當前第1頁1 2 3 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1