面向方面的實時系統(tǒng)開發(fā)方法郭東亮畢業(yè)論文最終稿_第1頁
面向方面的實時系統(tǒng)開發(fā)方法郭東亮畢業(yè)論文最終稿_第2頁
面向方面的實時系統(tǒng)開發(fā)方法郭東亮畢業(yè)論文最終稿_第3頁
面向方面的實時系統(tǒng)開發(fā)方法郭東亮畢業(yè)論文最終稿_第4頁
面向方面的實時系統(tǒng)開發(fā)方法郭東亮畢業(yè)論文最終稿_第5頁
已閱讀5頁,還剩64頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、廣東工業(yè)大學(xué)工學(xué)碩士學(xué)位論文面向方面的實時系統(tǒng)開發(fā)方法郭東亮二零零五年四月三十日分類號: 學(xué)校代碼:11911udc: 密級: 學(xué) 號:2110205159廣東工業(yè)大學(xué)學(xué)位論文面向方面的實時系統(tǒng)開發(fā)方法郭東亮指 導(dǎo) 教 師: 張立臣 教授 廣東工業(yè)大學(xué)計算機學(xué)院學(xué) 科 門 類: 工學(xué) 專 業(yè) 名 稱: 計算機軟件與理論 申請學(xué)位級別: 碩 士 論文提交日期: 2005 年 4 月 論文答辯日期: 2005 年 5 月 學(xué)位授予單位: 廣東工業(yè)大學(xué) 摘要現(xiàn)代軟件開發(fā)都要把整個系統(tǒng)按功能分解為小的單元,然后開發(fā)這些小單元,這些小的單元隱藏內(nèi)部實現(xiàn),對外提供接口,最后組合這些單元為整個系統(tǒng),實現(xiàn)整個

2、系統(tǒng)的功能。但是系統(tǒng)中有的方面是橫切整個系統(tǒng)的非功能關(guān)注點,無法很好地封裝在單個模塊中。如日志、性能問題、安全、上下文相關(guān)錯誤處理、qos監(jiān)測等等,這些方面分散在整個系統(tǒng)中,并且與系統(tǒng)的功能代碼糾纏在一起,這樣降低了模塊的可追蹤性、模塊的可重用性、系統(tǒng)的可維護性等一系列問題,所以需要分離并模塊化這些非功能關(guān)注點。面向方面編程在實現(xiàn)上分離和模塊化橫切關(guān)注點,面向方面建模在軟件開發(fā)的其它階段用一致的方法來詳述、可視化、構(gòu)造和文檔化方面相關(guān)制品,這樣在整個軟件開發(fā)過程可以使用面向方面技術(shù)。實時系統(tǒng)是面向方面技術(shù)很好的應(yīng)用場所,因為在實時系統(tǒng)中,有很多非功能需求,且這些非功能需求往往橫切整個系統(tǒng)。在實

3、時系統(tǒng)中關(guān)鍵的就是時間要求了,這些時間要求散布在整個系統(tǒng)的功能部件里,帶來了代碼混亂和代碼分散問題。本文分析介紹了aspectj、組合過濾器、多維關(guān)注點分離和自適應(yīng)編程等典型的分離關(guān)注點的方法。比較完整的介紹了面向方面建模領(lǐng)域的研究。闡述了實時系統(tǒng)中的主要實時需求,以及與實時系統(tǒng)有關(guān)的uml框架集。提出了一個新的擴展uml進行面向方面建模的方法,它以合適的語義表達(dá)了aspectj和aspectc+的元素和織入機制。在這個方法中,方面繼承自類,切入點和通知繼承自特征,這樣切入點和通知是方面的一部分,方面與基本類的關(guān)系用橫切依賴表示。切入點的圖符可以表達(dá)多個方面在相同連接點的橫切行為,通知以一致的

4、方式建模結(jié)構(gòu)橫切和行為橫切,通過在順序圖上新加一個通知發(fā)出焦點,并將通知表示為消息,這樣可以清晰建模通知在何時何處怎樣影響系統(tǒng)的行為。并分析了如何將這個方法應(yīng)用于實時系統(tǒng)開發(fā)。關(guān)鍵詞:面向方面編程;面向方面軟件開發(fā);實時系統(tǒng);umlabstractusing modern software development methodology, developers first decompose system into small units, which hide the internal implementation and provide only external interfaces,

5、then implement these units, at last compose these units to get a full system and realize required functions. but there are some non-functional concerns which crosscut whole system and cant be well encapsulated into a single module, such as logging, performance analysis, security, context related err

6、or handling, qos monitoring, etc. these aspects are scattered and tangled in whole system, decreasing software traceability, reusability, adaptability. so these non-functional concerns should be separated and modularized.aspect-oriented programming (aop) separates and modularizes crosscutting concer

7、ns at implementation stage. aspect-oriented modeling (aom) specifies, visualizes, constructs and documents aspect related artifacts in a consistent way at other stage of software development. thus whole software development process can use aspect-oriented technique.real-time systems are well places

