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

下載本文檔

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

文檔簡(jiǎn)介

1、1,面向方面的程序設(shè)計(jì)兼談?dòng)?jì)算科學(xué)的創(chuàng)新,哈爾濱工程大學(xué) 計(jì)算機(jī)學(xué)院 劉大昕 Email: ,2,面向方面的程序設(shè)計(jì),Aspect oriented programming(AOP),3,Xerox(施樂)公司PARC研究中心在1997年的歐洲面向?qū)ο缶幊檀髸?huì)(ECOOP97)上首次提出Aspect-oriented programming(AOP)。 自2002年起,每年分別在歐洲和美國輪流召開專門的面向方面軟件開發(fā)(AOSD)國際會(huì)議。與會(huì)者包括美國、加拿大、荷蘭、英國、法國、丹麥、日本、以色列等。我國一些學(xué)校也對(duì)AOP給以關(guān)注并開展了一些研究工作。 從AOP概念提出經(jīng)過了近十年的時(shí)間,這

2、種技術(shù)現(xiàn)在已經(jīng)開始被工業(yè)界采用。,4,AOP產(chǎn)生的背景,計(jì)算機(jī)軟件設(shè)計(jì)的一個(gè)重要原則,就是要清晰分離各種關(guān)注點(diǎn)(separation of concerns),然后分而治之,各個(gè)擊破,最后形成統(tǒng)一的解決方案。,5,關(guān)注點(diǎn):是指一個(gè)特定的目標(biāo)、概念或者興趣域。 從技術(shù)的角度,軟件系統(tǒng)分別包括核心級(jí)和系統(tǒng)級(jí)的關(guān)注點(diǎn)。 核心級(jí)關(guān)注點(diǎn)是系統(tǒng)要完成的業(yè)務(wù)功能; 系統(tǒng)級(jí)關(guān)注點(diǎn)是完成核心級(jí)關(guān)注點(diǎn)所必須的配套設(shè)施,這些配套設(shè)施通常被認(rèn)為是整個(gè)系統(tǒng)的系統(tǒng)特性,或者是業(yè)務(wù)功能的功能約束。 例如:信用卡處理系統(tǒng) 核心關(guān)注點(diǎn)是處理付款; 系統(tǒng)級(jí)關(guān)注點(diǎn)包括日志、事務(wù)、認(rèn)證、安全和性能等等。,6,軟件系統(tǒng)中,某個(gè)行為,例

3、如操作日志的記錄,存在于軟件的各個(gè)部分中,這個(gè)行為可以看作是橫向存在于軟件之中,他所關(guān)注的是軟件的各個(gè)部分的一些共有的行為。 在很多情況下,這種行為不屬于業(yè)務(wù)邏輯的一部分。這種操作并不是業(yè)務(wù)邏輯調(diào)用的必須部分,但是,我們卻往往不得在代碼中顯式進(jìn)行調(diào)用,并承擔(dān)由此帶來的后果。,7,在目前的技術(shù)框架下,通常系統(tǒng)級(jí)關(guān)注點(diǎn)在邏輯上相互之間彼此正交(相互獨(dú)立),同時(shí)在實(shí)現(xiàn)上趨向于和若干核心模塊交織。 例如:信用卡管理系統(tǒng)的每個(gè)核心業(yè)務(wù)關(guān)注點(diǎn)都和安全、日志等系統(tǒng)關(guān)注點(diǎn)相聯(lián)系。,8,核心級(jí)關(guān)注點(diǎn)(業(yè)務(wù))多數(shù)情況下可以被很好地分解,并通過編程語言模塊化實(shí)現(xiàn)(子模塊或軟構(gòu)件)。 系統(tǒng)級(jí)關(guān)注點(diǎn)(橫向關(guān)注點(diǎn)),使用

