面向方面的程序設(shè)計_第1頁
面向方面的程序設(shè)計_第2頁
面向方面的程序設(shè)計_第3頁
面向方面的程序設(shè)計_第4頁
面向方面的程序設(shè)計_第5頁
已閱讀5頁,還剩51頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、1面向方面的程序設(shè)計面向方面的程序設(shè)計兼談計算科學的創(chuàng)新兼談計算科學的創(chuàng)新2面向方面的程序設(shè)計面向方面的程序設(shè)計nAspect oriented programming(AOP)3n Xerox(施樂施樂)公司公司PARC研究中心在研究中心在19971997年的歐洲年的歐洲面向?qū)ο缶幊檀髸嫦驅(qū)ο缶幊檀髸‥COOP97ECOOP97)上首次提出)上首次提出Aspect-Aspect-oriented programmingoriented programming(AOPAOP)。n 自自20022002年起,每年分別在歐洲和美國輪流召開專門年起,每年分別在歐洲和美國輪流召開專門的面向方面軟

2、件開發(fā)(的面向方面軟件開發(fā)(AOSDAOSD)國際會議。與會者包括)國際會議。與會者包括美國、加拿大、荷蘭、英國、法國、丹麥、日本、以美國、加拿大、荷蘭、英國、法國、丹麥、日本、以色列等。我國一些學校也對色列等。我國一些學校也對AOPAOP給以關(guān)注并開展了一些給以關(guān)注并開展了一些研究工作。研究工作。n 從從AOP概念提出經(jīng)過了近十年的時間,這種技術(shù)概念提出經(jīng)過了近十年的時間,這種技術(shù)現(xiàn)在已經(jīng)開始被工業(yè)界采用?,F(xiàn)在已經(jīng)開始被工業(yè)界采用。 4AOPAOP產(chǎn)生的背景產(chǎn)生的背景 計算機軟件設(shè)計的一個重要原則,就是要清計算機軟件設(shè)計的一個重要原則,就是要清晰晰分離各種關(guān)注點分離各種關(guān)注點(separat

3、ion of concerns),然),然后分而治之,各個擊破,最后形成統(tǒng)一的解決方案。后分而治之,各個擊破,最后形成統(tǒng)一的解決方案。業(yè)務(wù)邏輯存儲日志安全需求關(guān)注點標識5 關(guān)注點:是指一個特定的目標、概念或者興趣域。關(guān)注點:是指一個特定的目標、概念或者興趣域。n從技術(shù)的角度,軟件系統(tǒng)分別包括從技術(shù)的角度,軟件系統(tǒng)分別包括核心級和系統(tǒng)級核心級和系統(tǒng)級的關(guān)的關(guān)注點。注點。n核心級關(guān)注點是系統(tǒng)要完成的核心級關(guān)注點是系統(tǒng)要完成的業(yè)務(wù)功能業(yè)務(wù)功能;n系統(tǒng)級關(guān)注點是完成核心級關(guān)注點所必須的系統(tǒng)級關(guān)注點是完成核心級關(guān)注點所必須的配套設(shè)施配套設(shè)施,這,這些配套設(shè)施通常被認為是整個系統(tǒng)的系統(tǒng)特性,或者是業(yè)些配套

4、設(shè)施通常被認為是整個系統(tǒng)的系統(tǒng)特性,或者是業(yè)務(wù)功能的功能約束。務(wù)功能的功能約束。例如:信用卡處理系統(tǒng)例如:信用卡處理系統(tǒng) 核心關(guān)注點是核心關(guān)注點是處理付款處理付款; 系統(tǒng)級關(guān)注點包括系統(tǒng)級關(guān)注點包括日志、事務(wù)、認證、安全和性日志、事務(wù)、認證、安全和性能能等等。等等。6n軟件系統(tǒng)中,某個行為,例如操作日志的軟件系統(tǒng)中,某個行為,例如操作日志的記錄,存在于軟件的各個部分中,這個行記錄,存在于軟件的各個部分中,這個行為可以看作是橫向存在于軟件之中,他所為可以看作是橫向存在于軟件之中,他所關(guān)注的是軟件的各個部分的一些共有的行關(guān)注的是軟件的各個部分的一些共有的行為。為。n在很多情況下,這種行為不屬于業(yè)務(wù)