8、to apply aspect-oriented technique, for there are lots of non-functional requirements in real-time system, which scattering in whole system. the codes related with timing are mixed with other codes, resulting in code scattering and tangling.this article considers various techniques to separate cross

9、cutting concerns, namely aspectj, aspectc+, composition filters, hyperspace and adaptive programming; summarizes the researches in aom domain; analyses real-time systems timing requirements and uml profiles for real-time systems.this article proposes a new technique to modeling aspect-oriented const

10、ructs and mechanisms by extending uml, which can represent constructs and weaving mechanism of aspectj and aspectc+ with appropriate semantics. in this method, aspect is subclass of class; pointcut and advice are derived from feature, thus pointcut and advice are parts of aspect; relationship betwee

11、n aspects and base class is represented by special crosscut dependency. the notation of pointcut can express crosscutting behavior of many aspects at same join point. advice can model structural crosscutting and behavior crosscutting in a uniform way. by adding a new block, advice sending focus, in

12、sequence diagram and regard advice as message, this method can clearly model where and when and how advices affect system behavior. the article also examines how this technique can be practiced in real-time systems development.keywords: aop;aosd;real-time systems;uml目錄摘要iabstractii目錄vcontentsvii第一章

13、緒論11.1 研究背景11.2研究意義21.3面向方面技術(shù)在實時系統(tǒng)中的應(yīng)用31.4 研究內(nèi)容4第二章 分離關(guān)注點的方法52.1 aspectj52.2 aspectc+72.3 組合過濾器82.4 hyperspace132.4.1 多維關(guān)注點分離132.4.2 hyperspace152.4.3 hyper/j162.5自適應(yīng)編程17第三章 實時系統(tǒng)軟件設(shè)計213.1 實時系統(tǒng)概念213.2 實時需求213.3 實時uml擴展233.3.1 通用資源建模253.3.2 通用時間建模303.4 實時系統(tǒng)建模工具34第四章 面向方面建模354.1 uml的擴展機制354.2 表示連接點364.

14、3用況實現(xiàn)模塊化364.4用uml進行面向方面建模37第五章 實時方面建模395.1 aop元素表示395.1.1表示切入點395.1.2表示通知與引入405.1.3 表示方面415.2 舉例415.3 用況實現(xiàn)模塊化445.4 在類圖中加入方面455.5在順序圖中加入方面475.6 其它50結(jié)論51參考文獻53攻讀碩士學(xué)位期間發(fā)表的論文58獨創(chuàng)性聲明59致謝61contentsabstractiicontentsviichapter1 introduction11.1 background11.2 necessity21.3 aspect-oriented technique in real

15、-time systems31.4 structure of this thesis4chapter2 approaches to separate concerns52.1 aspectj52.2 aspectc+72.3 composition filters82.4 hyperspace132.4.1 mdsoc132.4.2 hyperspace152.4.3 hyper/j162.5 adaptive programming17chapter3 real-time systems software design213.1 concepts of real-time system213

16、.2 timing requirements213.3 uml extension for real-time system233.3.1 general resource modeling253.3.2 general timing modeling303.4 tools for real-time system modeling34chapter4 aspect-oriented modeling354.1 uml extension mechanism354.2 join point representation364.3 use case modularity using aosd36

17、4.4 aspect-oriented modeling using uml37chapter5 real-time aspect modeling395.1 modeling constructs of aop395.1.1 modeling pointcut395.1.2 modeling advice and introduction405.1.3 modeling aspect415.2 example415.3 modularizing implementation of use case445.4 adding aspect to class diagram455.5 adding

18、 aspect to sequence diagram475.6 others50summary and future work51bibliography53publications during masters studies58statement of originality59acknowledgments61第一章 緒論1.1 研究背景軟件開發(fā)思想就是抽象與分解,從過程化、結(jié)構(gòu)化分解編程,到現(xiàn)在主流的面向?qū)ο缶幊?,開發(fā)典范(paradigm)發(fā)生了很大變化,唯一不變的就是抽象與分解的思想,只是抽象的種類和質(zhì)量、分解的方法發(fā)生了變化。當(dāng)前,面向?qū)ο缶幊蹋╫op)1和基于組件的軟件開發(fā)得

