張森森 李英梅


摘要 軟件系統的質量很大程度上是由其內部結構決定的, 在對軟件進行優化時往往會使軟件內部結構更加復雜,這樣就可能會降低軟件的性能,所以軟件的結構需要一次次的優化修復。以往存在的方法進行這項操作非常的復雜繁瑣,本文的研究主要是通過共同發掘技術,來實現類結構的代碼重構。這項技術中采用了群落點以及它們之間的依賴關系來代表軟件系統中的方法屬性的依賴關系,按照社區檢測的規則來獲得方法間網絡關系的最優化結構,同時也改善了類的內部結構,實現了軟件類結構的重構。
關鍵字:類結構重構;共同發掘;軟件
中圖分類號:TP391 文獻標識碼: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引言
一般情況下,軟件系統的內部結構對其質量與壽命發揮著關鍵重要的決定性作用。在進行軟件設計時,不可能將所有的需求都添加在軟件中,后期進行功能擴展時就會必然降低軟件的內部結構,所以應該通過軟件重構技術來進行修改。軟件重構是由Fowler在Ref中初次提出,可以對設計增益提供重大幫助,而在添加新功能、改善代碼以及軟件升級時都可以進行重構。而且,重構還能降低開發人員閱讀代碼的難度。綜上所述,本文研究探討的就是類水平上的軟件重構。1 類水平上軟件重構的理論基礎
研究中,主要通過方法之間的引用以及屬性的調用,來找到2個類之間的相互關系,從而實現類水平上的重構。操作針對的是開源軟件,因此應該在復雜的網絡環境中展開和進行。復雜的網絡環境是復雜科學的一個分支,最近開始被各類科學引入研究。復雜的網絡系統發生簡化,實際上就是可以簡化成由特定的點與線組成特定的圖形,通過分析這些相連的線與點來對軟件給出設計闡述。研究復雜的網絡環境,發現這些點與線都可以與現實的網絡環境建立對應關聯,這也成為了復雜網絡環境的基本特性。本文的研究方法也是將復雜的網絡環境實行簡化,把開源中的各個屬性都當作一個點,同時將會研究各點之間的相互關系,從而映射轉換為線,各個點之間線連接的強弱可通過線上的權值來指示和表征。圖1開發了一個簡單的例子,用于說明復雜網絡環境如何通過點與線來進行表示。
盡管目前存在數目可觀的軟件重構方法,但是其中的大多數都是復雜、且耗費時間的。本文的重構方法即是有針對性地通過研究類中屬性之間以及方法之間的關系來確定軟件代碼的屬性與類重構的框架結構,進而提出公共社區檢測算法來實現本文的研究構想。本文研究的簡單操作流程如圖2所示。
1.1 源代碼
設定時,核心操作設定在java代碼上,并且將開源的軟件代碼結構作為主要的研究目標。這樣的優點可表述如下:
1)在java代碼方面已有眾多成果,研究開展時利于對實驗結果與已有成果提供對比,從而對本文方法給出全局有效的性能分析。
2)java代碼在90年代以后即已發展演進成為具備最佳流行度的代碼形式,并且在網站上能夠直接下載到一些開源代碼用于提升改進與分析。
3)代碼在java環境下能夠獲得迅速發展,而且java代碼呈現有清晰的內部結構和元素,例如屬性、類、方法、包。這些內部結構與元素之間的依賴性能夠利于實現分析與檢驗。
1.2軟件元素的收集
本研究方法的第一步就是對軟件元素執行收集。具體就是對軟件的元素例如屬性、類、方法與包進行提取的過程。在此過程中采用的是已經研發面世的軟件工具,這些工具能夠對軟件系統java代碼的源文件中的元素進行分析。由此可獲取的主要是2類依賴關系,分別是:屬性方法依賴關系和方法之間的依賴關系。
1.3數據處理
軟件重構前,還需要將時下的數據處理方法進行區分,這些方法對軟件系統具有至關重要的影響與作用。但在其中卻會有一些特殊的方法雖有重要作用,但卻違背了一些公律規則,需要找到這類的方法(例如一些高內聚與低耦合的方法)并且將其施以進行保留技術策略。所以本研究將只是對那些遵循一般規則的方法實現處理分析。這一步驟在本文中即是數據處理部分,而且與Ref[1]中的分類方法也呈現出高度類似。
通過如上內容分析,本問研究時充分采用的是靜態結構與命名約定的方法。可以將一些方法(例如:恒定法,空方法,去除調節法,收集訪問器,申明方法,化名方法,制造方法等)視作特殊的方法不進行移動。
1.4軟件依賴網絡
數據處理后,就應該建立2種依賴關系圖:屬性方法依賴關系圖與方法間的依賴關系圖。用這2種關系依賴圖為基礎來對方法水平上的代碼重構進行規范與引導。在此,將對這2種依賴關系圖展開如下總結分析。
第一部分,是屬性方法依賴關系圖(AMN)。在屬性方法依賴關系圖中,每一個節點代表的是屬性與方法,并且每一個屬性或者方法均是由唯一的點提供表示。2個點之間的邊代表了屬性與邊之間的設定依賴性。如果方法A與屬性B之間具有相互關系,則邏輯抽象可得:對應方法A的點與屬性B的點之間就有一條邊。這條邊的方向也是可以忽略不計的。文中只是考慮是否存在著依賴關系,對于依賴關系存在的倍數可以忽略不計。圖3給出了AMN的簡單例子,本次研究將AMN的關系描述成:
NetworkAMN=(Nodes,Edges)
其中,NetworkAMN代表的是無向屬性依賴關系,Nodes表示的是代碼中的方法與屬性點,Edges代表的是屬性點之間的連線。
第二部分,則是方法間的依賴關系圖(MMN)。在軟件系統中每個屬性點代表的都是一種方法,并且每一個方法也僅由一個屬性點進行設計表示。2個屬性點之間的邊代表了2個方法之間具有相互依賴性。在文章中,探討的方法依賴關系僅僅考慮2種情況:方法的調用以及相同屬性的訪問。究其本質就是如果方法A之間調用方法B,或者反過來說,方法B直接調用方法A的話,那么方法B與方法A之間就構建形成一條邊。如果方法C調用屬性attr,并且方法D調用屬性attr,則表征方法C與方法D的2個屬性點之間應該具有連線。連線的方向將被忽略,同樣地也將僅是關注方法之間的存在性,而并不考慮各邊之間的倍數大小。圖4給出了MMN的簡單例子,MMN可以被描述為:
Network MMN = (Nodes,Edges)
其中,Network MMN代表的無向網絡,Nodes代表的是方法,Edges代表的是方法之間的依賴性。
2引導社區檢測算法
在復雜的網絡環境中,有諸多方法可以用于實現社區檢測。時下位居主流的方法即是 Newman提出的模塊法,算法整體性能已臻至最優。本次研究中也將采用這種方法來進行對MMN的社區結構評估。
通過新近研究發現,模塊性檢測算法仍然存在一定弊端,即不能夠檢測出小于一定規模的社區群落。這種算法性能主要取決于網絡的總體大小以及網絡互聯性的平均值,即使在群落明確定義的前提之下也很難對一些小的社區做出完備檢測。
針對這一問題,研究提出了處理規則來改進社區檢測算法。具體來說,實現過程源起于方法本身所屬的特殊區域(并不是一個隨機檢測的規則[2]),而且這些方法都是在不同的類中發生移動的,利用社區檢測算法也是對不同類中的方法進行檢測,以此判斷類是否需要控制移動。
對本研究的方法來說,用分區指標來執行質量評估具備重大意義,愿意在于其控制著方法的移動進程。已經存在為數眾多的度量單位來檢驗特定的分工是否具有存在價值,例如Mancoridis發明的MQ介紹辦法[3]。
3類結構重構的核心思想
通過計算移動前后的Q值來確定是否需要引入此移動。本文中的Q就是模塊的核心思想,基礎依據是:如果Q值為正,則說明此研究采用的方法移動可以增強軟件系統的穩定性,其作用效果為良性;同理,如果Q是負值,就證明此時的移動并無實施必要。本文的算法即是通過計算方法之間那些相關聯的主題算法,并將其移動來確定研究中類水平上重構的可行性。展開來說,就是通過簽署建立的依賴關系圖來判定是否需要對軟件代碼中方法實行移動,從而得出需要移動的類。
4結束語
本文研究是通過權值的大小來衡定各個類中依賴關系的強弱。而后可以通過確定2個方法屬性間的依賴關系來評判得到這2個類之間權值的大小。而小的權值即代表了2個方法間弱的依賴關系,為此就軟件的可維護性而言則應該使不同類中的權值盡可能最小。同時,在確定需要設計移動的方法后,對研究的對象進行移動,實現軟件代碼類結構的重構。
本文的研究成果在類結構的重構方法中具有很強的實用性,但此方法的適用性還需要進一步的驗證。未來的后續工作主要是:(1)用其他的開源軟件系統來對方法進行評估。(2)研究一種可以在方法、類、包及軟件系統等不同的層次上都可以進行重構的軟件系統重構方法。
[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.