摘要:編程語言中關(guān)注點(diǎn)的分離一直是被關(guān)注的焦點(diǎn),在這一研究領(lǐng)域已經(jīng)提出一些新的模塊化技術(shù),AOP即是其中之一.本文首先介紹了基于角色的橫切關(guān)注點(diǎn)重構(gòu)方法,然后在此基礎(chǔ)上提出了一種基于模板的橫切關(guān)注點(diǎn)重構(gòu)框架.
關(guān)鍵詞:橫切關(guān)注點(diǎn);面向方面重構(gòu);重構(gòu)框架
中圖分類號:TP311文獻(xiàn)標(biāo)識碼:A文章編號:1009-3044(2008)27-2107-02
The Research of An Aspect——Oriented Refactoring Framework Based on Template
ZHANG Ting-yan, PENG Jian
(Dalian Jiaotong University, College of Software, Dalian LiaoNing 116028, China)
Abstract:The separation of concerns in programming language has been focused on for a long time. In this research field, several new modularity technologies have been proposed, AOP is one of them.. In this article,we describe a role—based refactoring approach for the re —structuring the implementation of crosscutting concerns using aspect—oriented programming, then, we provide a template—based aspect—oriented refactoring framework.
Key words:crosscutting concerns;aspect-oriented refactoring;refactoring framework
1 引言
當(dāng)前OOP(面向?qū)ο缶幊蹋┍粡V泛應(yīng)用于軟件開發(fā)中,OOP能夠?qū)F(xiàn)實(shí)世界中的實(shí)體及其行為抽象為對象,通過類的封裝性、繼承性、多態(tài)性很好地解決了許多問題.但是“代碼混亂”與“代碼糾纏”問題仍然存在于OOP中,例如日志記錄功能,訪問權(quán)限控制功能,異常處理功能等,此類功能被稱為“橫切關(guān)注點(diǎn)”.橫切導(dǎo)致互相關(guān)聯(lián)的代碼經(jīng)常是多余的,而且很難被改變。自90年代開始,對橫切關(guān)注點(diǎn)的分離得到了很大關(guān)注。在六七年中,國外的研究組織進(jìn)行了很多研究,提出了許多解決方法。
1997年,Kiczales等人提出了面向方面編程(Aspect—Oriented Programming,AOP) [1]。在AOP中,最關(guān)鍵的是如何捕捉橫切關(guān)注點(diǎn)并將其以模塊化的方式提取出來,這需要跨越整個(gè)系統(tǒng)進(jìn)行考慮.因此,方面是用來描述跨越整個(gè)系統(tǒng)的一個(gè)屬性的一段代碼。AOP的目的是支持程序員把系統(tǒng)的組件和方面更好地分離,從而使系統(tǒng)更加模塊化.
重構(gòu)是在不改變代碼所實(shí)現(xiàn)功能的前提下,使代碼更加結(jié)構(gòu)化[2]。隨著AOP的廣泛使用,隨著對系統(tǒng)中橫切關(guān)注點(diǎn)的進(jìn)一步挖掘,如何將系統(tǒng)重構(gòu)為用AOP實(shí)現(xiàn)(即面向方面重構(gòu)[3])的這種需求會(huì)越來越廣泛,迫切需要提出一種基于模板的橫切關(guān)注點(diǎn)重構(gòu)框架。
2 基于角色的橫切關(guān)注點(diǎn)重構(gòu)
橫切關(guān)注點(diǎn)重構(gòu)。早期的研究主要集中在特定橫切關(guān)注點(diǎn)的重構(gòu)過程的研究,具體的實(shí)現(xiàn)通常需要手工進(jìn)行。最近,Hannemann和Kiczales等人在論文[4]中提出了一種基于角色的抽象化描述方式,因此也為橫切關(guān)注點(diǎn)的自動(dòng)重構(gòu)提供了一種可能。在論文[5]中Hannemann和Kiczales使用Java和AspectJ分別實(shí)現(xiàn)了GoF的23個(gè)設(shè)計(jì)模式,研究表明其中的17個(gè)模式的AspectJ實(shí)現(xiàn)顯著地提高了模塊性。
3 基于模板的橫切關(guān)注點(diǎn)重構(gòu)框架
雖然Hannemann等人提出了基于角色的橫切關(guān)注點(diǎn)重構(gòu),但這只是對橫切關(guān)注點(diǎn)重構(gòu)抽象的描述,為了將橫切關(guān)注點(diǎn)重構(gòu)進(jìn)一步具體化,我們提出了一種基于模板的橫切關(guān)注點(diǎn)重構(gòu)。
3.1 框架的基礎(chǔ)
1) 框架中必須有一個(gè)對橫切關(guān)注點(diǎn)詳述的XML文檔.從系統(tǒng)中分離出Aspect并在該XML文檔中進(jìn)行聲明.根據(jù)XML文檔中的每個(gè)Aspect聲明,建立相應(yīng)的Aspect,實(shí)現(xiàn)相應(yīng)的功能,從而實(shí)現(xiàn)通過XML文檔把Aspect映象到基本類。
2) 框架中必須有一個(gè)對編織點(diǎn)(其功能是把方面中定義的代碼以一定方式植入組件代碼中)詳述的XML文檔。
3) 框架中必須有一個(gè)對功能模塊進(jìn)行管理的XML文檔,即系統(tǒng)級的配置文件。
(4) 框架中必須有一個(gè)XML解析器,負(fù)責(zé)解釋框架的配置文件。
3.2 框架中基于模板的面向方面重構(gòu)
3.2.1對橫切關(guān)注點(diǎn)詳述的XML模板
<?xmlversion=“1.0”?>
<aspects>
<aspectname=”accessControl”>
<rolename=”administrator”>
<methodname=”…”>
</method>
</role>
<rolename=”commonUser”>
<methodname=”…”>
</method>
</role>
</aspect>
<aspect>
……
</aspect>
</aspects>
代碼段1橫切關(guān)注點(diǎn)訪問權(quán)限控制功能的描述模板
從代碼段1可以看到,橫切關(guān)注點(diǎn)中的每個(gè)抽象角色由一個(gè)<aspect>節(jié)點(diǎn)描述,每個(gè)抽象角色按照其內(nèi)部參數(shù)的不同,實(shí)現(xiàn)不同的方法.使用這種XML格式文件可以使對橫切關(guān)注點(diǎn)的描述更加結(jié)構(gòu)化.代碼段1是對橫切關(guān)注點(diǎn)訪問權(quán)限控制功能的描述模板,同理,可以將日志記錄功能,異常處理功能等橫切關(guān)注點(diǎn)加入描述模板中.
3.2.2對編織點(diǎn)詳述的XML模板
<?xmlversion=“1.0”?>
<weavers>
<weavername=”accessControlWeaver”aspect=”accessControl”target=”Login”>
</weaver>
<weaver>
</weaver>
</weavers>
代碼段2實(shí)現(xiàn)橫切關(guān)注點(diǎn)訪問權(quán)限控制功能與登錄功能模塊編織的編織點(diǎn)的描述模板
從代碼段2可以看到,編織點(diǎn)中的每個(gè)抽象角色由一個(gè)<weaver>節(jié)點(diǎn)描述,每個(gè)<weaver>節(jié)點(diǎn)將不同的aspect與target編織在一起。使用這種XML格式文件可以使編織相對透明化.代碼段2是對實(shí)現(xiàn)橫切關(guān)注點(diǎn)訪問權(quán)限控制功能與登錄功能模塊編織的編織點(diǎn)的描述模板,同理,可以將實(shí)現(xiàn)日志記錄功能,異常處理功能等橫切關(guān)注點(diǎn)與系統(tǒng)功能模塊編織的編織點(diǎn)加入描述模板中。
3.2.3橫切關(guān)注點(diǎn)與編織點(diǎn)的映射
以上我們已經(jīng)構(gòu)建了橫切關(guān)注點(diǎn)與編織點(diǎn)的XML描述模板,下一步我們要將上述模板加入到框架的配置文件中完成橫切關(guān)注點(diǎn)與編織點(diǎn)的映射。
<?xmlversion=“1.0”?>
<modules>
<modulename=”Login”>
<methods>
<methodname=”…”>
</method>
</methods>
</module>
<module>
……
</modules>
<aspects>
<aspectname=”accessControl”>
<rolename=”administrator”>
<methodname=”…”>
</method>
</role>
<rolename=”commonUser”>
<methodname=”…”>
</method>
</role>
</aspect>
<aspect>
……
</aspect>
</aspects>
<weavers>
<weavername=”accessControlWeaver”aspect=”accessControl”target=”Login”>
</weaver>
<weaver>
</weaver>
</weavers>
代碼段3 框架的配置文件
代瑪段1和代碼段2再加上對系統(tǒng)功能模塊的描述構(gòu)成了上述的代碼段3,即框架的配置文件.應(yīng)用文中提出的框架時(shí),由框架中的XML解析器解釋框架的配置文件,將將橫切關(guān)注點(diǎn)的抽象角色與系統(tǒng)相應(yīng)模塊相對應(yīng),從而實(shí)現(xiàn)了橫切關(guān)注點(diǎn)重構(gòu)。這種框架配置文件便于開發(fā)者在開發(fā)過程中動(dòng)態(tài)地添加和刪除橫切關(guān)注點(diǎn),而且使編織更加透明化。
3.3 重構(gòu)框架中橫切關(guān)注點(diǎn)與編織點(diǎn)相互映射的實(shí)現(xiàn)
在上面的橫切關(guān)注點(diǎn)與編織點(diǎn)詳述模板的基礎(chǔ)之上,借助于方面代碼映射器和編織器來完成橫切關(guān)注點(diǎn)的方面化以及將其織入功能模塊代碼中。具體實(shí)現(xiàn)如圖1所示。
4 小結(jié)
本文在基于角色的橫切關(guān)注點(diǎn)重構(gòu)的基礎(chǔ)上提出了一種基于模板的橫切關(guān)注點(diǎn)重構(gòu)框架.在對橫切關(guān)注點(diǎn)詳述的XML模板的基礎(chǔ)上加入了對編織點(diǎn)詳述的XML模板,為橫切關(guān)注點(diǎn)的重構(gòu)提供了一種可能.這僅僅是對橫切關(guān)注點(diǎn)重構(gòu)做的一部分研究,還需要在此基礎(chǔ)上更深層次的對橫切關(guān)注點(diǎn)重構(gòu)問題進(jìn)行挖掘.
參考文獻(xiàn):
[1] KICZALES G,LAMPING J,MENDHEKAR A,et a1.Aspect—Oriented Programming[C].In Proceedings of ECOOP,Springer—Verlag,F(xiàn)inland,1997.
[2] FOWLER,M.Refactoring—Improving the Design of Existing Code.Addison—Wesley,Boston,MA,2000.
[3] VAN DEURSEN A,MARIN,M,MOONEN L.Aspect Mining and Refactoring. First International Workshop on Refactoring:Achievements,Challenges,Effects(REFACE 93)[C].a(chǎn)t 10th Working Conference on Reverse Engineering(WCRE 03),Victoria,BC,Canada,2003.
[4] HANNEMANN J,MURPHY G.C,KICZALES G.Role—Based Refactoring of Crosscutting Concerns[C].In Proceedings of International Conference on Aspect—Oriented Software Development,2005.
[5] HANNEMANN J,KICZALES,G.Design Pattern Implementation in Java and AspectJ[C].In Proceedings of the 17th Annum ACM Conference on Object—Oriented Programming,Systems,Languages,and Applications (OOPSLA02).Seattle,WA,November 2002.