19、到了廣泛的使用,面向?qū)ο蠹夹g(shù)能夠很好地將現(xiàn)實世界領(lǐng)域中的實體和它的行為建模為抽象的對象。系統(tǒng)變成一系列相互協(xié)作的對象,類的封裝性隱藏了實現(xiàn)的細(xì)節(jié);類的繼承性實現(xiàn)了重用;多態(tài)性使得不同對象接收到相同消息時產(chǎn)生不同的動作。確實,oop表明了它處理復(fù)雜問題的能力,但是oop無法模塊化橫切(crosscut)整個系統(tǒng)的關(guān)注點(concern),這些關(guān)注點稱為橫切關(guān)注點(crosscutting concerns),如時間要求、安全、qos監(jiān)測、日志等等。這些非功能單元彌散在整個系統(tǒng)中,導(dǎo)致了代碼分散(code scattering);并且與功能單元混雜在一起,導(dǎo)致了代碼糾纏(code tangling

20、)。這樣降低了程序的可理解性、適應(yīng)性、可維護性和可復(fù)用性。oop中用混入類來處理橫切,但是基本類需要顯式調(diào)用混入對象的方法,即操作的邏輯由基本類控制,且好的系統(tǒng)設(shè)計師要考慮當(dāng)前和將來可能的需求以避免打補丁,但是預(yù)知將來的需求是困難的,這樣系統(tǒng)設(shè)計師陷入了“應(yīng)該寧可設(shè)計不足還是寧可過分設(shè)計”的兩難境地。其它解決方法如行為型設(shè)計模式也是由基本類控制操作邏輯,面向特定領(lǐng)域的解決方式(如框架)僅提供這個領(lǐng)域的處理關(guān)注點的方式,所以屬于這個領(lǐng)域外的關(guān)注點需要特殊處理。解決問題需要分離關(guān)注點,將不同的關(guān)注點分離成模塊,而這些模塊可以單獨實現(xiàn)。這樣開發(fā)功能模塊時無需要考慮非功能需求,在功能模塊里不出現(xiàn)非功能

21、代碼;各個非功能模塊也單獨實現(xiàn)。系統(tǒng)有信息描述如何將這些模塊可控地組合起來形成結(jié)構(gòu)和行為明確的系統(tǒng)。系統(tǒng)信息主要描述了在何處非功能模塊影響其他模塊的結(jié)構(gòu)和行為,有的方法將這些信息包含在非功能模塊里,有的方法將這些信息放在配置文件內(nèi)。通過分離關(guān)注點,開發(fā)人員可以只關(guān)注感興趣的部分。并且當(dāng)需求改變后,只需修改受影響的模塊,而這些模塊往往只在一處出現(xiàn),這樣避免了在整個程序內(nèi)修改。已經(jīng)有很多分離關(guān)注點的方法,這些方法可以統(tǒng)稱為面向方面編程(aop, aspect oriented programming)2,雖然在這個概念提出之前,已經(jīng)有很多這方面的研究。面向方面編程將關(guān)注點實現(xiàn)為分離的方面,然而實現(xiàn)

22、僅僅是軟件開發(fā)過程中的一個階段。現(xiàn)在已經(jīng)開始研究在需求、設(shè)計等其他開發(fā)階段如何有效地分離關(guān)注點,目標(biāo)是要在整個軟件開發(fā)過程應(yīng)用面向方面技術(shù),從而形成面向方面的軟件開發(fā)(aosd, aspect oriented software development)。這些研究主要集中在如何擴展uml3使其支持面向方面技術(shù)?,F(xiàn)在面向方面編程還在研究過程中,面向方面的軟件開發(fā)方法的研究也剛剛起步,但是它們代表了未了軟件開發(fā)的方向,grady booch預(yù)言aop將崛起4。1.2研究意義實時嵌入式設(shè)備被廣泛使用在現(xiàn)代生活中,實時控制系統(tǒng)是現(xiàn)代化生產(chǎn)的保證,復(fù)雜的實時系統(tǒng)在國防現(xiàn)代化建設(shè)中發(fā)揮越來越重要的作用。這

23、些系統(tǒng)廣泛應(yīng)用在對時間有較高要求的環(huán)境中,如汽車,飛機,核反應(yīng)堆等的控制中,這些系統(tǒng)的失敗輕則導(dǎo)致經(jīng)濟財產(chǎn)損失,重則生命丟失。實時系統(tǒng)是面向方面很好的應(yīng)用場所,因為在實時系統(tǒng)中,有很多非功能需求,且這些非功能需求往往橫切整個系統(tǒng)。在實時系統(tǒng)中關(guān)鍵的就是時間要求了,如果系統(tǒng)沒有在給定的時間里完成任務(wù),任務(wù)是失敗的,這些時間要求散布在整個系統(tǒng)的功能部件里,帶來了前述的代碼混亂和代碼分散問題,導(dǎo)致系統(tǒng)代碼不易讀,不易修改,易產(chǎn)生不一致,重用性差,不易修改和升級等一系列問題。實時系統(tǒng)的一個重要特點就是要求系統(tǒng)具有可預(yù)報性,要判斷是否調(diào)度是可行的,這需要收集系統(tǒng)當(dāng)前信息和qos信息,追蹤系統(tǒng)執(zhí)行情況,這