4、當(dāng)前的程序設(shè)計(jì)方法導(dǎo)致在許多構(gòu)件中要重復(fù)包含(擴(kuò)散)這些代碼。,9,橫切示例(crosscutting),Authentication 權(quán)限 Caching 緩存 Context passing 內(nèi)容傳遞 Error handling 錯(cuò)誤處理 Lazy loading 懶加載 Debugging 調(diào)試 Logging、tracing、profiling and monitoring 日志、跟蹤、優(yōu)化、校準(zhǔn) Performance optimization 性能優(yōu)化 Persistence 持久化 Resource pooling 資源池 Synchronization 同步 Transact

5、ions 事務(wù),10,現(xiàn)有軟件技術(shù)的不足,目前的實(shí)現(xiàn)技術(shù)只提供了一維方法學(xué)實(shí)現(xiàn)系統(tǒng)的關(guān)注點(diǎn),該單一維度一般是核心需求和關(guān)注點(diǎn)的模塊化實(shí)現(xiàn),其他類型的需求也被迫和該主導(dǎo)維度一致。,問題空間是n維的,而解空間是一維的。這種失配必然導(dǎo)致需求和實(shí)現(xiàn)之間的失配。,11,源程序就會(huì)變成一些為不同關(guān)注目的而編制的 指令的纏結(jié)混亂物。,纏結(jié)現(xiàn)象是現(xiàn)有軟件系統(tǒng)中許多不必要的復(fù)雜性的核心。 它增加了功能構(gòu)件之間的依賴性, 分散了構(gòu)件原來假定要做的事情, 提供了許多程序設(shè)計(jì)出錯(cuò)的機(jī)會(huì), 使得一些功能構(gòu)件難以復(fù)用, 源代碼難以開發(fā)、理解和發(fā)展。,12,某一應(yīng)用的領(lǐng)域?qū)<遥惶赡軐?duì)分布、認(rèn)證、訪問控制、同步、加密、冗

6、余等問題的復(fù)雜實(shí)現(xiàn)機(jī)制很熟悉,所以就不能保證他們?cè)诔绦蛑羞M(jìn)行正確的調(diào)用。 開發(fā)人員很難正確預(yù)見到未來對(duì)程序的新需求。,13,方面(Aspect),設(shè)計(jì)上講,是橫切系統(tǒng)的一些軟件系統(tǒng)級(jí)關(guān)注點(diǎn)。 實(shí)現(xiàn)上講,它支持將橫切系統(tǒng)的關(guān)注點(diǎn)封裝在單獨(dú)的模塊單位中,它是AOP將橫切關(guān)注點(diǎn)局部化和模塊化的實(shí)現(xiàn)機(jī)制。 常見的“方面”: 異常和出錯(cuò)處理 同步和并發(fā)控制 內(nèi)存訪問模式 日志、安全 事務(wù)、性能,14,AOP核心內(nèi)容就是所謂的“橫切關(guān)注點(diǎn)”,即“方面”,Aspect是AOP提供的一種程序設(shè)計(jì)單元。 而在OOP中,這些一般關(guān)注點(diǎn)的實(shí)現(xiàn)單元叫作類 AOP的目標(biāo),是要將這些橫切關(guān)注點(diǎn)與業(yè)務(wù)邏輯代碼相分離,從而得

7、到更好的軟件結(jié)構(gòu)、性能以及穩(wěn)定性等方面的好處。 AOP被認(rèn)為是后面向?qū)ο髸r(shí)代的一種新的重要的程序設(shè)計(jì)技術(shù)。,15,AOP的基本思想,通過分別描述系統(tǒng)的不同關(guān)注點(diǎn)及其關(guān)系,以一種松耦合的方式實(shí)現(xiàn)單個(gè)關(guān)注點(diǎn),然后依靠AOP環(huán)境的支撐機(jī)制,將這些關(guān)注點(diǎn)組織或編排成最終的可運(yùn)行程序。 普通關(guān)注點(diǎn)可以使用傳統(tǒng)的結(jié)構(gòu)化方法和面向?qū)ο蠓椒w統(tǒng)的機(jī)制。 系統(tǒng)關(guān)注點(diǎn)使用Aspect機(jī)制。,16,AOP程序設(shè)計(jì)的一般步驟,一、對(duì)需求規(guī)約進(jìn)行Aspect分解。 確定哪些功能是組件必須實(shí)現(xiàn)的,即提取出核心關(guān)注點(diǎn)。 哪些功能可以以aspect的形式動(dòng)態(tài)加入到系統(tǒng)組件中去,即提取出系統(tǒng)級(jí)的橫切關(guān)注點(diǎn)。,17,AOP程序設(shè)