5、邏輯在很多情況下,這種行為不屬于業(yè)務(wù)邏輯的一部分。這種操作并不是業(yè)務(wù)邏輯調(diào)用的一部分。這種操作并不是業(yè)務(wù)邏輯調(diào)用的必須部分,但是,我們卻往往不得在代的必須部分,但是,我們卻往往不得在代碼中顯式進行調(diào)用,并承擔由此帶來的后碼中顯式進行調(diào)用,并承擔由此帶來的后果。果。7n在目前的技術(shù)框架下,通常在目前的技術(shù)框架下,通常系統(tǒng)級關(guān)注點在系統(tǒng)級關(guān)注點在邏輯上邏輯上相互之相互之間間彼此正交(相互獨立),彼此正交(相互獨立),同時在同時在實現(xiàn)上實現(xiàn)上趨向于趨向于和若干核和若干核心模塊交織心模塊交織。 例如:信用卡管理系統(tǒng)的每個核心業(yè)務(wù)關(guān)注點都和安全、例如:信用卡管理系統(tǒng)的每個核心業(yè)務(wù)關(guān)注點都和安全、日志等系

6、統(tǒng)關(guān)注點相聯(lián)系。日志等系統(tǒng)關(guān)注點相聯(lián)系。8n核心級關(guān)注點核心級關(guān)注點(業(yè)務(wù))多數(shù)情況下可以(業(yè)務(wù))多數(shù)情況下可以被很好地分解,并被很好地分解,并通過編程語言模塊化通過編程語言模塊化實現(xiàn)(子模塊或軟構(gòu)件)實現(xiàn)(子模塊或軟構(gòu)件)。n系統(tǒng)級關(guān)注點系統(tǒng)級關(guān)注點(橫向關(guān)注點),使用當(橫向關(guān)注點),使用當前的程序設(shè)計方法導(dǎo)致前的程序設(shè)計方法導(dǎo)致在許多構(gòu)件中要在許多構(gòu)件中要重復(fù)包含(擴散)這些代碼重復(fù)包含(擴散)這些代碼。9橫切示例(crosscutting)nAuthentication 權(quán)限權(quán)限nCaching 緩存緩存nContext passing 內(nèi)容傳遞內(nèi)容傳遞nError handling

7、錯誤處理錯誤處理nLazy loading 懶加載懶加載nDebugging 調(diào)試調(diào)試nLogging、tracing、profiling and monitoring 日志、跟蹤、日志、跟蹤、優(yōu)化、校準優(yōu)化、校準nPerformance optimization 性能優(yōu)化性能優(yōu)化nPersistence 持久化持久化nResource pooling 資源池資源池nSynchronization 同步同步nTransactions 事務(wù)事務(wù)10現(xiàn)有軟件技術(shù)的不足 目前的實現(xiàn)技術(shù)只提供了一維方法學實現(xiàn)系統(tǒng)的關(guān)注點,該單一維度一般是核心需求和關(guān)注點的模塊化實現(xiàn),其他類型的需求也被迫和該主導(dǎo)維度一

8、致。安安全全事事務(wù)務(wù)業(yè)業(yè)務(wù)務(wù)業(yè)務(wù)主導(dǎo)維業(yè)務(wù)主導(dǎo)維 問題空間是問題空間是n n維的,而解空間是一維的。這種失配必然導(dǎo)致需求和維的,而解空間是一維的。這種失配必然導(dǎo)致需求和實現(xiàn)之間的失配。實現(xiàn)之間的失配。11源程序就會變成一些為不同關(guān)注目的而編制的源程序就會變成一些為不同關(guān)注目的而編制的指令的纏結(jié)混亂物。指令的纏結(jié)混亂物。纏結(jié)現(xiàn)象纏結(jié)現(xiàn)象是現(xiàn)有軟件系統(tǒng)中許多不必要的是現(xiàn)有軟件系統(tǒng)中許多不必要的復(fù)雜性的核心復(fù)雜性的核心。它增加了功能構(gòu)件之間的依賴性,它增加了功能構(gòu)件之間的依賴性,分散了構(gòu)件原來假定要做的事情,分散了構(gòu)件原來假定要做的事情,提供了許多程序設(shè)計出錯的機會,提供了許多程序設(shè)計出錯的機會,使

9、得一些功能構(gòu)件難以復(fù)用,使得一些功能構(gòu)件難以復(fù)用,源代碼難以開發(fā)、理解和發(fā)展。源代碼難以開發(fā)、理解和發(fā)展。12v某一應(yīng)用的領(lǐng)域?qū)<遥惶赡軐Ψ植肌⒄J證、某一應(yīng)用的領(lǐng)域?qū)<?,不太可能對分布、認證、訪問控制、同步、加密、冗余等問題的復(fù)雜實訪問控制、同步、加密、冗余等問題的復(fù)雜實現(xiàn)機制很熟悉,所以就不能保證他們在程序中現(xiàn)機制很熟悉,所以就不能保證他們在程序中進行正確的調(diào)用。進行正確的調(diào)用。v開發(fā)人員很難正確預(yù)見到未來對程序的新需求開發(fā)人員很難正確預(yù)見到未來對程序的新需求。13方面(Aspect)n設(shè)計上講,是橫切系統(tǒng)的一些軟件系統(tǒng)級關(guān)注點。設(shè)計上講,是橫切系統(tǒng)的一些軟件系統(tǒng)級關(guān)注點。n實現(xiàn)上講,它