24、些代碼也混在功能部件里。實時系統(tǒng)是高可靠性的系統(tǒng),軟實時系統(tǒng)(soft real-time system)任務(wù)的失敗會使系統(tǒng)性能降低,但是有些安全關(guān)鍵(safety-critical)的硬實時系統(tǒng)(hard real-time system)的失敗將會帶來災(zāi)難性的后果,如核反應(yīng)堆控制系統(tǒng),武器控制系統(tǒng)等,這些系統(tǒng)的失敗將會有生命的代價。但是系統(tǒng)故障是不可避免的,因為硬件和軟件不可能設(shè)計的完全正確,所以實時系統(tǒng)需要容錯,這樣一個系統(tǒng)里的容錯代碼也彌漫在整個系統(tǒng)中,導(dǎo)致前述問題。實時嵌入式系統(tǒng)也有安全上的需求,以防止非授權(quán)用戶的進入,同樣這些非功能性代碼也會彌漫在整個系統(tǒng)中。為了提高性能和達(dá)到可預(yù)

25、報性,實時系統(tǒng)需要特別的資源管理策略,如為了可預(yù)報性,不使用緩存和虛存機制,因為缺頁會導(dǎo)致時間不可預(yù)報。另外為了提高系統(tǒng)性能,需要對內(nèi)存進行管理,這些管理策略會彌漫在整個功能部件里。所以有必要把這些非功能代碼從功能部件里分離出來。分別編寫功能部件和非功能方面,然后把它們組合在一起。實時系統(tǒng)在社會和國家生活中應(yīng)用越來越廣泛,影響也越來越大,系統(tǒng)也越來越復(fù)雜。根據(jù)上述實時系統(tǒng)特點和面向方面開發(fā)的特點,可以得出把面向方面技術(shù)應(yīng)用到實時系統(tǒng)開發(fā)中很有必要。1.3面向方面技術(shù)在實時系統(tǒng)中的應(yīng)用研究者已經(jīng)開始探索如何將面向方面技術(shù)應(yīng)用在實時系統(tǒng)中。在實時系統(tǒng)和嵌入式系統(tǒng)中建立了一些模型5,6。5提出了ac

26、cord(aspectual component-based real-time system development)設(shè)計方法,也提出了一個rtcom(real-time component model)模型。使用accord開發(fā)實時系統(tǒng)的過程是:第一階段把把實時系統(tǒng)按功能和低耦合高內(nèi)聚的要求分解為一系列的組件;第二階段把實時系統(tǒng)分解為一系列的方面,方面橫切組件和整個系統(tǒng),這個階段處理非功能需求和橫切關(guān)注點;最后按rtcom實現(xiàn)組件和方面。rtcom允許把方面編織到組件里,包括三部分:(1)功能部分;(2)運行時系統(tǒng)依賴部分;(3)組合部分。另外把方面分為三類:(1)應(yīng)用程序方面;(2)運行

27、時方面;(3)組合方面。嵌入式系統(tǒng)的一個重要特征是依賴環(huán)境。6提出了一個對嵌入式系統(tǒng)進行面向方面的環(huán)境建模方法。7把面向方面編程技術(shù)應(yīng)用到實時操作系統(tǒng)開發(fā)上。因為在實時操作系統(tǒng)里有許多橫切的特征,為了滿足日益增長的對實時操作系統(tǒng)快速定制的要求,需要面向方面編程技術(shù),這里把函數(shù)看成一系列的基本塊,基本塊的功能代碼可由不同的方面提供,這樣橫切了函數(shù),且這些基本塊可視,提供了圖形表示的開發(fā)框架;支持類的組裝,不同方面里的相同的類可以組成一個大類。8展示了如何把面向方面技術(shù)應(yīng)用的分布式實時系統(tǒng)上。分布式實時系統(tǒng)中的非功能需求可以用方面來表達(dá),這篇文章給出了一個把分布性、時間要求和容錯方面加入到一個簡單

28、的日志組件里的方法。9,10把面向方面應(yīng)用到disco(distributed co-operation)系統(tǒng)中,disco 是描述反應(yīng)式系統(tǒng)的形式化規(guī)格說明方法。1.4 研究內(nèi)容本文比較完整地分析介紹了分離和模塊化關(guān)注點的方法,以及面向方面社區(qū)對面向方面建模的研究;闡述了實時系統(tǒng)中實時需求的主要概念和建模方法;提出了一個新的通過擴展uml進行面向方面建模的方法,并將這個方法應(yīng)用于實時系統(tǒng)開發(fā)。論文結(jié)構(gòu)安排如下:第一章介紹了面向方面編程可以模塊化非功能關(guān)注點;分析了實時系統(tǒng)中的非功能關(guān)注點以及實時系統(tǒng)中使用面向方面技術(shù)的現(xiàn)狀。第二章介紹了典型的分離關(guān)注點的方法。第三章闡述了實時系統(tǒng)中的實時需求