8、計(jì)的一般步驟,二、對(duì)標(biāo)識(shí)出的Aspect分別通過程序機(jī)制實(shí)現(xiàn)。 構(gòu)造系統(tǒng)的組件。 利用組件語言實(shí)現(xiàn)系統(tǒng)的組件。對(duì)于OOP語言,這些組件可以是類;對(duì)于過程化程序設(shè)計(jì)語言,這些組件可以是各種函數(shù)和API。 構(gòu)造系統(tǒng)的aspect。 利用一種或多種aspect語言實(shí)現(xiàn)aspect。 aspect語言必須提供聲明aspect的機(jī)制。,aspect如何聲明 連接點(diǎn)如何定義 aspect代碼如何定義 aspect的參數(shù)化程度等,18,三、用aspect編織器將所有的單元編排重組在一起,形成最終的可運(yùn)行系統(tǒng)。 為組件語言和aspect語言構(gòu)造相應(yīng)的語法樹;依據(jù)aspect中的連接點(diǎn)定義對(duì)語法樹進(jìn)行聯(lián)結(jié);在連

9、接的語法樹上生成中間文件或目標(biāo)代碼。 aspect語言必須提供將aspect代碼和基礎(chǔ)代碼組合編排(weaving)在一起的機(jī)制。,定義編排語言和規(guī)則。 解決aspect之間潛在的沖突。 為組裝和執(zhí)行建立外部約束。 aspect語言必須提供生成可運(yùn)行系統(tǒng)的實(shí)現(xiàn)機(jī)制。 系統(tǒng)的組合是在編譯時(shí)靜態(tài)組裝還是運(yùn)行時(shí)動(dòng)態(tài)進(jìn)行。 對(duì)程序單元分別進(jìn)行編譯的模塊化編譯機(jī)制。 對(duì)組裝結(jié)果的驗(yàn)證機(jī)制等。,19,AOP的本質(zhì),將橫切關(guān)注點(diǎn)(如日志、權(quán)限驗(yàn)證、并發(fā)控制等非功能需求)單獨(dú)用aspect實(shí)現(xiàn),而業(yè)務(wù)功能用現(xiàn)有的軟件技術(shù)實(shí)現(xiàn)。由AOP機(jī)制提供將這些分離的關(guān)注點(diǎn)編織為一個(gè)可執(zhí)行程序。 提高代碼的可理解性、可維護(hù)

10、性、可復(fù)用性等。,橫切關(guān)注點(diǎn),20,AOP系統(tǒng)的軟件開發(fā)過程,21,AOP與OOP比較,OOP是AOP的技術(shù)基礎(chǔ),AOP是對(duì)OOP的繼承和發(fā)展。 可擴(kuò)展性: 指軟件系統(tǒng)在需求更改時(shí)程序的易更改能力。 OOP主要通過提供繼承和重載機(jī)制來提高軟件的可擴(kuò)展性。 AOP通過擴(kuò)展Aspect或增加Aspect,系統(tǒng)相關(guān)的各個(gè)部分都隨之產(chǎn)生變化。,22,可重用性: 指某個(gè)應(yīng)用系統(tǒng)中的元素被應(yīng)用到其他應(yīng)用系統(tǒng)的能力。 OOP以類機(jī)制作為一種抽象的數(shù)據(jù)類型,提供了比過程化更好的重用性。 OOP的重用性對(duì)非特定于系統(tǒng)的功能模塊有很好的支持,如堆棧的操作和窗口機(jī)制的實(shí)現(xiàn)。 對(duì)于不能封裝成類的元素,如異常處理等,很

