【摘要】本文主要研究如何從源代碼中自動抽取出設計模式,并研究了相關的技術。論文闡述了自動抽取技術的過程,首先是結構分析,通過分析XMI文檔,提取出類的結構特征,接著是動態分析。運用結構分析階段后將產生一些模式候選項,這些模式候選項是一些由類和方法組成的結構,將作為動態分析的輸入,動態分析監控模式候選項的動態執行的情況,得出進一步的結果。論文的結論就是作為抽取設計模式的目的是可以自動(或半自動)抽取任何JAVA程序中的設計模式。
【關鍵詞】設計模式;結構分析;行為分析;XMI
一、引言
設計模式是面向對象設計的一個高級抽象,從程序理解和軟件維護的觀點出發,一個設計模式提供了模式結構中每個類的角色信息和模式各組成元素的關系以及模式組成元素和系統其余部分關系的信息。因此,源碼中設計模式的抽取是逆向工程中的一個關鍵問題。對于缺少分析和設計文檔的軟件系統來說,從它的源碼中抽取設計模式有助于軟件系統的理解和文檔化,增強軟件系統的可維護性。進一步,能識別軟件系統中引入設計模式后可以改進的地方并進行相應的修改,提高了源碼質量,從而達到軟件重構的目的。
二、技術現狀
設計模式比源代碼更高層次地描述了軟件系統,設計模式也是描述部分設計的一種方式。設計模式是一種表示設計結構的技術,通過掌握設計的思路設計模式保存了設計的關鍵信息,設計模式定義了類、實例、角色、關系和責任分配,一個好的軟件結構可以被快速應用解決問題而不用重新設計,設計模式就是被定義好的常見問題解決方案的抽象設計。當一些情形經常出現時,可以選擇設計模式解決相應問題而不用每次都分析問題再想辦法解決,例如調停者模式被選擇來解決一個特定的設計問題而不用重新設計。選擇了設計模式無論做文檔還是解釋說明都顯得更容易,在面向對象開發過程中設計模式起了很多作用[1]:
本文所涉及的設計模式是指Gamma等人在文獻[1]中提出的23個通用的設計模式。Gamma等從動機、目的、參與者、協作、應用效果、解決方案幾個方面描述設計模式。為了便于軟件工程師在實際應用過程中理解、選擇和實現設計模式,除解決方案部分外,設計模式的動機、目的、參與者、協作、應用效果等項內容通常以非形式化的方式描述。解決方案部分使用OMT圖描述一個通用的設計結構。從源碼中抽取設計模式必然要求對其進行描述,采用某種表示方法如PROLOG規則、抽象語法樹,約束可滿足問題(CSP)的變量和約束條件等,對設計模式所表達的對象結構和行為進行抽象,并將這些設計模式表示存儲在便于修改和維護的設計知識庫中。
計模式抽取在理論和自動化工具的開發方面的研究都取得了進展,但還存在一些困難和問題,如基于設計模式解法部分的設計模式識別規則的定義多種多樣,實現方式各異,沒有廣泛適用的規范;實際可用的設計模式抽取工具較少,成型的工具大都作為龐大的逆向工程環境的一部分,模塊化程度不高;設計模式抽取的結果因設計模式特點、抽取的目標語言和目標系統而差別很大,實際應用困難等。
三、一般基于源代碼的設計模式抽取方法的步驟
一般而言,從Java軟件中抽取設計模式的過程分解成以下三個步驟:
(1)對設計模式建模和描述,生成設計模式的中間表示模型;
(2)以查找設計模式為目的,分析軟件系統的Java代碼,抽取源碼信息模型;
(3)比較中間模型和信息模型的相似性,從而識別Java代碼中的設計模式實例。
四、基于XMI的方法
XML元數據交換(XML Metadata Interchange,XMI)是一種標準,這種標準能夠使用可擴展標記語言(Extensible Markup Language,XML)來表達對象,XML也是萬維網上表示數據的普遍格式。XMI不僅僅是一套有序的規則,它還與建模標準密切相關,這使得用戶可以在XML應用中有效地進行建模操作。XMI2.0詳細說明了如何從模型中創建XML模式(schema),而以前的XMI版本則詳細說明了如何從模型中創建XML的文檔類型定義(Document Type Definition,DTD)。模式與DTD都定義了XML文檔的內容。[2]
XMI是創建應用程序所需要的,由于XML不是面向對象的,因此需要將對象映射到XML。由于XML的靈活性,因此可以有多種映射方式。盡管如此,在交換XML文檔的時候,這種靈活性也會帶來一定問題。如果一個工具利用了一種方法將對象映射到XML,而另一個工具將對象映射到XML卻使用了另外一種方法,那么這兩種工具就不可能正確地解釋對方的XML文檔。XMI使用模型來確認對象是共享的。一個使用了XMI的工具能夠與使用XMI的其他工具交換對象。
XMI使用了兩個相關的標準:可擴展標記語言(Extensible Markup Language,XML)和統一建模語言(Unified Modeling Language,UML)。XMI是以XML為基礎的;XMI使用XML從文檔中保存及加載對象。而UML定義了對象和類的結構,使用這種定義來解釋XMI怎樣在XML中說明對象和類的。
五、結構分析
在一個大型軟件系統中,包含類的個數往往成百成萬個。而每個類都有不同類型的屬性和方法。為了提高代碼的重用和效率,這些類之間往往以一種相對復雜的方式關聯。因此,從這么多類中抽取出一個模式就變成一項非常復雜的任務。為了解決這個問題,我們首先僅僅考慮結構特征,減少了分析類的范圍。我們所說的結構特征包含了屬性的個數,方法的個數,以及類型,如抽象類,具體類或者接口,以及與其他類的關系。
設計模式抽取工具的輸入是XMI文檔,它包含了被分析的軟件的UML類圖的信息。工具直接分析XMI文檔,代替了直接分析源代碼。從UML類圖生成XMI文檔,已經在上一章中詳細闡述了步驟。就目前而言,通過使用我們使用的Rational Rose從源代碼逆向工程到順序圖是不可能的。因此,XMI文檔僅僅包含了UML類圖的相關信息。
結構分析過程框架如下結構分析階段的整個過程的方法框架。與一般的從源代碼中設計模式抽取的過程類似。
整個過程可以分成三個步驟完成:
(1)對要抽取的目標設計模式進行分析建立特征模型,分一下兩步進行:
a.設定特定設計模式的特征權重;
b.建立特定設計模式的特征權重關系矩陣。
(2)對源代碼逆向工程所得的XMI文檔進行分析:
a.統計XMI中每個類的特征元素的權重;
b.建立系統特征的關系矩陣。
(3)利用匹配算法把在第一步中獲得的模式關系矩陣和在第二步中得到的系統的關系矩陣進行匹配。[3]
六、行為分析
一般而言,設計模式通常包含了結構和行為兩方面的信息。結構信息描述了模式中的類之間的靜態的結構關系。行為信息表示了模式中對象之間的動作和交互的序列細節。因此,僅僅使用結構分析抽取出的設計模式的方法是不充分的。經過結構分析后的結果中包含了1 positives實例。而行為分析的結果是減少1 positives實例。
結構分析已經產生一些可能的設計模式實例的候選模式實例集合,動態分析將把這些經過結構分析獲得的候選集合信息作為輸入并產生一個相同或更少數目的集合。行為分析將不產生新的設計模式的實例,它只檢查候選集合,檢查每個設計模式實例的期望的行為特征,也就是說把1 positives的候選項去除。
結構分析和行為分析之間的不同在于結構分析主要檢查類之間的交互而行為分析則關注不同類實例或對象之間的通訊。這就意味著結構分析只會作一次相同檢查而行為分析可能重復多次相同的檢查,檢查次數取決于相同類有多少個對象實例存在以及它們如何交互,重復多次相同的檢查的原因是對象可以以不同方式創建,因為這個原因,它們可能擁有不同的屬性需要分別分析。行為分析的結果可能和前面做的結構分析結果相似。
行為分析的主要目的是找到類之間存在的依賴關系,或者是否存在一些類委派的方法調用。對每一個特別的設計模式,行為分析是不同的,類似與結構分析階段我們所做的。對于設計模式的特征的行為分析相對于結構分析要復雜的多。行為分析的主要困難是對于相似的期望行為有多種實現方式。
七、總結
從源代碼中抽取出設計模式的實例,對于提高軟件可理解性和可維護性、軟件設計重用以及軟件重構具有重要意義。論文著重論述了基于XMI的兩階段抽取設計模式實例的方法,該方法主要分為結構分析和行為分析兩個階段來完成。其中第一個階段是結構分析,通過分析XMI文檔獲得類的結構特征,抽取出候選設計模式實例的集合,第二階段是行為分析,分析第一階段中設計模式實例的候選集合,掃描源代碼以去除候選集合中的1 positive設計模式實例。
參考文獻
[1]E.Gamma,R.Helm,R.Johnson,et al.設計模式:可復用面向對象軟件的基礎(第一版)[M].李英軍,等譯.北京:機械工業出版社,2000.
[2]林輝躍.面向對象軟件中設計模式的智能抽取技術研究[D].碩士學位論文,2013.
[3]S.Tilley,K.Wong,H.Muller,etal.Structural redocumentation:A case study.IEEE Software,1995,12(1):46-54.
[4]D.Heuzeroth,T.Holl,G.Hostrom,et al.Automatic Design Patern Detection.in:Proc.of the 11th IEEE Intenrational Workshop on Program Comprehension.Portla nd,Oregon.2003.USA:IEEE Computer Society,2003:94-99.
[5]XMI Metadata Interchange.http://www.omg.org/technology/documents/formal/xmi.htm,Jan.2006.
[6]SUN Microsytems.AWT,the SUN Java Abstract Window Toolkit.http://java.sun.com/products/jdk/awt,Feb.2006.
[7]馮鐵,李文錦,張家晨.從源碼中抽取設計模式技術研究綜述[J].計算機應用研究,2005(8).
[8]馮鐵,李文錦,張家晨,柴勝.面向Java語言的設計模式抽取方法的研究[J].計算機工程與應用,2005.
[9]馬越峰,李凡,陳平.基于程序源代碼的設計模式自動發現技術研究[J].計算機科學,2005,32.
[10]Jing Dong,Dushyant S.Lad,Yajing Zhao.DP-Miner:Design Pattern Discovery Using Matrix.Proceeding of the 14thAnnual IEEE International Conference and Workshops on the Engineering of Computer-Based Sysems,2007.
[11]徐強,金艷紅,等譯.精通XMI——使用XMI、XML和UML進行Java編程[J].電子工業出版社,2004,2.
[12]劉利秋,等譯.從頭學XML和Java編程一例通[M].機械工業出版社,2003,8.
[13]閻紅編著.Java與模式[M].電子工業出版社,2002,10.
作者簡介:儲赟(1981—),女,江蘇常州人,碩士,現供職于華東政法大學信息化辦公室。