張紅華
摘要:既有軟件重構(gòu)工具大多數(shù)旨在解決局部設(shè)計(jì)或編碼問(wèn)題,并未涉獵設(shè)計(jì)層面。而以搜索為基礎(chǔ)的重構(gòu)方法雖然把改善代碼度量指標(biāo)作為重構(gòu)目標(biāo),但是,卻不是針對(duì)軟件的層次化設(shè)計(jì)。對(duì)此,本文提出了一種全新的基于搜索的軟件自動(dòng)化重構(gòu)方法,其通過(guò)利用以設(shè)計(jì)結(jié)構(gòu)矩陣為載體的軟件模塊層次化度量方法,可以自動(dòng)生成能夠獲取最優(yōu)軟件模塊化設(shè)計(jì)的重構(gòu)相關(guān)策略。
關(guān)鍵詞:設(shè)計(jì)層次優(yōu)化;軟件重構(gòu);自動(dòng)化
中圖分類(lèi)號(hào):TP3 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2018)30-0276-02
1 軟件自動(dòng)化重構(gòu)的意義
1.1 持續(xù)糾偏和改進(jìn)軟件設(shè)計(jì)
重構(gòu)與設(shè)計(jì)之間是相互輔助的關(guān)系,兩者之間是互補(bǔ)的。即使已經(jīng)重構(gòu),也依舊需要進(jìn)行預(yù)先設(shè)計(jì),但是不需要是最優(yōu)化設(shè)計(jì),只需要制定可行的、合理的解決方案即可。而不進(jìn)行重構(gòu),那么程序設(shè)計(jì)就會(huì)發(fā)生質(zhì)變,導(dǎo)致無(wú)法控制。重構(gòu)實(shí)際上就是進(jìn)行代碼整理,讓帶有發(fā)散傾向的代碼及時(shí)回歸到本位狀態(tài)。軟件的生命周期一般都需要大量的程序員進(jìn)行維護(hù)工作,這就會(huì)導(dǎo)致后續(xù)被人為忽視。而為了保證代碼容易理解,需要在實(shí)現(xiàn)軟件功能的基礎(chǔ)上,進(jìn)行一系列相關(guān)工作,即清晰的排版布局,簡(jiǎn)要的注解,有效的命名。而命名是其中非常重要的一個(gè)環(huán)節(jié),對(duì)此,可以采取暗喻命名的方法,也就是以對(duì)象實(shí)現(xiàn)的功能依據(jù),使用形象化或者擬人手法進(jìn)行命名。
1.2 有助于發(fā)現(xiàn)隱藏的代碼缺陷
在進(jìn)行代碼重構(gòu)的時(shí)候,需要對(duì)既有代碼有深刻的了解。避免在寫(xiě)下程序之后,依舊對(duì)自己的程序邏輯缺乏理解。對(duì)此,一般可以進(jìn)行代碼重構(gòu),以此深化對(duì)既有設(shè)計(jì)的深刻了解,一旦發(fā)現(xiàn)其中存在的隱患,及時(shí)采取措施,構(gòu)建更加優(yōu)質(zhì)代碼。
1.3 有利于進(jìn)一步提高編程效率
在發(fā)現(xiàn)解決問(wèn)題是一件非常復(fù)雜的事情時(shí),一般并非是問(wèn)題自身所導(dǎo)致的,而是所選擇的方法不正確,太過(guò)繁雜的設(shè)計(jì)會(huì)直接造成編碼惡性重復(fù)。對(duì)此,有效改善設(shè)計(jì),提高可讀性,減緩缺陷是非常有必要的。較好的設(shè)計(jì)是成功的重要基礎(chǔ),雖然進(jìn)行重構(gòu)優(yōu)化設(shè)計(jì)會(huì)導(dǎo)致速度有所下降,但是,其后續(xù)優(yōu)勢(shì)才是最關(guān)鍵的。
2 基于搜索的軟件自動(dòng)化重構(gòu)
基于搜索的軟件自動(dòng)化重構(gòu)是一種軟件自動(dòng)化重構(gòu)研究中的普遍思想,其將軟件重構(gòu)抽象化,促使其成為屬性、方法、類(lèi)三者之間的組合優(yōu)化,并通過(guò)搜索算法進(jìn)行求解。Cinnéide通過(guò)利用基于搜索的軟件自動(dòng)化重構(gòu)方法,實(shí)現(xiàn)了重構(gòu)工具Code-Imp,其能夠重構(gòu)軟件的設(shè)計(jì)層面,實(shí)現(xiàn)屬性、方法、類(lèi)之間的多種重構(gòu)方式,即添加、取消或者代替繼承關(guān)系。同時(shí),此工具利用爬山、模擬退火、遺傳等算法做了進(jìn)一步的優(yōu)化搜索。Cinnéide工作不僅有效實(shí)踐了基于搜索的軟件自動(dòng)化重構(gòu),還對(duì)軟件度量值間的彼此聯(lián)系做了詳細(xì)的對(duì)比分析。通過(guò)采取部分度量值進(jìn)行研究,對(duì)比重構(gòu)時(shí)度量值的變化,并對(duì)度量值間的關(guān)系與差異進(jìn)行了考察。但是,Cinnéide并未深入探究軟件模塊層次化的度量。對(duì)此,本文應(yīng)側(cè)重于對(duì)具備較好模塊層次化結(jié)構(gòu)的代碼進(jìn)行適當(dāng)調(diào)整。
3 基于設(shè)計(jì)層次優(yōu)化的軟件自動(dòng)化重構(gòu)的基本思想
DSM Re factoring主要是利用改變代碼間的依賴關(guān)系,改善軟件層次化結(jié)構(gòu),即輸入某項(xiàng)目源代碼,輸出代碼重構(gòu)建議。通過(guò)源代碼間的依賴關(guān)系,獲得程序元素間的依賴關(guān)系。通過(guò)調(diào)整類(lèi)和成員間的映射關(guān)系,提高源代碼的模塊化程度。利用遺傳算法和DSM矩陣下的模塊層次化度量法,計(jì)算類(lèi)成員對(duì)類(lèi)的最優(yōu)映射關(guān)系。對(duì)既有類(lèi)成員與類(lèi)的映射關(guān)系,和遺傳算法計(jì)算的最優(yōu)類(lèi)成員與類(lèi)的映射關(guān)系進(jìn)行對(duì)比分析,以此生成重構(gòu)建議。把Java類(lèi)間的依賴關(guān)系作為軟件模塊化和層次結(jié)構(gòu)的重要根據(jù),其主要是通過(guò)類(lèi)屬性與方法的相互依賴所產(chǎn)生,所以,可以適當(dāng)改變類(lèi)成員和類(lèi)的映射關(guān)系,以此改變Java類(lèi)間的依賴關(guān)系,進(jìn)而改變項(xiàng)目層次結(jié)構(gòu)。
4 基于設(shè)計(jì)層次優(yōu)化的軟件自動(dòng)化重構(gòu)算法過(guò)程
基于基本思想,利用遺傳算法改變類(lèi)成員與類(lèi)間的映射關(guān)系,計(jì)算并對(duì)比軟件結(jié)構(gòu)所對(duì)應(yīng)的模塊層次化度量值,以此優(yōu)化軟件結(jié)構(gòu)。重構(gòu)遺傳算法的搜索空間是類(lèi)成員和類(lèi)間映射的所有可能方式,軟件模塊層次化信息利用DSM進(jìn)行描述,通過(guò)值L進(jìn)行度量。
4.1 目標(biāo)函數(shù)
4.1.1 度量
目標(biāo)函數(shù)主要是以DSM模型與DRH理論為基礎(chǔ)的,給定類(lèi)成員與類(lèi)的映射關(guān)系為個(gè)體,通過(guò)類(lèi)成員的依賴關(guān)系,獲得其在類(lèi)間的依賴關(guān)系。利用DSM,行與列代表的設(shè)計(jì)變量都是Java類(lèi),變量間的依賴關(guān)系就是Java類(lèi)間的依賴關(guān)系,主要是通過(guò)類(lèi)的屬性與方法間的調(diào)用關(guān)系進(jìn)一步?jīng)Q定。每個(gè)Java類(lèi)與其自身的依賴關(guān)系不需考慮,就DRH理論為基礎(chǔ),DSM的行與列可以重新排序,以此展示層次化結(jié)構(gòu),其中上下層之間是依賴關(guān)系。而軟件層次結(jié)構(gòu)的好壞是由度量值L決定的,DSM的L值是通過(guò)公式加以定義:
L=4×l2-4×n-m
其中,l代表行數(shù),即Java類(lèi)個(gè)數(shù),n代表右上角1的數(shù)量,m代表左下角與層次化約束不相符的1的數(shù)量。在確定Java類(lèi)個(gè)數(shù)的前提下,L值越大,表示軟件層次化結(jié)構(gòu)越好。
1)反向依賴
4×n主要針對(duì)DRJ的首個(gè)特征,DSM沿對(duì)角線形成的右上角為空。在DSM中,模塊依賴是偏序的,所以,右上角出現(xiàn)依賴關(guān)系,代表著軟件出現(xiàn)了反向依賴模塊,不符合軟件層次化要求,會(huì)造成L有所下降。因?yàn)镈RH的偏序要求非常有必要,違反此要求的軟件層次化結(jié)構(gòu)很容易被腐化,因此,可以對(duì)此依賴關(guān)系應(yīng)賦予更高的權(quán)重,其會(huì)對(duì)L值造成直接性影響。
2)跨層依賴
m針對(duì)的是另一層次化約束,其是針對(duì)DRH另一特征的,也就是在設(shè)計(jì)時(shí),n層單純依賴于1到n-1層。模塊進(jìn)行層次劃分,依賴關(guān)系則只存在于相鄰層次之間。在具備較好層次結(jié)構(gòu)的軟件設(shè)計(jì)劃分成若干層次后,設(shè)計(jì)的n層只能單純依賴于n-1層。
4.1.2 DSM矩陣L值計(jì)算
利用迭代方式計(jì)算代碼結(jié)構(gòu)DSM的度量值,首先聚類(lèi)DSM的設(shè)計(jì)變量,將相互依賴的變量劃分成同一模塊。其次對(duì)模塊進(jìn)行層次劃分,將相鄰的獨(dú)立模塊劃分到同一層次,并計(jì)算度量值,在此計(jì)算中,采取的方式是對(duì)所有可能的模塊排列順序進(jìn)行一次性層次劃分,并對(duì)度量值進(jìn)行計(jì)算,以此保證度量值的精確性。作為DSM最終的度量值,最大值和設(shè)計(jì)變量的排列順序都需要詳細(xì)記錄,而且度量值處于最大時(shí),重構(gòu)算法則直接結(jié)束。在聚類(lèi)后,需要根據(jù)模塊排列順序?qū)Υ诉M(jìn)行層次劃分,連續(xù)的兩兩獨(dú)立模塊都?xì)w屬于相同層次。在計(jì)算度量值的時(shí)候,實(shí)際算法利用的DSM的每行所代表的都是劃分后的層次。每個(gè)層次都利用大括號(hào)表示,而數(shù)字則代表層次中涵蓋的Java類(lèi)文件,數(shù)字表示一層次中依賴于另一次層次的Java類(lèi)文件數(shù)量。
4.2 選擇算子
在遺傳算法中,選擇算子主要是為了從同代個(gè)體中選擇合適的個(gè)體產(chǎn)生下代,目標(biāo)是將優(yōu)勝個(gè)體遺傳到下代,或者讓優(yōu)勝個(gè)體利用產(chǎn)生后代的方法遺傳。選擇算子就是為了從同代軟件結(jié)構(gòu)中,選擇對(duì)應(yīng)的最大度量值產(chǎn)生下代。在DSM Re factoring中,選擇算子是最基礎(chǔ)的比例選擇算子,同代個(gè)體被選中的概率與所對(duì)應(yīng)的度量值的比例,L值越大,被選中的概率越大。
4.3 交叉算子
交叉算子在遺傳算法中的作用,就是提高算法的搜索水平與能力。通過(guò)重組選擇算子的兩個(gè)父代個(gè)體部分結(jié)構(gòu),產(chǎn)生下代新個(gè)體。交叉算子的作用主要就是交叉重組選擇算子的父代軟件結(jié)構(gòu),以生成新軟件結(jié)構(gòu),在空間內(nèi)搜索最優(yōu)解。DSM Re factoring利用均勻交叉法,其實(shí)踐概率為0.5,就此可知,在兩個(gè)父代個(gè)體產(chǎn)生的下代個(gè)體軟件結(jié)構(gòu)內(nèi)部,來(lái)自父代個(gè)體的軟件結(jié)構(gòu)各占50%。兩個(gè)父代個(gè)體代表兩種軟件結(jié)構(gòu),分別以類(lèi)成員列表加以表示,其中每個(gè)成員都詳細(xì)記錄了所在的Java類(lèi),在執(zhí)行交叉前,克隆父代個(gè)體,并對(duì)其列表中的相關(guān)成員進(jìn)行操作,其一,對(duì)兩個(gè)克隆個(gè)體的成員所在類(lèi)的一致性進(jìn)行比較分析,如果一致,則結(jié)束操作;其二,在兩個(gè)克隆個(gè)體中,成員所在類(lèi)不一致,隨機(jī)生產(chǎn)布爾值,值如果是真實(shí)的,則把克隆個(gè)體的成員所在Java類(lèi)進(jìn)行調(diào)換,相反則結(jié)束操作。據(jù)此,兩個(gè)克隆個(gè)體轉(zhuǎn)換成了新個(gè)體,經(jīng)過(guò)變異算子操作之后,則會(huì)成為下代個(gè)體。
4.4 變異算子
變異算子主要是通過(guò)改動(dòng)個(gè)體結(jié)構(gòu),提高遺傳算法種群的多元性,從而防止出現(xiàn)遺傳算法朝向局部最優(yōu)解靠攏的現(xiàn)象。交叉算子的作用是改變需變異軟件結(jié)構(gòu)的部分結(jié)構(gòu),以此產(chǎn)生新的軟件結(jié)構(gòu)。DSM Re factoring中所使用的變異算子設(shè)計(jì)流程為:依據(jù)變異概率判斷個(gè)體變異的必要性,從個(gè)體類(lèi)成員列表中,隨機(jī)選擇屬性或方法,將其依據(jù)既定概率移動(dòng)到另一類(lèi)中去。
5 結(jié)語(yǔ)
綜上所述,目前我國(guó)在軟件自動(dòng)化重構(gòu)方面的研究各式各樣,但是既有重構(gòu)工具大多注重局部代碼重構(gòu),或者度量值重構(gòu),幾乎不會(huì)對(duì)提升代碼模塊化質(zhì)量的全方位重構(gòu)進(jìn)行考慮。因此,本文實(shí)現(xiàn)了基于設(shè)計(jì)層次優(yōu)化的軟件自動(dòng)化重構(gòu),此方法是以遺傳算法和DSM矩陣度量作為基礎(chǔ),對(duì)類(lèi)成員與類(lèi)的映射關(guān)系進(jìn)行適當(dāng)調(diào)整,并提出相關(guān)重構(gòu)建議,其具有明顯的優(yōu)勢(shì),值得大力推廣與應(yīng)用。
參考文獻(xiàn):
[1] 劉嘉玥.基于啟發(fā)式搜索的軟件測(cè)試數(shù)據(jù)的自動(dòng)生成[D].天津大學(xué),2012.
[2] 王贊,樊向宇,鄒雨果等.一種基于遺傳算法的多缺陷定位方法[J].軟件學(xué)報(bào),2016,27(4):879-900.
[3] 陶彬賢.CODEREBUILDER:一種自動(dòng)化Java并發(fā)程序重構(gòu)工具的研究與實(shí)現(xiàn)[D].南京航空航天大學(xué),2014.
[4] 高東靜,林云,彭鑫等.面向設(shè)計(jì)層次優(yōu)化的軟件自動(dòng)化重構(gòu)[J].計(jì)算機(jī)應(yīng)用與軟件,2017,34(10):7-13.
【通聯(lián)編輯:張薇】