10、支持將橫切系統(tǒng)的關(guān)注點封裝在單獨的模塊單實現(xiàn)上講,它支持將橫切系統(tǒng)的關(guān)注點封裝在單獨的模塊單位中,它是位中,它是AOP將橫切關(guān)注點局部化和模塊化的實現(xiàn)機制。將橫切關(guān)注點局部化和模塊化的實現(xiàn)機制。n常見的常見的“方面方面”:異常和出錯處理異常和出錯處理同步和并發(fā)控制同步和并發(fā)控制 內(nèi)存訪問模式內(nèi)存訪問模式日志、安全日志、安全事務(wù)、性能事務(wù)、性能14 AOP AOP核心內(nèi)容就是所謂的核心內(nèi)容就是所謂的“橫切關(guān)注點橫切關(guān)注點”,即,即“方面方面”,AspectAspect是是AOPAOP提供的一種程序設(shè)計單元。提供的一種程序設(shè)計單元。而在而在OOP中中,這些一般關(guān)注點的實現(xiàn)單元叫作類這些一般關(guān)注點的

11、實現(xiàn)單元叫作類 AOPAOP的目標,是要將這些橫切關(guān)注點與業(yè)務(wù)邏的目標,是要將這些橫切關(guān)注點與業(yè)務(wù)邏輯代碼相分離,從而得到更好的軟件結(jié)構(gòu)、性能以輯代碼相分離,從而得到更好的軟件結(jié)構(gòu)、性能以及穩(wěn)定性等方面的好處。及穩(wěn)定性等方面的好處。 AOPAOP被認為是后面向?qū)ο髸r代的一種新的重要被認為是后面向?qū)ο髸r代的一種新的重要的程序設(shè)計技術(shù)。的程序設(shè)計技術(shù)。15AOP的基本思想n通過分別描述系統(tǒng)的不同關(guān)注點及其關(guān)系,以一種松耦合的方通過分別描述系統(tǒng)的不同關(guān)注點及其關(guān)系,以一種松耦合的方式實現(xiàn)單個關(guān)注點,然后依靠式實現(xiàn)單個關(guān)注點,然后依靠AOP環(huán)境的支撐機制,將這些關(guān)環(huán)境的支撐機制,將這些關(guān)注點組織或編排

12、成最終的可運行程序。注點組織或編排成最終的可運行程序。 普通關(guān)注點可以使用傳統(tǒng)的結(jié)構(gòu)化方法和面向?qū)ο蠓椒w統(tǒng)的機普通關(guān)注點可以使用傳統(tǒng)的結(jié)構(gòu)化方法和面向?qū)ο蠓椒w統(tǒng)的機制。制。 系統(tǒng)關(guān)注點使用系統(tǒng)關(guān)注點使用Aspect機制。機制。16AOP程序設(shè)計的一般步驟n一、一、對需求規(guī)約進行對需求規(guī)約進行Aspect分解。分解。n確定哪些功能是組件必須實現(xiàn)的,即提取出確定哪些功能是組件必須實現(xiàn)的,即提取出核心核心關(guān)注點。關(guān)注點。n哪些功能可以以哪些功能可以以aspect的形式動態(tài)加入到系統(tǒng)組的形式動態(tài)加入到系統(tǒng)組件中去,即提取出系統(tǒng)級的件中去,即提取出系統(tǒng)級的橫切關(guān)注點橫切關(guān)注點。17AOP程序設(shè)計的一

13、般步驟n二、二、對標識出的對標識出的Aspect分別通過程序機制實現(xiàn)。分別通過程序機制實現(xiàn)。 構(gòu)造系統(tǒng)的組件。構(gòu)造系統(tǒng)的組件。 利用利用組件語言組件語言實現(xiàn)系統(tǒng)的組件。對于實現(xiàn)系統(tǒng)的組件。對于OOP語言,這些組件可以是語言,這些組件可以是類;對于過程化程序設(shè)計語言,這些組件可以是各種函數(shù)和類;對于過程化程序設(shè)計語言,這些組件可以是各種函數(shù)和API。 構(gòu)造系統(tǒng)的構(gòu)造系統(tǒng)的aspect。 利用一種或多種利用一種或多種aspect語言語言實現(xiàn)實現(xiàn)aspect。 aspect語言必須提供聲明語言必須提供聲明aspect的機制。的機制。aspect如何聲明如何聲明連接點如何定義連接點如何定義aspect