29、,以及用uml建模實時系統(tǒng)的方法。第四章分析介紹了面向方面社區(qū)對面向方面建模的研究。第五章提出了一個新的擴展uml來表達(dá)面向方面中的元素和機制,闡述如何將這種方法應(yīng)用于實時系統(tǒng)開發(fā)中。第二章 分離關(guān)注點的方法系統(tǒng)中的非功能需求往往橫切整個系統(tǒng),傳統(tǒng)的結(jié)構(gòu)化方法以及現(xiàn)代流行的面向?qū)ο蠓椒o法很好地模塊化這些非功能需求,導(dǎo)致了實現(xiàn)非功能需求代碼的分散和與功能代碼糾纏在一起,造成代碼量急劇增加,開發(fā)效率低,可讀性差,極易引起不一致等問題,所以需要分離這些非功能關(guān)注點。對于如何有效的分離關(guān)注點,人們已經(jīng)提出了很多方法。如aspectj、組合過濾器、多維關(guān)注點分離和自適應(yīng)編程等。2.1 aspectjg

30、regor kiczales等人于1997年提出了面向方面編程(aop, aspect-oriented programming)概念2,開發(fā)出了第一個基于java的aop實現(xiàn)aspectj11。aspectj引入了連接點(join point)這個概念,以及切入點(pointcut)、通知(advice)、類型間聲明(inter-type declaration)和方面(aspect)的構(gòu)造塊。連接點為程序流中的一些特殊點,包括方法調(diào)用與執(zhí)行,構(gòu)造函數(shù)調(diào)用與執(zhí)行,類或?qū)ο蟪跏蓟?,成員變量的訪問和修改,異常處理執(zhí)行,通知執(zhí)行等。方面可以在這些點改變系統(tǒng)的行為。切入點組合了連接點,并可以提供連接

