国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      一種面向?qū)ο筌浖淖詣?dòng)化重構(gòu)方法與流程

      文檔序號(hào):12176421閱讀:534來源:國知局
      一種面向?qū)ο筌浖淖詣?dòng)化重構(gòu)方法與流程

      本發(fā)明涉及軟件質(zhì)量的改善技術(shù)領(lǐng)域,尤其涉及一種面向?qū)ο筌浖淖詣?dòng)化重構(gòu)方法。



      背景技術(shù):

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

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

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

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

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

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

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



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

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

      本發(fā)明提供一種面向?qū)ο筌浖淖詣?dòng)化重構(gòu)方法,包括以下步驟:

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

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

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

      步驟4:分析每個(gè)實(shí)體集合元素之間的語義和結(jié)構(gòu)耦合關(guān)系,得到相應(yīng)耦合關(guān)系網(wǎng)絡(luò),并對(duì)其加權(quán)求和,將實(shí)體集合構(gòu)建成方法級(jí)耦合無向網(wǎng)絡(luò)模型;

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

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

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

      步驟6:依次遍歷每個(gè)方法級(jí)網(wǎng)絡(luò),根據(jù)方法間的耦合強(qiáng)度,對(duì)每個(gè)方法級(jí)網(wǎng)絡(luò)進(jìn)行社團(tuán)劃分,從而得到待重構(gòu)軟件系統(tǒng)的新的系統(tǒng)結(jié)構(gòu);

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

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

      進(jìn)一步地,所述步驟1具體包括如下步驟:

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

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

      步驟1.3:分別構(gòu)建以類為節(jié)點(diǎn)、類繼承關(guān)系為邊和類非繼承關(guān)系為邊的有向網(wǎng)絡(luò)模型,即類級(jí)繼承關(guān)系有向網(wǎng)絡(luò)和類非繼承關(guān)系有向網(wǎng)絡(luò),有向網(wǎng)絡(luò)模型中的網(wǎng)絡(luò)層次之間的節(jié)點(diǎn)一一對(duì)應(yīng)。

      進(jìn)一步地,所述步驟2具體包括如下步驟:

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

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

      進(jìn)一步地,所述步驟3具體包括如下步驟:

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

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

      進(jìn)一步地,所述步驟4具體包括如下步驟:

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

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

      其中,mi和mj分別表示兩個(gè)方法,SSW(mi,mj)表示方法mi和方法mj之間的語義耦合權(quán)值,和分別表示方法mi和mj對(duì)應(yīng)的語義詞匯空間向量;

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

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

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

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

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

      步驟4.1.4:確定方法之間的方法功能耦合權(quán)值,即式(5),得到方法級(jí)功能耦合關(guān)系網(wǎng)絡(luò);

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

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

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

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

      進(jìn)一步地,所述步驟5具體包括如下步驟:

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

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

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

      進(jìn)一步地,所述步驟6具體包括如下步驟:

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

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

      其中,CNi和CNj分別表示兩個(gè)社團(tuán),ΔQij表示合并社團(tuán)CNi和CNj能夠?yàn)檐浖到y(tǒng)帶來的模塊度增益值,W表示方法級(jí)耦合無向網(wǎng)絡(luò)中所有邊權(quán)值之和,Si和Sj分別表示連接社團(tuán)CNi和CNj內(nèi)所有節(jié)點(diǎn)的邊權(quán)值之和,Sin(CNi,CNj)表示連接社團(tuán)CNi和社團(tuán)CNj之間所有邊的權(quán)值之和;

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

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

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

      附圖說明:

      圖1為本發(fā)明實(shí)施例提供的面向?qū)ο筌浖淖詣?dòng)化重構(gòu)方法流程圖;

      圖2為本發(fā)明實(shí)施例提供的示例代碼所對(duì)應(yīng)的類級(jí)多層有向網(wǎng)絡(luò)模型結(jié)構(gòu)示意圖;

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

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

      圖5為本發(fā)明實(shí)施例提供的示例代碼所對(duì)應(yīng)的方法級(jí)網(wǎng)絡(luò)重構(gòu)結(jié)果示意圖。

      具體實(shí)施方式:

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

      本實(shí)施例中以如下面向?qū)ο筌浖膶?shí)例代碼作為待重構(gòu)的軟件系統(tǒng),經(jīng)過面向?qū)ο筌浖淖詣?dòng)化重構(gòu)方法對(duì)其進(jìn)行重構(gòu):

      本實(shí)施例提供的一種面向?qū)ο筌浖淖詣?dòng)化重構(gòu)方法,如圖1所示,具體包括如下步驟。

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

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

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

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

      上述的面向?qū)ο筌浖膶?shí)例代碼中,待重構(gòu)的軟件系統(tǒng)由6個(gè)類構(gòu)成,其中,類DrawingPanel是PerPanel和SVGPanel的父類,類NetPanel繼承于PerPanel,而類UndoRedoManager和RestoreDataEdit屬于非繼承體系,并且類NetPanel和PerPanel依賴于類UndoRedoManager,該軟件系統(tǒng)對(duì)應(yīng)的類級(jí)多層有向網(wǎng)絡(luò)模型如圖2所示。

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

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

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

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

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

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

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

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

      其中,mi和mj分別表示兩個(gè)方法,SSW(mi,mj)表示方法mi和方法mj之間的語義耦合權(quán)值,和分別表示方法mi和mj對(duì)應(yīng)的語義詞匯空間向量;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

      重構(gòu)準(zhǔn)確率利用文獻(xiàn)《An effectiveness measure for software clustering algorithms》中提出的度量值MoJoFM(MoJo eFfectiveness Metric)進(jìn)行評(píng)估,將原始類的結(jié)構(gòu)視為標(biāo)準(zhǔn)分割:

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

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

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

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

      其中,CNi和CNj分別表示兩個(gè)社團(tuán),ΔQij表示合并社團(tuán)CNi和CNj能夠?yàn)檐浖到y(tǒng)帶來的模塊度增益值,W表示方法級(jí)耦合無向網(wǎng)絡(luò)中所有邊權(quán)值之和,Si和Sj分別表示連接社團(tuán)CNi和CNj內(nèi)所有節(jié)點(diǎn)的邊權(quán)值之和,Sin(CNi,CNj)表示連接社團(tuán)CNi和社團(tuán)CNj之間所有邊的權(quán)值之和;

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

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

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

      類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:將每個(gè)由聚類分析得到的方法社團(tuán)視為一個(gè)類,對(duì)比新類與原始的結(jié)構(gòu),設(shè)定保證代碼行為的重構(gòu)前提條件,從而生成一系列包括搬移函數(shù)、搬移屬性和提煉類的重構(gòu)建議。

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

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

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

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

      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)的評(píng)價(jià)指標(biāo)評(píng)價(jià)本實(shí)施例的重構(gòu)方法得到的集成測試序列與傳統(tǒng)方法得到的結(jié)果對(duì)比分析,如表1所示。

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

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

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

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