14、代碼如何定義代碼如何定義aspect的參數(shù)化程度等的參數(shù)化程度等18n三、三、用用aspect編織器將所有的單元編排重組在一起,形成最終的可運行編織器將所有的單元編排重組在一起,形成最終的可運行系統(tǒng)。系統(tǒng)。 為組件語言和為組件語言和aspect語言構(gòu)造相應(yīng)的語法樹;依據(jù)語言構(gòu)造相應(yīng)的語法樹;依據(jù)aspect中的連接點中的連接點定義對語法樹進行聯(lián)結(jié);在連接的語法樹上生成中間文件或目標代碼。定義對語法樹進行聯(lián)結(jié);在連接的語法樹上生成中間文件或目標代碼。 aspect語言必須提供將語言必須提供將aspect代碼和基礎(chǔ)代碼組合編排(代碼和基礎(chǔ)代碼組合編排(weaving)在一起的機制。在一起的機制。定

15、義編排語言和規(guī)則。定義編排語言和規(guī)則。解決解決aspect之間潛在的沖突。之間潛在的沖突。為組裝和執(zhí)行建立外部約束。為組裝和執(zhí)行建立外部約束。 aspect語言必須提供生成可運行系統(tǒng)的實現(xiàn)機制。語言必須提供生成可運行系統(tǒng)的實現(xiàn)機制。系統(tǒng)的組合是在編譯時靜態(tài)組裝還是運行時動態(tài)進行。系統(tǒng)的組合是在編譯時靜態(tài)組裝還是運行時動態(tài)進行。對程序單元分別進行編譯的模塊化編譯機制。對程序單元分別進行編譯的模塊化編譯機制。對組裝結(jié)果的驗證機制等。對組裝結(jié)果的驗證機制等。19AOP的本質(zhì)n 將橫切關(guān)注點(如日志、權(quán)限驗證、并發(fā)控制等非功能需將橫切關(guān)注點(如日志、權(quán)限驗證、并發(fā)控制等非功能需求)單獨用求)單獨用as

16、pect實現(xiàn),而業(yè)務(wù)功能用現(xiàn)有的軟件技術(shù)實實現(xiàn),而業(yè)務(wù)功能用現(xiàn)有的軟件技術(shù)實現(xiàn)。由現(xiàn)。由AOP機制提供將這些分離的關(guān)注點編織為一個可執(zhí)行機制提供將這些分離的關(guān)注點編織為一個可執(zhí)行程序。程序。n提高代碼的可理解性、可維護性、可復(fù)用性等。提高代碼的可理解性、可維護性、可復(fù)用性等。橫切關(guān)注點橫切關(guān)注點20AOP系統(tǒng)的軟件開發(fā)過程業(yè)務(wù)邏輯存儲日志安全需求關(guān)注點標識編織器Aspect分解Aspect重組21AOP與OOP比較OOP是是AOP的技術(shù)基礎(chǔ),的技術(shù)基礎(chǔ),AOP是對是對OOP的繼承和發(fā)的繼承和發(fā)展。展。n可擴展性:可擴展性: 指軟件系統(tǒng)在需求更改時程序的易更改能力。指軟件系統(tǒng)在需求更改時程序的易

17、更改能力。 OOP主要通過提供繼承和重載機制來提高軟件的主要通過提供繼承和重載機制來提高軟件的可擴展性??蓴U展性。 AOP通過擴展通過擴展Aspect或增加或增加Aspect,系統(tǒng)相關(guān)的,系統(tǒng)相關(guān)的各個部分都隨之產(chǎn)生變化。各個部分都隨之產(chǎn)生變化。22n可重用性:可重用性: 指某個應(yīng)用系統(tǒng)中的元素被應(yīng)用到其他應(yīng)用系統(tǒng)的能指某個應(yīng)用系統(tǒng)中的元素被應(yīng)用到其他應(yīng)用系統(tǒng)的能力。力。 OOP以類機制作為一種抽象的數(shù)據(jù)類型,提供了比過以類機制作為一種抽象的數(shù)據(jù)類型,提供了比過程化更好的重用性。程化更好的重用性。nOOP的重用性對非特定于系統(tǒng)的功能模塊有很好的支持,的重用性對非特定于系統(tǒng)的功能模塊有很好的支持

18、,如堆棧的操作和窗口機制的實現(xiàn)。如堆棧的操作和窗口機制的實現(xiàn)。n對于不能封裝成類的元素,如異常處理等,很難實現(xiàn)重對于不能封裝成類的元素,如異常處理等,很難實現(xiàn)重用。用。AOP使不能封裝成類的元素的重用成為可能。使不能封裝成類的元素的重用成為可能。23n易理解性和易維護性易理解性和易維護性n代碼纏結(jié)問題的存在,使代碼纏結(jié)問題的存在,使OOP技術(shù)在易理解性和易維護技術(shù)在易理解性和易維護性方面都難有很大的提高。性方面都難有很大的提高。n統(tǒng)計發(fā)現(xiàn):統(tǒng)計發(fā)現(xiàn):“如果一個他人寫的程序有如果一個他人寫的程序有37處需要改動,處需要改動,對于一個最優(yōu)秀的軟件開發(fā)人員,也大概只能找到對于一個最優(yōu)秀的軟件開發(fā)人員

19、,也大概只能找到35個個”。n對于對于AOP,對一個,對一個Aspect修改可以通過聯(lián)結(jié)器影響到修改可以通過聯(lián)結(jié)器影響到系統(tǒng)相關(guān)的各個部分,從而大大提高系統(tǒng)的易維護性。系統(tǒng)相關(guān)的各個部分,從而大大提高系統(tǒng)的易維護性。24AOP特性nAspect的實現(xiàn)和傳統(tǒng)開發(fā)方法中的實現(xiàn)和傳統(tǒng)開發(fā)方法中模塊的實現(xiàn)不同模塊的實現(xiàn)不同。 Aspect的開發(fā)彼此獨立,是一種松耦合關(guān)系。的開發(fā)彼此獨立,是一種松耦合關(guān)系。 主代碼的開發(fā)者甚至可能沒有意識到主代碼的開發(fā)者甚至可能沒有意識到aspect的存在。的存在。只是在最后系統(tǒng)組裝時,才將各只是在最后系統(tǒng)組裝時,才將各aspect代碼和主代碼代碼和主代碼編排融合在一起

20、。編排融合在一起。主代碼和主代碼和AspectAspect之間采用之間采用“隱式調(diào)用隱式調(diào)用”。v 某一應(yīng)用的領(lǐng)域?qū)<?,不太可能對分布、認證、訪問控制、同步、某一應(yīng)用的領(lǐng)域?qū)<?,不太可能對分布、認證、訪問控制、同步、加密、冗余等問題的復(fù)雜實現(xiàn)機制很熟悉,所以就不能保證他們加密、冗余等問題的復(fù)雜實現(xiàn)機制很熟悉,所以就不能保證他們在程序中進行正確的調(diào)用。在程序中進行正確的調(diào)用。v 開發(fā)人員很難正確預(yù)見到未來對程序的新需求。開發(fā)人員很難正確預(yù)見到未來對程序的新需求。25AspectJnAspectJ是是Xerox PARC開發(fā)的基于開發(fā)的基于Java語言語言的的AOP擴展,它既是一種規(guī)約語言,也是一