31、點處執(zhí)行上下文的信息。切入點主要用于通知,通知在切入點改變系統(tǒng)行為。aspectj定義了原子切入點(primitive pointcut),如“call(void point.setx(int)”;也定義了與(&)、或(|)、非(!)來組合切入點。可以用通配符來收集多種連接點,如“call(void point.set*(.)”,表示調(diào)用point的以set開頭且返回值為void的函數(shù),不論這些函數(shù)的參數(shù)類型和個數(shù)。通知在切入點影響系統(tǒng)的行為。通知有多種類型,before通知在指定連接點抵達(dá)但與該連接點相連的程序運行前執(zhí)行;after returning通知在指定連接點處的程序成功返回后執(zhí)行;

32、after throwing通知在指定連接點處程序拋出throwable對象后執(zhí)行;after通知在指定連接點程序執(zhí)行后執(zhí)行,不論成功返回還是拋出異常;around通知在指定連接點處執(zhí)行,只有在around通知體里顯式調(diào)用proceed,該連接點處的程序才能執(zhí)行。類型間聲明改變程序的結(jié)構(gòu)。在方面里可以聲明其他類型擁有的成員(成員變量、成員函數(shù)、構(gòu)造函數(shù)),也可以聲明一些類型實現(xiàn)一個新的接口或繼承一個新的類。方面將這些切入點、通知、類型間聲明封裝起來,形成一個關(guān)注點,與類一樣,方面也可有成員變量和成員函數(shù)。同一個連接點可以被多個方面或一個方面里的多個通知影響,aspectj定義了這些方面和通知的

33、優(yōu)先關(guān)系。這些概念以及構(gòu)造塊的詳細(xì)內(nèi)容可以參考12。圖2-1是一個電信模擬的計時方面。public aspect timing public long customer.totalconnecttime = 0;public long gettotalconnecttime(customer cust) return cust.totalconnecttime;private timer connection.timer = new timer();public timer gettimer(connection conn) return conn.timer; after (connecti

34、on c): target(c) & call(void cplete() gettimer(c).start();pointcut endtiming(connection c): target(c) &call(void connection.drop();after(connection c): endtiming(c) gettimer(c).stop();c.getcaller().totalconnecttime += gettimer(c).gettime();c.getreceiver().totalconnecttime += gettimer(c).gettime();圖2

35、-1 timing方面12它給每個連接引入一個計時器,給每個用戶引入一個保存全部連接時間的變量。在連接建立完成時開始計時,在連接斷開后,停止計時,并計算連接時間和增加通話用戶的全部連接時間值。aspectj編譯器是一個編織器(weaver),它可以將方面織入到它所影響的其他方面或類里,以改變系統(tǒng)的結(jié)構(gòu)和行為。這樣,系統(tǒng)的關(guān)注點可以分別編寫,從而有效分離了關(guān)注點,然后將這些模塊化的關(guān)注點通過編織器組合在一起,形成滿足需求的系統(tǒng)。2.2 aspectc+aspectc+13,14對c+進行擴展以支持面向方面編程,它參考aspectj所使用的方法來對另一種編程語言進行擴展,所以它們的模型基本相同,語

36、法上有些不同。在aspectj中“*”,表示通配符,但是在c+中“*”用來聲明指針,為避免二義性,在aspectc+中以“%”表示通配符。在aspectc+中以“:”代替aspectj中的“.”來表示作用域解析。以“”來匹配函數(shù)簽名的任意數(shù)量形參。在aspectc+中,有兩種切入點:名字切入點(name pointcut)和代碼切入點(code pointcut)。名字切入點是類型、屬性、函數(shù)、變量和名字空間的名字,如“%array”表示任何以“array”結(jié)尾的class、struct或union;“void draw()”匹配有任意數(shù)量形參和返回類型為“void”的函數(shù)draw。代碼切入點

37、要調(diào)用aspectc+定義的函數(shù)且以名字切入點為參數(shù)來形成,如:call(“void draw()”)描述了一系列的函數(shù)draw調(diào)用。另外,為了重用切入點,可以用pointcut(pointcut為關(guān)鍵字)表達(dá)式對切入點命名,即命名切入點(named pointcut),如pointcut arrays()=derived(“array”),這樣arrays能用在表示derived(“array”)切入點表達(dá)式可用的任何地方。在aspectc+中也有兩類連接點,名字連接點用來形成名字切入點,如程序中的類名;代碼連接點用來形成代碼切入點,如程序中的函數(shù)調(diào)用和執(zhí)行。對于名字切入點,通知可以擴展程序

38、代碼和數(shù)據(jù)結(jié)構(gòu),即引入(與aspectj中類型間聲明一樣)。對于代碼切入點,通知在切入點影響系統(tǒng)的行為。與aspectj一樣,方面以模塊化的方式收集橫切關(guān)注點的advice代碼和引入。圖2-2顯示了traceshape 方面來記錄shape類型的對象的構(gòu)造和析構(gòu)。aspect traceshapepublic:static int m_created,m_destroyed;pointcut shapes()=derived(shape);advice shapes(): class helperpublic:helper()traceshape:m_created+;helper()trac

39、eshape:m_destroyed+;m_counter;advice execution(% main(.) : after()printf(shape created:%d,destroyed:%d,m_created,m_destroyed);int traceshape:m_created=0;int traceshape:m_destroyed=0;圖2-2 traceshape方面2.3 組合過濾器(composition filters,cf)cf是語言獨立的模型,它以模塊化和正交化(orthogonal)的方式擴展了面向?qū)ο竽P汀?模塊化的擴展意味著過濾器可以附貼在對象上而不

40、改變對象的定義,這樣過濾器與實現(xiàn)獨立;正交化的擴展即過濾器之間的語義互相獨立,這樣過濾器可以組合15。因為對象之間的通信的機制是消息,這個模型通過過濾器來操控進入或出去的消息來改變對象的行為,圖2-3 描述了這個模型的組成部分。圖2-3 cf模型的組件16上圖描述了一個cf模型中的對象,這個對象包括接口和實現(xiàn)兩部分。接口部分包括接口對象i聲明(被封裝了的內(nèi)部對象和被引用了的外部對象),狀態(tài)s(state, condition)聲明,類方法m聲明和過濾器f;實現(xiàn)部分包括實例變量聲明,類方法和狀態(tài)的實現(xiàn),以及初始化方法。對象可以用四元組表示17。接口對象的申明方式是為objectname:clas

41、sname;狀態(tài)s表示為: 。狀態(tài)可以看成一個用proposition表示布爾函數(shù),用id可以引用這個狀態(tài)。對象的所有方法u0包括對象內(nèi)部定義的方法m0和接口對象定義的方法(滿足遞歸規(guī)則): 過濾器定義為:handler(f)即過濾器處理器(filter-handler),它定義了當(dāng)消息到達(dá)過濾器時如何操控這個消息。a(f)被稱為接受集合(accept set function),是一個有序的集合a。a定義了狀態(tài)方法對集合,狀態(tài)s決定了消息(方法)m是否被接受。消息必須被過濾器集合檢查,檢查的算法如圖2-4:1) algorithm pass_filters(m, f)2) forall f

42、in f = f1, ., fn do3) accept := false;4) forall in a(f) = , ., do5) if (m = mj)sj then6) begin7) accept := true;8) dest := target(mj);9) break;10) end;11) endfor;12) if accept13) then handler(f).acceptmessage(m)14) else handler(f).rejectmessage(m);15) endfor;16) dispatch(m, dest);17) end pass_filter

43、s;圖2-4 檢查接受的消息算法17消息要被所有的過濾器檢查,過濾器用它的接受集合檢查消息,如果滿足接受集合里的一個元素,那么通過當(dāng)前過濾器的檢查,然后轉(zhuǎn)到下一個過濾器。如果消息不滿足當(dāng)前過濾器的接受集合所有元素,消息根據(jù)過濾器處理器的類別拒絕消息。當(dāng)通過最后的過濾器后,消息被分發(fā)。預(yù)定義的過濾器類:dispatch 過濾器:如果接受消息,消息分發(fā)到消息的當(dāng)前目標(biāo)對象;否則消息傳遞到下一個過濾器(如果沒有了過濾器,會產(chǎn)生異常)。error過濾器:如果拒絕消息,產(chǎn)生異常;否則傳遞到下一個過濾器。wait過濾器:如果接受消息,消息傳遞到下一個過濾器;否則排隊等待接受。meta過濾器:如果拒絕消息,