11、難實(shí)現(xiàn)重用。 AOP使不能封裝成類的元素的重用成為可能。,23,易理解性和易維護(hù)性 代碼纏結(jié)問題的存在,使OOP技術(shù)在易理解性和易維護(hù)性方面都難有很大的提高。 統(tǒng)計(jì)發(fā)現(xiàn):“如果一個(gè)他人寫的程序有37處需要改動(dòng),對(duì)于一個(gè)最優(yōu)秀的軟件開發(fā)人員,也大概只能找到35個(gè)”。 對(duì)于AOP,對(duì)一個(gè)Aspect修改可以通過聯(lián)結(jié)器影響到系統(tǒng)相關(guān)的各個(gè)部分,從而大大提高系統(tǒng)的易維護(hù)性。,24,AOP特性,Aspect的實(shí)現(xiàn)和傳統(tǒng)開發(fā)方法中模塊的實(shí)現(xiàn)不同。 Aspect的開發(fā)彼此獨(dú)立,是一種松耦合關(guān)系。 主代碼的開發(fā)者甚至可能沒有意識(shí)到aspect的存在。只是在最后系統(tǒng)組裝時(shí),才將各aspect代碼和主代碼編排融合

12、在一起。,主代碼和Aspect之間采用“隱式調(diào)用”。 某一應(yīng)用的領(lǐng)域?qū)<遥惶赡軐?duì)分布、認(rèn)證、訪問控制、同步、加密、冗余等問題的復(fù)雜實(shí)現(xiàn)機(jī)制很熟悉,所以就不能保證他們?cè)诔绦蛑羞M(jìn)行正確的調(diào)用。 開發(fā)人員很難正確預(yù)見到未來對(duì)程序的新需求。,25,AspectJ,AspectJ是Xerox PARC開發(fā)的基于Java語言的AOP擴(kuò)展,它既是一種規(guī)約語言,也是一種AOP的實(shí)現(xiàn)語言。 AspectJ是一種支持“面向Aspect”概念的語言。,26,AspectJ,AspectJ提供了支持“面向Aspect”概念的如下語言結(jié)構(gòu)及定義: Joinpoints:預(yù)定義好的程序的特定執(zhí)行點(diǎn)。 例如: 方法的調(diào)

13、用和執(zhí)行 對(duì)屬性的讀寫訪問 異常處理 對(duì)象和類的初始化執(zhí)行 構(gòu)造器的調(diào)用和執(zhí)行,27, Pointcuts:用來指明所需連接點(diǎn)的語言元素。可能包括一系列的連接點(diǎn),同時(shí)它還可以為在連接點(diǎn)上執(zhí)行的通知提供上下文。 例如: pointcut callSetter( ); call (public void HelloWorld.set*(.)。 其中: pointcut說明聲明的是一個(gè)切入點(diǎn),命名 callSetter,后面的空括號(hào)表示該切入點(diǎn)不需要上下文信息。 Call表示該切入點(diǎn)捕獲的是對(duì)指定方法的調(diào)用,指定的方法是在類HelloWorld中聲明的共有的、返回值為空、以set開頭、擁有任意參數(shù)的

14、方法。,28, Advices:要在Pointcuts執(zhí)行的Aspect的代碼。 AspectJ提供了3種把通知關(guān)聯(lián)到連接點(diǎn)的方式:after、before、around。 after和before分別表示通知在連接點(diǎn)的前面或者后面運(yùn)行,around則表示通知在連接點(diǎn)的外面運(yùn)行,并可以決定是否運(yùn)行此連接點(diǎn)。 例如: 在銀行信息系統(tǒng)中,實(shí)現(xiàn)帳戶存取模塊、權(quán)限驗(yàn)證模塊和日志記錄模塊。帳戶存取模塊可用OOP技術(shù)來實(shí)現(xiàn),其他的模塊可采用AOP技術(shù)。 在around通知中驗(yàn)證權(quán)限,只有驗(yàn)證通過才運(yùn)行該連接點(diǎn),在before和after通知中就輸出日志記錄。 Aspect:上述三者的結(jié)合。以類似于類的概念

15、,將Pointcut和Advice組合在一起,形成一個(gè)程序單元。,29,AspectJ為程序員提供了編譯、調(diào)試等工具。 Aspect編排器 將不同aspect組裝到一起。 Aspect調(diào)試器 獨(dú)立的Aspect瀏覽器 和一些流行的IDE環(huán)境( Forte 、 Jbuilder 、 Emacs )的集成。 AspectJ可以引入新的數(shù)據(jù)成員和新的方法。,30,應(yīng)用示例1:,一個(gè)簡(jiǎn)單的使用面向?qū)ο蠓椒ㄔO(shè)計(jì)的圖元編輯器的示例。,在該圖元編輯器中,抽象圖元類FigureElement有兩個(gè)圖元子類Point和Line,分別對(duì)點(diǎn)和線進(jìn)行管理。這兩個(gè)類體現(xiàn)了良好的模塊性,類中源代碼都緊密相關(guān),內(nèi)聚度很高,