21、擴展,它既是一種規(guī)約語言,也是一種種AOP的實現(xiàn)語言。的實現(xiàn)語言。nAspectJ是一種支持是一種支持“面向面向Aspect”概念的語言。概念的語言。26AspectJnAspectJ提供了支持提供了支持“面向面向Aspect”概念的如下語言結(jié)構(gòu)及定概念的如下語言結(jié)構(gòu)及定義:義: Joinpoints:預(yù)定義好的程序的特定執(zhí)行點。:預(yù)定義好的程序的特定執(zhí)行點。例如:例如: 方法的調(diào)用和執(zhí)行方法的調(diào)用和執(zhí)行 對屬性的讀寫訪問對屬性的讀寫訪問 異常處理異常處理 對象和類的初始化執(zhí)行對象和類的初始化執(zhí)行 構(gòu)造器的調(diào)用和執(zhí)行構(gòu)造器的調(diào)用和執(zhí)行27 Pointcuts:用來指明所需連接點的語言元素用來指

22、明所需連接點的語言元素??赡馨ㄒ幌悼赡馨ㄒ幌盗械倪B接點列的連接點,同時它還可以為在連接點上執(zhí)行的通知提供上同時它還可以為在連接點上執(zhí)行的通知提供上下文下文。例如:例如: pointcut callSetter( ); call (public void HelloWorld.set*(.)。 其中:其中: pointcut說明聲明的是一個切入點,命名說明聲明的是一個切入點,命名 callSetter,后面的,后面的空括號表示該切入點不需要上下文信息??绽ㄌ柋硎驹撉腥朦c不需要上下文信息。 Call表示該切入點捕獲的是對指定方法的調(diào)用,指定的方法是表示該切入點捕獲的是對指定方法的調(diào)用,指定的方

23、法是在類在類HelloWorld中聲明的共有的、返回值為空、以中聲明的共有的、返回值為空、以set開頭、開頭、擁有任意參數(shù)的方法。擁有任意參數(shù)的方法。28 Advices:要在:要在Pointcuts執(zhí)行的執(zhí)行的Aspect的代碼。的代碼。 AspectJ提供了提供了3種把通知關(guān)聯(lián)到連接點的方式:種把通知關(guān)聯(lián)到連接點的方式:after、before、around。 after和和before分別表示通知在連接分別表示通知在連接點的前面或者后面運行,點的前面或者后面運行,around則表示通知在連接點則表示通知在連接點的外面運行,并可以決定是否運行此連接點。的外面運行,并可以決定是否運行此連接點

24、。 例如:例如: 在銀行信息系統(tǒng)中,實現(xiàn)帳戶存取模塊、權(quán)限驗證模在銀行信息系統(tǒng)中,實現(xiàn)帳戶存取模塊、權(quán)限驗證模塊和日志記錄模塊。帳戶存取模塊可用塊和日志記錄模塊。帳戶存取模塊可用OOP技術(shù)來實技術(shù)來實現(xiàn),其他的模塊可采用現(xiàn),其他的模塊可采用AOP技術(shù)。技術(shù)。 在在around通知中驗證權(quán)限,只有驗證通過才運行該連通知中驗證權(quán)限,只有驗證通過才運行該連接點,在接點,在before和和after通知中就輸出日志記錄。通知中就輸出日志記錄。 Aspect:上述三者的結(jié)合。以類似于類的概念,將:上述三者的結(jié)合。以類似于類的概念,將Pointcut和和Advice組合在一起,形成一個程序單元。組合在一起

25、,形成一個程序單元。29nAspectJ為程序員提供了編譯、調(diào)試等工具。為程序員提供了編譯、調(diào)試等工具。nAspect編排器編排器n將不同將不同aspect組裝到一起。組裝到一起。nAspect調(diào)試器調(diào)試器n獨立的獨立的Aspect瀏覽器瀏覽器n和一些流行的和一些流行的IDE環(huán)境(環(huán)境( Forte 、 Jbuilder 、 Emacs )的集成。)的集成。nAspectJ可以引入新的數(shù)據(jù)成員和新的方法??梢砸胄碌臄?shù)據(jù)成員和新的方法。30應(yīng)用示例應(yīng)用示例1:1:一個簡單的使用面向?qū)ο蠓椒ㄔO(shè)計的圖元編輯器的示例。在該圖元編輯器在該圖元編輯器中,抽象圖元類中,抽象圖元類FigureElement