44、消息傳遞到下一個過濾器;否則根據(jù)這個消息生成一個對象,并把這個對象作為參數(shù)傳到新的消息(接受集合元素的第二部分)中。接受到這個新消息對象可以操控這個消息。在實時系統(tǒng)中,繼承以前經(jīng)過驗證的模塊很重要,但是實時需求的改變往往會導(dǎo)致過多的重新設(shè)計,這種情況稱為實時需求繼承反常,即子類時間需求改變導(dǎo)致在子類里出現(xiàn)過多的重新設(shè)計而不是繼承父類的已有實現(xiàn)。下面用18中的例子介紹實時需求繼承反常以及用cf模型解決的方法。類distributionnode代表一個電力分配網(wǎng)中的一個結(jié)點。這個節(jié)點有一條電力產(chǎn)生線和多條電力消費線。結(jié)點控制電流從生產(chǎn)線流向消費線。當(dāng)生產(chǎn)線斷開時,所有的消費線都要在預(yù)定義的時間內(nèi)斷

45、開。結(jié)點可以看成時一個電磁開關(guān),用elmagneticswitches定義,這個類里為每條線定義了連接和斷開方法。假定有一個fastdistributionnode,它是distributionnode的子類,fastdistributionnode定義消費線斷開的截至?xí)r間比它的父類更緊迫。但是由于實時需求與應(yīng)用代碼混和在一起,子類需要重新定義消費線的斷開方法,以使用新的時間約束,這樣父類的斷開方法無法重用,出現(xiàn)了第一種反常。用cf解決的方法是把時間約束放到過濾器中,過濾器把時間約束加到接受的消息上,如圖2-5。當(dāng)子類的時間約束改變后,新的時間約束放到子類的過濾器中,當(dāng)調(diào)用子類的方法時(繼承自

46、父類),子類過濾器給接受的消息加上新的時間約束,如圖2-6。 (1) class distributionnode interface(2) begin(3) internals(4) myswitch: elmagneticswitches;(5) methods(6) productionlinedisconnected returns nil;(7) disconnectconsumerline(integer) returns nil;(8) inputfilters(9) givetimespec: realtime = true = self.* | time.minend( tc

47、onsumer ) | ;(10) settimeforproduction: realtime = true = ductionlinedisconnected(11) | time.setend( numberoflines * time.getend ) | ;(12) invoke: dispatch = true = myswitch.*, true = inner.* ;(13) end;圖2-5 distributionnode的接口定義18過濾器類realtime的輸入過濾器用來影響與過濾器匹配消息的時間屬性。消息將接受“|”里的時間約束。消息的時間屬性用tim

48、e對象表示,time有start(消息的最早開始時間)和end(消息的截至?xí)r間)屬性。time定義了一些方法來操作這兩個屬性:如minend()給消息設(shè)置最早的截至?xí)r間(如果time point的值小于消息當(dāng)前的截至?xí)r間,則消息截至?xí)r間為,否則不變);setend()設(shè)置end屬性為參數(shù);getend:返回end屬性。givetimespec過濾器的接受集合只有一個元素,“”左邊是狀態(tài)(條件),右邊是方法的名字,是的另一種寫法。這里條件為“tue”。如果消息與distributionnode提供的方法匹配,則接受該消息,如果新的時間屬性小于消息的當(dāng)前截至?xí)r間,則過濾器為消息設(shè)置新的截至?xí)r間。如

49、果到來的消息是productionlinedisconnected,它會通過第一個過濾器,在那里設(shè)置其最早截至?xí)r間,然后會傳到第二個過濾器,在這里設(shè)置其截至?xí)r間為numberoflines * time.getend,其中numberoflines是消費線跳數(shù),time.getend返回第一個過濾器設(shè)置的最早截至?xí)r間。 最后添加了時間約束的消息由invoke分發(fā)過濾器分發(fā)。(1) class fastdistributionnode interface(2) begin(3) internals(4) mynode: distributionnode;(5) filters(6) fastti

50、mespec: realtime = true = self.* | time.minend (tconsumernew) | (7) invoke: dispatch = true = mynode.* ;(8) end;圖2-6 fastdistributionnode的接口定義fasttimespec過濾器給fastdistributionnode的消息設(shè)置最早截至?xí)r間tconsumernew,然后消息分發(fā)到其內(nèi)部對象mynode(這是cf模型實現(xiàn)繼承的方法,稱為基于委托的繼承)。被分發(fā)的消息還要接受父類的過濾器檢查,但是由于新的截至?xí)r間小于父類過濾器里的截至?xí)r間,所以父類的giveti