16、并且每個(gè)類的接口都很清晰。,顯示更新的需求:無論圖元何時(shí)移動(dòng)、移動(dòng)到哪里,都要通知屏幕管理器(Display)其位置發(fā)生了改變。,31,采用面向?qū)ο蟮脑O(shè)計(jì)方法,典型的做法是在每個(gè)移動(dòng)圖元的操作代碼中,都插入一段通知Display其位置發(fā)生了改變的代碼(調(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

17、 setP2(Point p2) this._p2=p2; Display.update( ); ,Class Point private int _x1,_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( ); ,32,Aspect DisplayUpdating Pointcut move(): call(void Line.setP1(Poi

18、nt)| call(void Line.setP2(Point)| call(void Point.setX(int)| call(void Point.setY(int); 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 pr

19、ivate int _x1,_x2; int getX( ) return _x1; int getY( ) return _x2; void setX (int x1)this._x1=x1; void setY(int x2)this._x2=x2; ,33,假設(shè)我們想用aspect做以下的事情: 在任何對(duì)象調(diào)用TestClass.sayHello()方法的前后打印一條消息。 測(cè)試TestClass.sayAnyThing()方法的參數(shù)至少有三個(gè)字符。,public class TestClass public void sayHello() System.out.println(“Hel

20、lo,AOP”); public void SayAnyThing(String s) system.out.println(s); ) public static void main(String args) TestClass t=newTestClass(); t.sayHello(); t.sayAnyThing(“ok”); ,應(yīng)用2,34,public aspect MyAspect public pointcut sayMethodCall(): call(public void TestClass.say*(); pub1ic pointcut sayMethodCal1Arg

21、(String str): call(public void TestClass.sayAnyThing (string) public pointcut writeOperations( ): execution(public boolean Worker.createData( )| execution(public boolean Worker.updateData( ) | execution(public boolean AnotherWorker.updateData( ); before( ): writeOperations( ) rwl.writeLock( ).acquir

22、e( );/在寫操作之前上鎖 after( ): writeOperations( ) rwl.writeLock( ).release( );/在寫操作之后解鎖 ,43,AOP研究?jī)?nèi)容,Early aspects: aspect-oriented requirements engineering and architecture design. Aspect-oriented modeling and design Design patterns for aspect-oriented systems,44,Aspect-oriented programming languages, pla

23、tforms and frameworks Type systems for aspects Composition models and operators for aspects Optimization and performance improvement of aspect-oriented composition,45,Application of AOSD in specific areas such as embedded systems, banking systems, ambient computing, etc. Aspects in feature-oriented approaches and product lines. Aspects in reengineering,46,小結(jié),AOP起源于程序設(shè)計(jì)中“橫切”引發(fā)的“代碼散布”和“代碼交織”問題。在目前的程序設(shè)計(jì)技術(shù)下,程序中的橫切無法避免,其實(shí)現(xiàn)代碼相互糾纏在一起,是軟件復(fù)雜度的來源之一。 AOP就是要能分離出那些隱含的、相互交織糾纏的系統(tǒng)關(guān)注點(diǎn),并使之明確。使用AOP為程序員提供的新的模塊化武器,橫切的代碼

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論