26、有有兩個圖元子類兩個圖元子類Point和和Line,分,分別對點和線進行別對點和線進行管理。這兩個類管理。這兩個類體現(xiàn)了良好的模體現(xiàn)了良好的模塊性,類中源代塊性,類中源代碼都緊密相關(guān),碼都緊密相關(guān),內(nèi)聚度很高,并內(nèi)聚度很高,并且每個類的接口且每個類的接口都很清晰都很清晰。顯示更新的需求:顯示更新的需求:無論圖元何時移動、無論圖元何時移動、移動到哪里,都要移動到哪里,都要通知屏幕管理器通知屏幕管理器(Display)其位)其位置發(fā)生了改變。置發(fā)生了改變。31 采用面向?qū)ο蟮脑O(shè)計方法,典型的做法是在每個移動圖采用面向?qū)ο蟮脑O(shè)計方法,典型的做法是在每個移動圖元的操作代碼中,都插入一段通知元的操作代碼

27、中,都插入一段通知Display其位置發(fā)生了改變其位置發(fā)生了改變的代碼(調(diào)用的代碼(調(diào)用Display.update( )方法),如圖所示。方法),如圖所示。Class Line private Point _p1,_p2; Point getP1( ) return _p1; Point getP2( ) return _p2; void setP1(Point p1)this._p1=p1; Display.update( ); void setP2(Point p2)this._p2=p2; Display.update( ); Class Point private int _x1,_