51、mespec過濾器不會改變截至?xí)r間,settimeforproduction會用消費線條數(shù)乘上新的截至?xí)r間設(shè)置productionlinedisconnected消息的截至?xí)r間。這樣滿足了新的時間約束,并且重用了父類代碼,消除了時間需求與應(yīng)用代碼混雜在一起時帶來的繼承反常。當(dāng)同樣的實時需求在一個類系的每個需要的地方都需聲明時,易于出錯,并且不容易加入有同樣實時需求的方法,這樣出現(xiàn)了非多態(tài)(non-polymorphic)實時反常。由于過濾器有匹配的能力,所以可以在過濾器處為多個匹配的方法集中添加時間約束,而不用在方法里申明時間,這樣消除了非多態(tài)實時反常。如果相互獨立的實時需求通過繼承組合在一起

52、時,那么它們之間會相互影響,這樣開發(fā)人員需要重新定義相互影響的需求,出現(xiàn)了正交限制反常。由于過濾器的語義也是正交的,它們的組合可以解決這個問題。過濾器可以用來表達(dá)橫切關(guān)注點,它不但能表示單個對象的關(guān)注點,也可以表示橫跨多個對象的組合關(guān)注點15。 2.4 hyperspace2.4.1 多維關(guān)注點分離為了控制軟件的復(fù)雜性,提高軟件的可理解性,軟件開發(fā)需要把系統(tǒng)分解為小的可管理的模塊,然后組合這些開發(fā)好的模塊得到完整的系統(tǒng)。為了方便軟件維護與演進,要求減少改變帶來的影響,要求模塊的可替換性以及提高軟件生命周期過程中各種制品間的可追蹤性。雖然在這些領(lǐng)域進行了很好的研究與應(yīng)用,但這些問題仍然存在,這主

53、要是由于當(dāng)前軟件開發(fā)方法一次僅支持一種關(guān)注點的分離。如面向?qū)ο笾С謱ο蟮姆蛛x,把數(shù)據(jù)封裝在一起,但是阻礙了特征的演進與增加,因為這需要修改和增加多個類里的方法和數(shù)據(jù),需要侵入系統(tǒng)內(nèi)部。即問題原因在于“主分解專制”(tyranny of the dominant decomposition)19。為了達(dá)到軟件工程的目的,就需要同時分解多種關(guān)注點。多維關(guān)注點分離(multi-dimensional separation of concerns,mdsoc)要求支持任意多的關(guān)注點維數(shù),能同時沿著這些方向分解關(guān)注點,能動態(tài)處理新的關(guān)注點新的分解方向,能處理重疊交互的關(guān)注點20。下面以19,20中的例子

54、來說明主分解專制帶來的問題。這個例子是構(gòu)建和演進一個簡單的軟件工程環(huán)境(software engineering environment,see)來處理程序的表達(dá)式。see支持表達(dá)式程序的創(chuàng)建與操作。包括計算表達(dá)式的值并顯示結(jié)果的計算(evaluation)工具,顯示工具和檢查語法和語義的檢查工具。系統(tǒng)的結(jié)構(gòu)如圖2-7。它把表達(dá)式表示成抽象語法樹(asts),每個ast結(jié)點都由一個類表示,類定義了訪問和修改方法,以及實現(xiàn)計算工具的eval()方法,實現(xiàn)顯示工具的display()方法,實現(xiàn)檢查工具的check()方法。圖2-7 see的初始設(shè)計制品19現(xiàn)在為了減少不必要的重新計算而提高性能,需

55、要對計算結(jié)果進行緩存,這樣一個簡單的需求對設(shè)計和代碼帶來了顯著的影響:它需要在基類里增加保存緩存結(jié)果的變量以及這個變量的訪問方法,修改每個類的setter方法,修改每個類的eval()方法使得它能返回一個緩存的結(jié)果。顯然它需要侵入已有的設(shè)計和代碼中進行修改,支持緩存的代碼與其它代碼交織在了一起,降低了了可理解性和功能的演進。如果系統(tǒng)要增加風(fēng)格檢查(style check)功能,并且希望風(fēng)格檢查能與系統(tǒng)原來的語法語義檢查任意結(jié)合,同樣需要侵入修改,這要影響系統(tǒng)在設(shè)計和編碼的所有模塊。問題就在于主分解專制。主分解滿足一些重要的需要,但是阻礙了另一些,如數(shù)據(jù)的分解符合了應(yīng)用領(lǐng)域的概念,但是功能特征的代碼分散在多個模塊中并且與其他功能特征代碼混雜在一起19。2.4.2 hyperspacehyperspace21是一個支持多維關(guān)注點分離的模型。系統(tǒng)的各種關(guān)注點用原來的方法實現(xiàn),然后通過組合規(guī)則把它們組合在一起。軟件是由制品組成的,每種制品有它自己的描述或?qū)崿F(xiàn)方法,每種方法有它自己的語法單元(unit),如方法,類,狀態(tài)圖等等。單元可分為原子單元和組合單元,原子單元在在特定上下文中不可分割,如方法,實例變量,組合單元由原子單元組成,如類,包,圖等。關(guān)注點空間(concern space)組織領(lǐng)域內(nèi)的單元以分離所有重要的關(guān)注點。hyperspace就是一種支持多維關(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)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論