張森森 李英梅
摘要 軟件系統(tǒng)的質(zhì)量很大程度上是由其內(nèi)部結(jié)構(gòu)決定的, 在對軟件進(jìn)行優(yōu)化時往往會使軟件內(nèi)部結(jié)構(gòu)更加復(fù)雜,這樣就可能會降低軟件的性能,所以軟件的結(jié)構(gòu)需要一次次的優(yōu)化修復(fù)。以往存在的方法進(jìn)行這項操作非常的復(fù)雜繁瑣,本文的研究主要是通過共同發(fā)掘技術(shù),來實現(xiàn)類結(jié)構(gòu)的代碼重構(gòu)。這項技術(shù)中采用了群落點以及它們之間的依賴關(guān)系來代表軟件系統(tǒng)中的方法屬性的依賴關(guān)系,按照社區(qū)檢測的規(guī)則來獲得方法間網(wǎng)絡(luò)關(guān)系的最優(yōu)化結(jié)構(gòu),同時也改善了類的內(nèi)部結(jié)構(gòu),實現(xiàn)了軟件類結(jié)構(gòu)的重構(gòu)。
關(guān)鍵字:類結(jié)構(gòu)重構(gòu);共同發(fā)掘;軟件
中圖分類號:TP391 文獻(xiàn)標(biāo)識碼:A 文章編號:
Abstract The quality of the software system is largely determined by its internal structure, while optimizing software tends to make the software internal structure more complex , which may degrade the performance of the software, so the structure of the software needs the optimization of repair.Previous methods for this operation are very complex and and trival, this paper researches mainly how to realize the class structure code refactoring by common mining technology. Community is adopted in the technique points and the dependencies between them are applied to represent the method of attribute dependence of software system, According to the rules of community detection method, the relations between network optimization structure is obtained, meanwhile the internal structure of a class is improved, therefore the refactoring of the software class structure is ultimately implemented.
KEY WORDS: class structure reconstruction;community detection; software
0引言
一般情況下,軟件系統(tǒng)的內(nèi)部結(jié)構(gòu)對其質(zhì)量與壽命發(fā)揮著關(guān)鍵重要的決定性作用。在進(jìn)行軟件設(shè)計時,不可能將所有的需求都添加在軟件中,后期進(jìn)行功能擴(kuò)展時就會必然降低軟件的內(nèi)部結(jié)構(gòu),所以應(yīng)該通過軟件重構(gòu)技術(shù)來進(jìn)行修改。軟件重構(gòu)是由Fowler在Ref中初次提出,可以對設(shè)計增益提供重大幫助,而在添加新功能、改善代碼以及軟件升級時都可以進(jìn)行重構(gòu)。而且,重構(gòu)還能降低開發(fā)人員閱讀代碼的難度。綜上所述,本文研究探討的就是類水平上的軟件重構(gòu)。1 類水平上軟件重構(gòu)的理論基礎(chǔ)
研究中,主要通過方法之間的引用以及屬性的調(diào)用,來找到2個類之間的相互關(guān)系,從而實現(xiàn)類水平上的重構(gòu)。操作針對的是開源軟件,因此應(yīng)該在復(fù)雜的網(wǎng)絡(luò)環(huán)境中展開和進(jìn)行。復(fù)雜的網(wǎng)絡(luò)環(huán)境是復(fù)雜科學(xué)的一個分支,最近開始被各類科學(xué)引入研究。復(fù)雜的網(wǎng)絡(luò)系統(tǒng)發(fā)生簡化,實際上就是可以簡化成由特定的點與線組成特定的圖形,通過分析這些相連的線與點來對軟件給出設(shè)計闡述。研究復(fù)雜的網(wǎng)絡(luò)環(huán)境,發(fā)現(xiàn)這些點與線都可以與現(xiàn)實的網(wǎng)絡(luò)環(huán)境建立對應(yīng)關(guān)聯(lián),這也成為了復(fù)雜網(wǎng)絡(luò)環(huán)境的基本特性。本文的研究方法也是將復(fù)雜的網(wǎng)絡(luò)環(huán)境實行簡化,把開源中的各個屬性都當(dāng)作一個點,同時將會研究各點之間的相互關(guān)系,從而映射轉(zhuǎn)換為線,各個點之間線連接的強(qiáng)弱可通過線上的權(quán)值來指示和表征。圖1開發(fā)了一個簡單的例子,用于說明復(fù)雜網(wǎng)絡(luò)環(huán)境如何通過點與線來進(jìn)行表示。
盡管目前存在數(shù)目可觀的軟件重構(gòu)方法,但是其中的大多數(shù)都是復(fù)雜、且耗費時間的。本文的重構(gòu)方法即是有針對性地通過研究類中屬性之間以及方法之間的關(guān)系來確定軟件代碼的屬性與類重構(gòu)的框架結(jié)構(gòu),進(jìn)而提出公共社區(qū)檢測算法來實現(xiàn)本文的研究構(gòu)想。本文研究的簡單操作流程如圖2所示。
1.1 源代碼
設(shè)定時,核心操作設(shè)定在java代碼上,并且將開源的軟件代碼結(jié)構(gòu)作為主要的研究目標(biāo)。這樣的優(yōu)點可表述如下:
1)在java代碼方面已有眾多成果,研究開展時利于對實驗結(jié)果與已有成果提供對比,從而對本文方法給出全局有效的性能分析。
2)java代碼在90年代以后即已發(fā)展演進(jìn)成為具備最佳流行度的代碼形式,并且在網(wǎng)站上能夠直接下載到一些開源代碼用于提升改進(jìn)與分析。
3)代碼在java環(huán)境下能夠獲得迅速發(fā)展,而且java代碼呈現(xiàn)有清晰的內(nèi)部結(jié)構(gòu)和元素,例如屬性、類、方法、包。這些內(nèi)部結(jié)構(gòu)與元素之間的依賴性能夠利于實現(xiàn)分析與檢驗。
1.2軟件元素的收集
本研究方法的第一步就是對軟件元素執(zhí)行收集。具體就是對軟件的元素例如屬性、類、方法與包進(jìn)行提取的過程。在此過程中采用的是已經(jīng)研發(fā)面世的軟件工具,這些工具能夠?qū)浖到y(tǒng)java代碼的源文件中的元素進(jìn)行分析。由此可獲取的主要是2類依賴關(guān)系,分別是:屬性方法依賴關(guān)系和方法之間的依賴關(guān)系。
1.3數(shù)據(jù)處理
軟件重構(gòu)前,還需要將時下的數(shù)據(jù)處理方法進(jìn)行區(qū)分,這些方法對軟件系統(tǒng)具有至關(guān)重要的影響與作用。但在其中卻會有一些特殊的方法雖有重要作用,但卻違背了一些公律規(guī)則,需要找到這類的方法(例如一些高內(nèi)聚與低耦合的方法)并且將其施以進(jìn)行保留技術(shù)策略。所以本研究將只是對那些遵循一般規(guī)則的方法實現(xiàn)處理分析。這一步驟在本文中即是數(shù)據(jù)處理部分,而且與Ref[1]中的分類方法也呈現(xiàn)出高度類似。
通過如上內(nèi)容分析,本問研究時充分采用的是靜態(tài)結(jié)構(gòu)與命名約定的方法??梢詫⒁恍┓椒ǎɡ纾汉愣ǚǎ辗椒?,去除調(diào)節(jié)法,收集訪問器,申明方法,化名方法,制造方法等)視作特殊的方法不進(jìn)行移動。
1.4軟件依賴網(wǎng)絡(luò)
數(shù)據(jù)處理后,就應(yīng)該建立2種依賴關(guān)系圖:屬性方法依賴關(guān)系圖與方法間的依賴關(guān)系圖。用這2種關(guān)系依賴圖為基礎(chǔ)來對方法水平上的代碼重構(gòu)進(jìn)行規(guī)范與引導(dǎo)。在此,將對這2種依賴關(guān)系圖展開如下總結(jié)分析。
第一部分,是屬性方法依賴關(guān)系圖(AMN)。在屬性方法依賴關(guān)系圖中,每一個節(jié)點代表的是屬性與方法,并且每一個屬性或者方法均是由唯一的點提供表示。2個點之間的邊代表了屬性與邊之間的設(shè)定依賴性。如果方法A與屬性B之間具有相互關(guān)系,則邏輯抽象可得:對應(yīng)方法A的點與屬性B的點之間就有一條邊。這條邊的方向也是可以忽略不計的。文中只是考慮是否存在著依賴關(guān)系,對于依賴關(guān)系存在的倍數(shù)可以忽略不計。圖3給出了AMN的簡單例子,本次研究將AMN的關(guān)系描述成:
NetworkAMN=(Nodes,Edges)
其中,NetworkAMN代表的是無向?qū)傩砸蕾囮P(guān)系,Nodes表示的是代碼中的方法與屬性點,Edges代表的是屬性點之間的連線。
第二部分,則是方法間的依賴關(guān)系圖(MMN)。在軟件系統(tǒng)中每個屬性點代表的都是一種方法,并且每一個方法也僅由一個屬性點進(jìn)行設(shè)計表示。2個屬性點之間的邊代表了2個方法之間具有相互依賴性。在文章中,探討的方法依賴關(guān)系僅僅考慮2種情況:方法的調(diào)用以及相同屬性的訪問。究其本質(zhì)就是如果方法A之間調(diào)用方法B,或者反過來說,方法B直接調(diào)用方法A的話,那么方法B與方法A之間就構(gòu)建形成一條邊。如果方法C調(diào)用屬性attr,并且方法D調(diào)用屬性attr,則表征方法C與方法D的2個屬性點之間應(yīng)該具有連線。連線的方向?qū)⒈缓雎?,同樣地也將僅是關(guān)注方法之間的存在性,而并不考慮各邊之間的倍數(shù)大小。圖4給出了MMN的簡單例子,MMN可以被描述為:
Network MMN = (Nodes,Edges)
其中,Network MMN代表的無向網(wǎng)絡(luò),Nodes代表的是方法,Edges代表的是方法之間的依賴性。
2引導(dǎo)社區(qū)檢測算法
在復(fù)雜的網(wǎng)絡(luò)環(huán)境中,有諸多方法可以用于實現(xiàn)社區(qū)檢測。時下位居主流的方法即是 Newman提出的模塊法,算法整體性能已臻至最優(yōu)。本次研究中也將采用這種方法來進(jìn)行對MMN的社區(qū)結(jié)構(gòu)評估。
通過新近研究發(fā)現(xiàn),模塊性檢測算法仍然存在一定弊端,即不能夠檢測出小于一定規(guī)模的社區(qū)群落。這種算法性能主要取決于網(wǎng)絡(luò)的總體大小以及網(wǎng)絡(luò)互聯(lián)性的平均值,即使在群落明確定義的前提之下也很難對一些小的社區(qū)做出完備檢測。
針對這一問題,研究提出了處理規(guī)則來改進(jìn)社區(qū)檢測算法。具體來說,實現(xiàn)過程源起于方法本身所屬的特殊區(qū)域(并不是一個隨機(jī)檢測的規(guī)則[2]),而且這些方法都是在不同的類中發(fā)生移動的,利用社區(qū)檢測算法也是對不同類中的方法進(jìn)行檢測,以此判斷類是否需要控制移動。
對本研究的方法來說,用分區(qū)指標(biāo)來執(zhí)行質(zhì)量評估具備重大意義,愿意在于其控制著方法的移動進(jìn)程。已經(jīng)存在為數(shù)眾多的度量單位來檢驗特定的分工是否具有存在價值,例如Mancoridis發(fā)明的MQ介紹辦法[3]。
3類結(jié)構(gòu)重構(gòu)的核心思想
通過計算移動前后的Q值來確定是否需要引入此移動。本文中的Q就是模塊的核心思想,基礎(chǔ)依據(jù)是:如果Q值為正,則說明此研究采用的方法移動可以增強(qiáng)軟件系統(tǒng)的穩(wěn)定性,其作用效果為良性;同理,如果Q是負(fù)值,就證明此時的移動并無實施必要。本文的算法即是通過計算方法之間那些相關(guān)聯(lián)的主題算法,并將其移動來確定研究中類水平上重構(gòu)的可行性。展開來說,就是通過簽署建立的依賴關(guān)系圖來判定是否需要對軟件代碼中方法實行移動,從而得出需要移動的類。
4結(jié)束語
本文研究是通過權(quán)值的大小來衡定各個類中依賴關(guān)系的強(qiáng)弱。而后可以通過確定2個方法屬性間的依賴關(guān)系來評判得到這2個類之間權(quán)值的大小。而小的權(quán)值即代表了2個方法間弱的依賴關(guān)系,為此就軟件的可維護(hù)性而言則應(yīng)該使不同類中的權(quán)值盡可能最小。同時,在確定需要設(shè)計移動的方法后,對研究的對象進(jìn)行移動,實現(xiàn)軟件代碼類結(jié)構(gòu)的重構(gòu)。
本文的研究成果在類結(jié)構(gòu)的重構(gòu)方法中具有很強(qiáng)的實用性,但此方法的適用性還需要進(jìn)一步的驗證。未來的后續(xù)工作主要是:(1)用其他的開源軟件系統(tǒng)來對方法進(jìn)行評估。(2)研究一種可以在方法、類、包及軟件系統(tǒng)等不同的層次上都可以進(jìn)行重構(gòu)的軟件系統(tǒng)重構(gòu)方法。
[1] SENG O, STANMMEL J, BURKHART D. Search-based determination ofrefactoring for improving the class structure of object-oriented sys-tem[C]//Proceedings of the 8th annual conference on Genetic and evolutionary computation.New York, NY, USA:ACM, 2006:1909-1916.
[2]NEWMAN M E J. Fast algorithm for detecting community structure inNetworks[J]. Physical Review, 2004, 69: 066133.
[3] MANCORIDIS S, MITCHELL B S, RORRES C, et al. Using automatic clusteringto produce high-level system organizations of source code[C]//Pro-ceedings of 6th International Workshop on Program Comprehension.Ischia, Italy:IEEE,1998: 45–52.