28、x2; int getX( ) return _x1; int getY( ) return _x2; void setX (int x1)this._x1=x1; Display.update( ); void setY(int x2)this._x2=x2; Display.update( ); 32Aspect DisplayUpdatingPointcut move(): call(void Line.setP1(Point)| call(void Line.setP2(Point)| call(void Point.setX(int)| call(void Point.setY(in

29、t); after() returning:move()Display.update(); Class Line private Point _p1,_p2; Point getP1( ) return _p1; Point getP2( ) return _p2; void setP1(Point p1)this._p1=p1; void setP2(Point p2)this._p2=p2; Class Point private int _x1,_x2; int getX( ) return _x1; int getY( ) return _x2; void setX (int x1)t

30、his._x1=x1; void setY(int x2)this._x2=x2; 33假設(shè)我們想用假設(shè)我們想用aspect做以下的事情:做以下的事情:n在任何對象調(diào)用在任何對象調(diào)用TestClass.sayHello()方法的前后打印一條消方法的前后打印一條消息。息。n測試測試TestClass.sayAnyThing()方法的參數(shù)至少有三個字符。方法的參數(shù)至少有三個字符。public class TestClasspublic void sayHello()System.out.println(“Hello,AOP”);public void SayAnyThing(String s)sy

31、stem.out.println(s);)public static void main(String args)TestClass t=newTestClass();t.sayHello();t.sayAnyThing(“ok”); 應(yīng)用234public aspect MyAspectpublic pointcut sayMethodCall(): call(public void TestClass.say*();pub1ic pointcut sayMethodCal1Arg(String str): call(public void TestClass.sayAnyThing (st

32、ring)&args(str);before():sayMethodCal1() System.out.print1n(“nTestClass.”+ thisJoinPointStaticPart.getSignature().getName()+”start”);after():sayMethodCal1() System.out.print1n(“nTestClass.”+ thisJoinPointStaticPart.getSignature().getName()+”end”);before(String str):sayMethodCallArg(str) if(str.1engt

33、h() 3) System.out.println(“Error:I cant say words less than 3 characters”); return; 35應(yīng)用示例應(yīng)用示例3 3:例外處理:例外處理 以數(shù)據(jù)庫查詢?yōu)槔謩e用以數(shù)據(jù)庫查詢?yōu)槔?,分別用OOP的的Java語言語言和和AOPAOP的的AspectJAspectJ語言加以語言加以 實現(xiàn)。實現(xiàn)。public class DBQuery public ResultSet executeQuery(String sql)try/ 數(shù)據(jù)庫連接操作數(shù)據(jù)庫連接操作/ 數(shù)據(jù)庫查詢操作數(shù)據(jù)庫查詢操作catch(java.lang.Cla

34、ssNotFoundException e)/對對ClassNotFound 例外進行處理例外進行處理catch(SQLException e)/ 對對SQL例外進行處理例外進行處理catch(Exception e)/ 對其他例外進行處理對其他例外進行處理36分析以上代碼,主要存在以下幾點不足:分析以上代碼,主要存在以下幾點不足:n要求編程人員掌握大量的例外類庫和復(fù)雜的語法結(jié)構(gòu),要求編程人員掌握大量的例外類庫和復(fù)雜的語法結(jié)構(gòu),實際應(yīng)用中容易出錯;實際應(yīng)用中容易出錯;n對例外的處理并不是對例外的處理并不是DBQuery類的核心功能,但編程類的核心功能,但編程人員要花費大量精力在例外的處理上,而

35、忽略了問題人員要花費大量精力在例外的處理上,而忽略了問題本身;本身;n當當DBQuery所在類包中定義了多個類或所在類包中定義了多個類或DBQuery中中定義了多個方法時定義了多個方法時( (如數(shù)據(jù)庫記錄的添加、更新、刪除如數(shù)據(jù)庫記錄的添加、更新、刪除等操作),就要重復(fù)定義多個相同的例外處理;等操作),就要重復(fù)定義多個相同的例外處理;n大量的例外處理代碼可能引起更多的不必要錯誤,給大量的例外處理代碼可能引起更多的不必要錯誤,給程序調(diào)試和維護帶來了困難;程序調(diào)試和維護帶來了困難;基于以上幾點,可認為它是有安全隱患和不健壯的程序?;谝陨蠋c,可認為它是有安全隱患和不健壯的程序。37 基于基于AO

36、P 安全編程的思想,在安全編程的思想,在DBQuery類類中保留單純的數(shù)據(jù)庫連接和查詢代碼,而將其中保留單純的數(shù)據(jù)庫連接和查詢代碼,而將其中實現(xiàn)例外處理的代碼抽取出來,組織成單獨中實現(xiàn)例外處理的代碼抽取出來,組織成單獨模塊。模塊。 38aspect ExHandledeclare soft: Exception : within(DBQuery);pointcut Callmethod(DBQuery query):this(query)& call(* * DBQuery.*(.) ;after (DBQuery query) throwing (java.lang.ClassNotFoun

37、dException e): Callmethod(query) /對對ClassNotFound 例外進行處理例外進行處理after (DBQuery query) throwing (SQLException e ): Callmethod(query) /對對SQL例外進行處理例外進行處理 after (DBQuery query) throwing (Exception e ): Callmethod(query) /對其它對其它例外進行處理例外進行處理39 以下幾方面為突出的安全優(yōu)點:以下幾方面為突出的安全優(yōu)點:n程序開發(fā)人員可專注于數(shù)據(jù)庫連接和查詢操作本身,程序開發(fā)人員可專注于數(shù)據(jù)

38、庫連接和查詢操作本身,而無須同時考慮對例外的處理;而無須同時考慮對例外的處理;n安全代碼被獨立到單獨的安全代碼被獨立到單獨的aspect 中,使程序更易理解,中,使程序更易理解,且當安全策略需要修改時,只需變動且當安全策略需要修改時,只需變動ExHandle 代碼,代碼,而無需改動而無需改動DBQuery 類;類;n當添加新的類或當添加新的類或DBQuery類中添加新的方法時,編程類中添加新的方法時,編程人員不必考慮新的錯誤處理策略,甚至不必去了解這人員不必考慮新的錯誤處理策略,甚至不必去了解這些策略,些策略, ExHandle代碼將自動應(yīng)用于它們。代碼將自動應(yīng)用于它們。40應(yīng)用應(yīng)用4 4:一

39、個異常處理的實例:一個異常處理的實例 下面的代碼是一個簡單的方面的例子,它打印所下面的代碼是一個簡單的方面的例子,它打印所有的沒有被包中定義的任何方法處理的異常。我們能有的沒有被包中定義的任何方法處理的異常。我們能在測試時使用這個代碼,看是否有沒預(yù)料到的錯誤,在測試時使用這個代碼,看是否有沒預(yù)料到的錯誤,由此指出包中的一個漏洞。由此指出包中的一個漏洞。public aspect ExceptionPrinterpointcut allMethods( ):executions(* *();static after( ) throwing (Exception e):allMethods( )S

40、ystem.out.println(“Uncaught exception:”+ e);41應(yīng)用5:AOP技術(shù)在并發(fā)訪問控制中的應(yīng)用n當多個線程要訪問同一個變量或?qū)ο髸r,為了保證數(shù)當多個線程要訪問同一個變量或?qū)ο髸r,為了保證數(shù)據(jù)的一致性,要實施一些并發(fā)訪問控制策略。據(jù)的一致性,要實施一些并發(fā)訪問控制策略。n通常的做法是采用加鎖和解鎖的方法。即多個訪問類通常的做法是采用加鎖和解鎖的方法。即多個訪問類同時訪問一個共享數(shù)據(jù)對象時,每個訪問類在訪問這同時訪問一個共享數(shù)據(jù)對象時,每個訪問類在訪問這個數(shù)據(jù)對象時,將數(shù)據(jù)對象上鎖,訪問完成后,再解個數(shù)據(jù)對象時,將數(shù)據(jù)對象上鎖,訪問完成后,再解鎖,供其他并發(fā)線

41、程訪問。鎖,供其他并發(fā)線程訪問。workerAnotherworker數(shù)據(jù)對象數(shù)據(jù)對象上鎖上鎖解鎖解鎖上鎖上鎖解鎖解鎖42public aspect LockReentrantWriterPreferenceReadWriteLock rwl = new ReentrantWriterPreferenceReadWriteLock();public pointcut writeOperations( ): execution(public boolean Worker.createData( )| execution(public boolean Worker.updateData( ) |

42、execution(public boolean AnotherWorker.updateData( );before( ): writeOperations( )rwl.writeLock( ).acquire( );/在寫操作之前上鎖在寫操作之前上鎖after( ): writeOperations( )rwl.writeLock( ).release( );/在寫操作之后解鎖在寫操作之后解鎖43AOPAOP研究內(nèi)容研究內(nèi)容nEarly aspects: aspect-oriented requirements engineering and architecture design.nAs

43、pect-oriented modeling and designnDesign patterns for aspect-oriented systemsn 44nAspect-oriented programming languages, platforms and frameworksnType systems for aspectsnComposition models and operators for aspectsnOptimization and performance improvement of aspect-oriented composition45nApplicatio

44、n of AOSD in specific areas such as embedded systems, banking systems, ambient computing, etc.nAspects in feature-oriented approaches and product lines.nAspects in reengineering46小結(jié)小結(jié)nAOP起源于程序設(shè)計中起源于程序設(shè)計中“橫切橫切”引發(fā)的引發(fā)的“代碼散布代碼散布”和和“代碼交織代碼交織”問題。在目前的程序設(shè)計技術(shù)下,程問題。在目前的程序設(shè)計技術(shù)下,程序中的橫切無法避免,其實現(xiàn)代碼相互糾纏在一起,序中的橫切無法避免,其實現(xiàn)代碼相互糾纏在一起,是軟件復(fù)雜度的來源之一。是軟件復(fù)雜度的來源之一。nAOP就是要能分離出那些隱含的、相互交織糾纏的系就是要能分離出那些隱含的、相互交織糾纏的系統(tǒng)關(guān)注點,并使之明確。使用統(tǒng)關(guān)注點

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論