版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、1,面向方面的程序設計兼談計算科學的創(chuàng)新,哈爾濱工程大學 計算機學院 劉大昕 Email: ,2,面向方面的程序設計,Aspect oriented programming(AOP),3,Xerox(施樂)公司PARC研究中心在1997年的歐洲面向對象編程大會(ECOOP97)上首次提出Aspect-oriented programming(AOP)。 自2002年起,每年分別在歐洲和美國輪流召開專門的面向方面軟件開發(fā)(AOSD)國際會議。與會者包括美國、加拿大、荷蘭、英國、法國、丹麥、日本、以色列等。我國一些學校也對AOP給以關注并開展了一些研究工作。 從AOP概念提出經(jīng)過了近十年的時間,這
2、種技術現(xiàn)在已經(jīng)開始被工業(yè)界采用。,4,AOP產(chǎn)生的背景,計算機軟件設計的一個重要原則,就是要清晰分離各種關注點(separation of concerns),然后分而治之,各個擊破,最后形成統(tǒng)一的解決方案。,5,關注點:是指一個特定的目標、概念或者興趣域。 從技術的角度,軟件系統(tǒng)分別包括核心級和系統(tǒng)級的關注點。 核心級關注點是系統(tǒng)要完成的業(yè)務功能; 系統(tǒng)級關注點是完成核心級關注點所必須的配套設施,這些配套設施通常被認為是整個系統(tǒng)的系統(tǒng)特性,或者是業(yè)務功能的功能約束。 例如:信用卡處理系統(tǒng) 核心關注點是處理付款; 系統(tǒng)級關注點包括日志、事務、認證、安全和性能等等。,6,軟件系統(tǒng)中,某個行為,例
3、如操作日志的記錄,存在于軟件的各個部分中,這個行為可以看作是橫向存在于軟件之中,他所關注的是軟件的各個部分的一些共有的行為。 在很多情況下,這種行為不屬于業(yè)務邏輯的一部分。這種操作并不是業(yè)務邏輯調用的必須部分,但是,我們卻往往不得在代碼中顯式進行調用,并承擔由此帶來的后果。,7,在目前的技術框架下,通常系統(tǒng)級關注點在邏輯上相互之間彼此正交(相互獨立),同時在實現(xiàn)上趨向于和若干核心模塊交織。 例如:信用卡管理系統(tǒng)的每個核心業(yè)務關注點都和安全、日志等系統(tǒng)關注點相聯(lián)系。,8,核心級關注點(業(yè)務)多數(shù)情況下可以被很好地分解,并通過編程語言模塊化實現(xiàn)(子模塊或軟構件)。 系統(tǒng)級關注點(橫向關注點),使用
4、當前的程序設計方法導致在許多構件中要重復包含(擴散)這些代碼。,9,橫切示例(crosscutting),Authentication 權限 Caching 緩存 Context passing 內容傳遞 Error handling 錯誤處理 Lazy loading 懶加載 Debugging 調試 Logging、tracing、profiling and monitoring 日志、跟蹤、優(yōu)化、校準 Performance optimization 性能優(yōu)化 Persistence 持久化 Resource pooling 資源池 Synchronization 同步 Transact
5、ions 事務,10,現(xiàn)有軟件技術的不足,目前的實現(xiàn)技術只提供了一維方法學實現(xiàn)系統(tǒng)的關注點,該單一維度一般是核心需求和關注點的模塊化實現(xiàn),其他類型的需求也被迫和該主導維度一致。,問題空間是n維的,而解空間是一維的。這種失配必然導致需求和實現(xiàn)之間的失配。,11,源程序就會變成一些為不同關注目的而編制的 指令的纏結混亂物。,纏結現(xiàn)象是現(xiàn)有軟件系統(tǒng)中許多不必要的復雜性的核心。 它增加了功能構件之間的依賴性, 分散了構件原來假定要做的事情, 提供了許多程序設計出錯的機會, 使得一些功能構件難以復用, 源代碼難以開發(fā)、理解和發(fā)展。,12,某一應用的領域專家,不太可能對分布、認證、訪問控制、同步、加密、冗
6、余等問題的復雜實現(xiàn)機制很熟悉,所以就不能保證他們在程序中進行正確的調用。 開發(fā)人員很難正確預見到未來對程序的新需求。,13,方面(Aspect),設計上講,是橫切系統(tǒng)的一些軟件系統(tǒng)級關注點。 實現(xiàn)上講,它支持將橫切系統(tǒng)的關注點封裝在單獨的模塊單位中,它是AOP將橫切關注點局部化和模塊化的實現(xiàn)機制。 常見的“方面”: 異常和出錯處理 同步和并發(fā)控制 內存訪問模式 日志、安全 事務、性能,14,AOP核心內容就是所謂的“橫切關注點”,即“方面”,Aspect是AOP提供的一種程序設計單元。 而在OOP中,這些一般關注點的實現(xiàn)單元叫作類 AOP的目標,是要將這些橫切關注點與業(yè)務邏輯代碼相分離,從而得
7、到更好的軟件結構、性能以及穩(wěn)定性等方面的好處。 AOP被認為是后面向對象時代的一種新的重要的程序設計技術。,15,AOP的基本思想,通過分別描述系統(tǒng)的不同關注點及其關系,以一種松耦合的方式實現(xiàn)單個關注點,然后依靠AOP環(huán)境的支撐機制,將這些關注點組織或編排成最終的可運行程序。 普通關注點可以使用傳統(tǒng)的結構化方法和面向對象方法體統(tǒng)的機制。 系統(tǒng)關注點使用Aspect機制。,16,AOP程序設計的一般步驟,一、對需求規(guī)約進行Aspect分解。 確定哪些功能是組件必須實現(xiàn)的,即提取出核心關注點。 哪些功能可以以aspect的形式動態(tài)加入到系統(tǒng)組件中去,即提取出系統(tǒng)級的橫切關注點。,17,AOP程序設
8、計的一般步驟,二、對標識出的Aspect分別通過程序機制實現(xiàn)。 構造系統(tǒng)的組件。 利用組件語言實現(xiàn)系統(tǒng)的組件。對于OOP語言,這些組件可以是類;對于過程化程序設計語言,這些組件可以是各種函數(shù)和API。 構造系統(tǒng)的aspect。 利用一種或多種aspect語言實現(xiàn)aspect。 aspect語言必須提供聲明aspect的機制。,aspect如何聲明 連接點如何定義 aspect代碼如何定義 aspect的參數(shù)化程度等,18,三、用aspect編織器將所有的單元編排重組在一起,形成最終的可運行系統(tǒng)。 為組件語言和aspect語言構造相應的語法樹;依據(jù)aspect中的連接點定義對語法樹進行聯(lián)結;在連
9、接的語法樹上生成中間文件或目標代碼。 aspect語言必須提供將aspect代碼和基礎代碼組合編排(weaving)在一起的機制。,定義編排語言和規(guī)則。 解決aspect之間潛在的沖突。 為組裝和執(zhí)行建立外部約束。 aspect語言必須提供生成可運行系統(tǒng)的實現(xiàn)機制。 系統(tǒng)的組合是在編譯時靜態(tài)組裝還是運行時動態(tài)進行。 對程序單元分別進行編譯的模塊化編譯機制。 對組裝結果的驗證機制等。,19,AOP的本質,將橫切關注點(如日志、權限驗證、并發(fā)控制等非功能需求)單獨用aspect實現(xiàn),而業(yè)務功能用現(xiàn)有的軟件技術實現(xiàn)。由AOP機制提供將這些分離的關注點編織為一個可執(zhí)行程序。 提高代碼的可理解性、可維護
10、性、可復用性等。,橫切關注點,20,AOP系統(tǒng)的軟件開發(fā)過程,21,AOP與OOP比較,OOP是AOP的技術基礎,AOP是對OOP的繼承和發(fā)展。 可擴展性: 指軟件系統(tǒng)在需求更改時程序的易更改能力。 OOP主要通過提供繼承和重載機制來提高軟件的可擴展性。 AOP通過擴展Aspect或增加Aspect,系統(tǒng)相關的各個部分都隨之產(chǎn)生變化。,22,可重用性: 指某個應用系統(tǒng)中的元素被應用到其他應用系統(tǒng)的能力。 OOP以類機制作為一種抽象的數(shù)據(jù)類型,提供了比過程化更好的重用性。 OOP的重用性對非特定于系統(tǒng)的功能模塊有很好的支持,如堆棧的操作和窗口機制的實現(xiàn)。 對于不能封裝成類的元素,如異常處理等,很
11、難實現(xiàn)重用。 AOP使不能封裝成類的元素的重用成為可能。,23,易理解性和易維護性 代碼纏結問題的存在,使OOP技術在易理解性和易維護性方面都難有很大的提高。 統(tǒng)計發(fā)現(xiàn):“如果一個他人寫的程序有37處需要改動,對于一個最優(yōu)秀的軟件開發(fā)人員,也大概只能找到35個”。 對于AOP,對一個Aspect修改可以通過聯(lián)結器影響到系統(tǒng)相關的各個部分,從而大大提高系統(tǒng)的易維護性。,24,AOP特性,Aspect的實現(xiàn)和傳統(tǒng)開發(fā)方法中模塊的實現(xiàn)不同。 Aspect的開發(fā)彼此獨立,是一種松耦合關系。 主代碼的開發(fā)者甚至可能沒有意識到aspect的存在。只是在最后系統(tǒng)組裝時,才將各aspect代碼和主代碼編排融合
12、在一起。,主代碼和Aspect之間采用“隱式調用”。 某一應用的領域專家,不太可能對分布、認證、訪問控制、同步、加密、冗余等問題的復雜實現(xiàn)機制很熟悉,所以就不能保證他們在程序中進行正確的調用。 開發(fā)人員很難正確預見到未來對程序的新需求。,25,AspectJ,AspectJ是Xerox PARC開發(fā)的基于Java語言的AOP擴展,它既是一種規(guī)約語言,也是一種AOP的實現(xiàn)語言。 AspectJ是一種支持“面向Aspect”概念的語言。,26,AspectJ,AspectJ提供了支持“面向Aspect”概念的如下語言結構及定義: Joinpoints:預定義好的程序的特定執(zhí)行點。 例如: 方法的調
13、用和執(zhí)行 對屬性的讀寫訪問 異常處理 對象和類的初始化執(zhí)行 構造器的調用和執(zhí)行,27, Pointcuts:用來指明所需連接點的語言元素??赡馨ㄒ幌盗械倪B接點,同時它還可以為在連接點上執(zhí)行的通知提供上下文。 例如: pointcut callSetter( ); call (public void HelloWorld.set*(.)。 其中: pointcut說明聲明的是一個切入點,命名 callSetter,后面的空括號表示該切入點不需要上下文信息。 Call表示該切入點捕獲的是對指定方法的調用,指定的方法是在類HelloWorld中聲明的共有的、返回值為空、以set開頭、擁有任意參數(shù)的
14、方法。,28, Advices:要在Pointcuts執(zhí)行的Aspect的代碼。 AspectJ提供了3種把通知關聯(lián)到連接點的方式:after、before、around。 after和before分別表示通知在連接點的前面或者后面運行,around則表示通知在連接點的外面運行,并可以決定是否運行此連接點。 例如: 在銀行信息系統(tǒng)中,實現(xiàn)帳戶存取模塊、權限驗證模塊和日志記錄模塊。帳戶存取模塊可用OOP技術來實現(xiàn),其他的模塊可采用AOP技術。 在around通知中驗證權限,只有驗證通過才運行該連接點,在before和after通知中就輸出日志記錄。 Aspect:上述三者的結合。以類似于類的概念
15、,將Pointcut和Advice組合在一起,形成一個程序單元。,29,AspectJ為程序員提供了編譯、調試等工具。 Aspect編排器 將不同aspect組裝到一起。 Aspect調試器 獨立的Aspect瀏覽器 和一些流行的IDE環(huán)境( Forte 、 Jbuilder 、 Emacs )的集成。 AspectJ可以引入新的數(shù)據(jù)成員和新的方法。,30,應用示例1:,一個簡單的使用面向對象方法設計的圖元編輯器的示例。,在該圖元編輯器中,抽象圖元類FigureElement有兩個圖元子類Point和Line,分別對點和線進行管理。這兩個類體現(xiàn)了良好的模塊性,類中源代碼都緊密相關,內聚度很高,
16、并且每個類的接口都很清晰。,顯示更新的需求:無論圖元何時移動、移動到哪里,都要通知屏幕管理器(Display)其位置發(fā)生了改變。,31,采用面向對象的設計方法,典型的做法是在每個移動圖元的操作代碼中,都插入一段通知Display其位置發(fā)生了改變的代碼(調用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,假設我們想用aspect做以下的事情: 在任何對象調用TestClass.sayHello()方法的前后打印一條消息。 測試TestClass.sayAnyThing()方法的參數(shù)至少有三個字符。,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”); ,應用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研究內容,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,小結,AOP起源于程序設計中“橫切”引發(fā)的“代碼散布”和“代碼交織”問題。在目前的程序設計技術下,程序中的橫切無法避免,其實現(xiàn)代碼相互糾纏在一起,是軟件復雜度的來源之一。 AOP就是要能分離出那些隱含的、相互交織糾纏的系統(tǒng)關注點,并使之明確。使用AOP為程序員提供的新的模塊化武器,橫切的代碼
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 妊娠期多器官功能衰竭的基因保護策略
- 車輛工程力學試題及答案
- 女性職業(yè)性呼吸系統(tǒng)疾病的影像表現(xiàn)差異
- 頭頸鱗癌免疫治療的多組學整合策略
- 大數(shù)據(jù)在職業(yè)塵肺病早期篩查中的應用模型
- 大數(shù)據(jù)分析齲病危險因素與預防策略
- 調酒考試題及答案
- 多部門協(xié)作的社區(qū)慢病環(huán)境干預實踐
- 多組學整合的腫瘤代謝異質性分析
- 2025年中職(建筑工程施工)施工技術階段測試題及答案
- 2025年教師師德師風自查問題清單及整改措施范文
- 2026年廣東農(nóng)墾火星農(nóng)場有限公司公開招聘作業(yè)區(qū)管理人員備考題庫及參考答案詳解
- 腫瘤化療導致的中性粒細胞減少診治中國專家共識解讀
- 2025年查對制度考核考試題庫(答案+解析)
- 云南省2025年普通高中學業(yè)水平合格性考試歷史試題
- 養(yǎng)老護理服務的法律監(jiān)管與執(zhí)法
- 四川省2025年高職單招職業(yè)技能綜合測試(中職類)汽車類試卷(含答案解析)
- 隧道施工清包合同(3篇)
- 消化系統(tǒng)腫瘤多學科協(xié)作(MDT)診療方案
- 圍手術期疼痛的動物模型與轉化研究
- 安泰科技招聘筆試題庫2025
評論
0/150
提交評論