(计算机应用技术专业论文)面向方面建模方法的设计与应用.pdf_第1页
(计算机应用技术专业论文)面向方面建模方法的设计与应用.pdf_第2页
(计算机应用技术专业论文)面向方面建模方法的设计与应用.pdf_第3页
(计算机应用技术专业论文)面向方面建模方法的设计与应用.pdf_第4页
(计算机应用技术专业论文)面向方面建模方法的设计与应用.pdf_第5页
已阅读5页,还剩83页未读 继续免费阅读

(计算机应用技术专业论文)面向方面建模方法的设计与应用.pdf.pdf 免费下载

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

中山大学硕士学位论文面向方面建模方法的设计与应用 论文题目: 专业: 硕士生: 指导教师: 面向方面建模方法的设计与应用 计算机应用技术 郑风梅 常会友教授 摘要 “关注点分离”一直都是软件开发的一个重要目标和原则。针对面向对象 技术在处理分散于系统各处的横切关注点上的不足,业界提出了面向方面的方 法。由于面向方面方法在处理关注点分离上有优势,所以它被越来越多的软件 系统引入来处理诸如安全性、授权、验证和异常处理等横切需求,因此业界又 提出了面向方面软件开发过程。目前,有关面向方面软件开发过程的研究和应 用可谓百花齐放;可是大部分研究和应用都只是局限于某个子问题或某个应用 领域,缺乏适合一般应用领域的针对整个开发过程的一套详细的规范化方法, 特别是对软件开发的建模阶段缺少具有指导性意义的整套方法。 针对业界对完整的面向方面开发方法的需求,本人在已有研究成果的基础 上,综合各种关于面向方面开发过程特别是建模阶段的方法,设计出一套具有 通用性的面向方面建模方法。这套方法主要包括两部分:一是用形式化语言和 图形化符号来描述面向方面的元素;二是定义面向方面建模过程各个阶段的流 程和制品。为了更方便地进行面向方面建模,本人设计了一个面向方面建模工 具的框架,并开发了一个简易的初级版本,软件设计者可以在上面进行简单的 面向方面设计。另外,为了减轻开发人员的工作量和保持从设计到代码的一致 性,本人还开发了一个代码生成器,能把面向方面设计的形式化语言描述转换 为基于j a v a 的面向方面程序设计语言舢p c c t j 。为了证明整套方法的可用性, 在可重构的e r p 项目中,本人运用了这套建模方法对缓存、参数检测和日志等 横切关注点进行面向方面设计。最后,本人通过与面向对象方法及已有面向方 面建模方法进行对比和分析从理论和实际应用上对这套建模方法进行了客观的 评价。 关键词:面向方面建模、方面、横切点、通知 中山大学磺士学位论文面向方面建模方法的设计与应用 t 钮k : m a j o r : m a s t c r : s u p e r v i f : d e s j g n 强da p p l i c a t i o no f 舡p c d - 0 i i c n t e dm o d e l i i l gm e t h o d s c o i 印u t e re n g i m e r 堍 z h e n gf b n g m e i p m f c s s o rc h a n gh u i ) 帕u a b s t r a c t “s e p e n t i o no fc o n c e r 船”i so n co ft h en m s ti l l l p o r t 柚tg o a l sa n dp r i i l c i p l e si i i s o f t w a r e d e v e l o p m e m o ) i n p a r c d w “ht h e 讥c o l p e t e n c co fo b j c c t o r i e n t e d m e t h o d si nd e a l i l l gw i l ht h ec m 鸥一c u t t 协gc o n c e r i i ss c a l t e r i n ga m u n dt h cs y s l e m s , a s p e c t 一伽e m e d ( a o ) i n e t h o d sa r ca d v a i l c c d b e c a u s eo ft h e i ra d v a m a g e si n s e p 盯a t i n gc 0 i l c c r 雎,a om e t h o d sa 陀w i d e l yu s e di nm o r e 锄dm o r cs y s t e m st o m a i m g ec r o s s - c u t t i n gr c q u 血c m c m sl i l 【es c c u r i t y a u t h o r i 髓t j o l l ,a u t h c m i c a t i o na | i d e x c e p t i o ni m a g e m e t a sar c s u l t ,a s p c d e d - o r i e n t e ds o f t w a 咒d e v e l o p m c m ( a o s d ) i sp r o p o s e d h o w e v e r ,m o s to ft h er e s e a r c l l c sa n da p p l i c a t i o n so f a o s d 缸el i m i t e dt oo n l yo n cp m b k mo ro cf i c l d ,卸dt h c 陀a r c 肿s p c c i s t 卸d 盯d m e t h o d sw h i c ht a r g e tt h cw h o l c f l w a f ed e v e l o p m c n p r o c e 蟠f o r g e n e 糟l a 即l i c a t i o n s ,e s p e c i a i l yi i it h em o d e l i l l gp l l a t os a t j s f yt h cr e ( 1 u 眈m e n t so fa o s d ,也证p 印c rp m p 0 sa to f a o 啪d e l i n g m e t l l 0 d sb 鹬e d0 nt h e mr e a r c h t 1 i e m e t l 町d si n c l l d e s d c s c r i b i l l ga o e k m e n t sw i t haf o 咖a l i z e dl a n g i l a g c 锄d i g r a p l l i c a ls y 血b o l s ,柚dd e f i l l i n gt h e p f o c e s sa n dp r o d u d so ft l l cp h a s e si l la o s d i no r d e rt od oa 0m o d e 妇ge a s i l y w r e d e s i g a 丘a m e w o r ko fa a om o d e l i i l gt 0 0 l 如dd e v e 玉0 pap r i m f yc d i t i o n ,w i t h w h i c hd e s i g l l c r 啪d os i m p l ea o d c s i g 璐i na d d j t i o l l ,a d em a l 【e ri sd e v e l o p c d , w j l i c h 锄b cu s c dt oc o n v e n 如m m l i z e da o d c s i 弘st oa 印e c t j ( t h ea 0h n g u a g e b a do nj a v a ) d e s ,s oa st or e l i e v ec o d e r s t 鹤k sa n dt oe 咖r ec 0 璐i s t e n c yw i t l l i n t h cp m c c 鼯丘d md e s i g nt o d e w ba p p l yo u ra om e t h o d st oar e r p p m j e c t ,柚d p m v e t h e 缸a v a i l a b j l i ty a ll a s t ,o u ra o n l o d e l 抽gm e t h o d sa r e 弱s e 锚e di i lt h c o r ya s w e 勰i np r a c t i c e ,b yc o n 】p a r i n gt h e mw i i ho om e t h o d sa n dc l i r r e n ta oi i l e t h o d s 1 堙,w o r d s :a om o d e l i n g ,a s p c c t ,p o i n t c l i t ,a d v i c c i i 巾山大学硕士学位论文 面向方面建模方法的设计与应用 1 1 研究背景 第1 章引言 随着软件系统规模和需求的不断增加,系统各个组件之问的相互影响变得越 来越复杂。这些相互影响可能会限制软件的重用性、适应性,并使验证系统的设 计和正确性交得很困难【。因此,为了满足未来的需求,我们不可避免地要对这 些系统进行重新设计和构造。 面向对象( o b j e c t 0 r j e n t e d ,0 0 ) 方法一向标榜它的重用性和可扩展性,因 为它对关注点的分离( s e p a r a t i o n o f c o n c c r 璐) 起到了很重要的作用。然而,在以 面向对象方法为主导设计方法的软件系统中,仍然会出现上面所说的情况。究其 原因,那是由面向对象本身的特性决定的【”。关注点分离一直都是软件开发的一 个重要目标和原则。研究表明,面向对象方法在处理关注点的完全分离上存在不 足,因为它只提供了分离关注点的一个一维模型,因此面向方面方法只能解决对 象之间交互相对简单的问题【2 1 。然而,在现实的软件系统中,特别是并发式软件 系统中,关注点之间是一种多维模型,系统不仅存在相对集中的公共关注点 ( c o m 瑚na s p e c t s ) ,同时也存在分散在系统各个组件中的横切关注点 ( c m 蟠c u t ga s p e c t s ) 。系统的功能分解是一维,而那些横切于系统层次功能模 型的关注点刚是另外的维。这些关注点与系统的功能构件之间相互作用,呈现出 横切关系。如果仅使用面向对象方法来设计存在大量横切关注点的复杂系统,必 然会引起代码絮乱( c o d et a n g l j i l g ) 实现横切关注点的代码分散于各个相关 组件的代码中,这样会破坏组件的模块化,并使源代码难以编写和读懂,限制了 软件的重用性,使源代码不易更改,从而使程序更容易出错,最后影响了系统的 质量。 针对面向对象方法的不足,为了更有效地实现关注点的分离,业界提出了面 向方面( a s p e c t o r i e n t e d ,a o ) 的方法。面向方面方法用一种新的构造单元 “方面( a s p e c t ) ”来表达横切关注点,把横切关注点从系统的基本功能模型中分 离出来设计和实现,然后再利用工具把方面的实现“编织( w v e ) ”到系统的功 能构件中去。面向对象设计着重解决公共关注点的问题,也就是在组件层次的顶 中山大学硕士学位论文面向方面建模方法的设计与应用 部捕获相关实体之间的公共属性和行为;相反,面向方面设计则处理不相关的项, 试图模块化某个软件层中散布于各个组件( 不管其领域如何) 的公共属性和行为, 从而增加软件的模块性。 由于面向方面方法在处理关注点分离上的优势,越来越多的软件系统引入它 来处理诸如安全性、授权、验证、变更管理等横切需求,因此针对面向对象的软 件开发过程( o b j e c t o r i e n t e ds o f t w a f ed c v e l o p m e m ,o o s d ) ,业界提出了面向 方面软件开发过程( 却e c t o r i c n t e ds o 脚盯ed c v c l o p m e m ,a o s d ) 。a o s d 的 主要思想是在软件开发的早期需求和架构设计阶段就对横切关注点进 行分离,并把面向方面的思想和方法应用于软件开发的各个阶段从设计到代 码【3 】【舢。目前,a o s d 的研究和应用可谓百花齐放;可是大部分研究和应用都只 是局限于某个子问题或某个应用领域,缺乏适合一般应用领域的针对整个开发过 程的一套详细的规范化方法,特别是对软件开发的建模阶段( 需求分析和设计阶 段) 缺少具有指导性意义的整套方法。为了能把面向方面的思想和方法更充分地 应用到复杂系统的开发中,我们迫切需要设计一套具有通用意义的完整的面向方 面软件开发方法。 1 2 本文的研究工作和意义 针对业界对完整的面向方面开发方法的需求,本人在已有研究成果的基础 上,综合各种关于a 0 s d 特别是a o s d 建模阶段的方法,设计出一套具有通用 性的面向方面建模方法( a s p e c l o r i e i 哇e dm o d e l i n gm e _ t h o d s ) 。这套方法主要包括 两部分:一是用形式化语言和图形化符号来描述面向方面的元素:二是定义面向 方面建模过程各个阶段的流程和制品。为了更方便她迸行面向方面建模,本人设 计了一个面向方面建模工具的框架,并开发了一个简易的初级版本,软件设计者 可以在上面进行简单的面向方面设计。另外,为了减轻开发人员的工作量和保持 从设计到代码的一致性,本入还开发了一个代码生成器,能把面向方面设计的形 式化语言描述转换为基于j a v a 的面向方面程序设计语言a s p e c t j 。为了证明这套 方法的可用性,在可重构的e r p 系统中,本人运用了这套建模方法对缓存、参 数检测和日志等横切关注点进行面向方面设计。最后,本人从理论和实际应用上 对这套建模方法进行了评价。 一2 一 中山大学硕士学位论文 面向方面建模方法的设计与应用 本文设计的面向方面建模方法吸取了一般面向对象和面向方面建模方法的 长处并对其进行了有益的扩展,详细定义了适用于般应用领域的软件系统开发 过程,给出了各个阶段需要进行的工作和产生的制品。这对面向方面技术在大型 软件系统开发中的广泛应用具有很重要的意义。面向方面技术在软件开发中得到 充分利用,从而软件的重用性、适应性和可扩展性又会得至q 进一步提高。 1 3 本文的组织结构 本文共分为七章,主要介绍了面向方面建模语言、建模过程和建模工具的设 计、应用和评价。除本章外,本文其余各章组织如下: 第二章是对面向方面相关理论和应用的介绍,主要包括面向方面的组成要 素、面向方面软件开发过程和动态方面编织技术等。 第三章到第六章是本论文的重点。第三章用形式化语言和图形化符号详细地 描述了方面的各个元素、方面与类之间的关系、方面与用况之间的关系以及方面 与方面之间的关系,并用) a l 语言对方面进行了规范化定义。第四章详细定义 了面向方面建模过程的各个阶段计划阶段、分析阶段、设计阶段、优化阶段 和构造阶段的主要工作流程和制品。第五章介绍了面向方面建模工具和代码 生成器的设计思想。第六章给出了面向方面建模方法在一个实际项目“基于中小 型制造业企业的可重构e r p 系统”中的应用。 第七章总结了全文,并通过对比从理论和实际应用两个角度对整套面向方面 建模方法进行分析和评价。最后提出了进一步的研究工作。 一3 一 中山大学硕士学位论文面向方面建模方法的设计与应用 第2 章面向方面及相关理论和应用的概述 2 1 面向方面技术的发展过程 2 1 1 面向方面技术的提出 面向对象思想和方法在软件工程中起到很重要的作用,它的其中几个主要的 贡献有1 5 】: 使软件的复杂性得到更充分的理解和更好的管理。在面向对象框架里, 概念被充分地模块化成对象,因此面向对象框架能让我们构造自然和更 利于理解的模型。此外,对概念的封装可以隐藏不必要的细节,可以通 过对象的继承捕捉相关概念之间的关系。 使软件具有可扩展性、可适应性和可重用性。对象的继承性让我们可以 扩展和修改对象;多态性让我们可以为构件提供不同的实现方式。 使软件具有可维护性。封装有利于减少耦合,多态性让我们避免可能错 误的类型转换。 如今,软件工程的焦点从开发一个单独的应用转移到开发适用于一类应用的 可重用的解决方案。然而,在这个转换过程中,有相当一部分问题是面向对象方 法所不能充分解决的【5 】: 对应用家族的系统的建模方法。 对领域概念的充分分解和定义。 对来源于面向家族的开发过程的附加复杂性的管理。 减少由于设计的可理解性、可适应性、可重用性和可维护性的改善而引 起的性能消耗。 面向对象方法的不足在关注点的分离上显得更加突出。关注点分离一直都是 软件开发的一个重要目标和原则。面向对象技术曾在关注点的分离上起到了很重 中山大学硕士学位论文 面向方面建模方法的设计与应用 要的作用:它模块化了系统的公共关注点( 功能关注点) ,使不同的功能可以在 不同的模块中实现,因而降低了各个模块的耦合度,提高了系统的模块化。然而, 对于另一类关注点? 分散于系统各处的横切关注点,面向对象方法却没有提供 很好的支持。这些横切关注点分散于系统的各个模块中,破坏了系统的模块化, 引起了代码的絮乱。这一切,都是由面向对象本身的性质引起的。因为面向对象 仅提供了分离关注点的一维模型,也就是功能关注点的分离。然而,在现实的软 件系统中,特别是在复杂的并发式软件系统中,关注点之间是一种多维模型,系 统不仅存在相对集中的公共关注点,同时也存在分散在系统各个组件中的横切关 注点。系统的功能分解是一维,而那些横切于系统层次功能模型的关注点则是另 外的维。这些关注点与系统的功能构件之间相互作用,呈现出横切关系。如果仅 使用面向对象方法来设计存在大量横切关注的复杂系统,必然会引起代码的絮乱 实现横切关注点的代码分散于各个相关的组件的代码中,这样会破坏组件的 模块化,并使源代码难以编写和读懂,更限制了软件的重用性,使源代码不易更 改,从而使程序更容易出错,最后影响了系统的质量。 因此,针对面向对象方法的不足,为了更有效地实现关注点的分离,业界提 出了面向方面的方法( 1 9 9 7 年g 托9 0 f 幻c z a k s 在x e m x 鼢皿c 上首次提出了面向 方面编程) 。面向方面方法用一种新的构造单元“方面”来表达横切关注点, 把横切关注点从系统的基本功能模型中分离出来设计和实现,然后再利用工具把 方面的实现“编织”到系统的功能构件中去。面向对象设计着重解决公共关注点 的问题,也就是在组件层次的顶部捕获相关实体之间的公共属性和行为;相反, 面向方面设计则处理不相关的项,试图模块化某个软件层中散布于各个组件( 不 管其领域如何) 的公共属性和行为,从而增加软件的模块性。换句话说,面向对 象中的“类”或“构件”模块化了系统的功能关注点,而面向方面中的“方面” 则模块了分散于各个功能模块的横切关注点( 见图2 1 ) 。 中山大学硕士学位论文面向方面建模方法的设计与应用 l 构件c o p o n e n t c 1c 2 c 3 c 曩 图2 - 1 方面和功能构件的横切关系 下面我们将简单介绍一下面向方面的影响和应用范围,以及使用面向方面的 必要性等。 ( 1 ) 面向方面能给我们带来什么? 当每个新的软件设计师都被要求掌握如何将需求功能转化成一个个类,并且 定义它们的数据成员、行为,以及它们之间复杂的关系的时候,面向方面编程 ( 舢p e c t 一0 d e n t e dp m g r a m m i n g ,a o p ) 为我们带来了新的想法、新的思想、新 的模式【6 】。 如果说面向对象编程是关注将需求功能划分为不同的并且相对独立,封装良 好的类,并让它们有着属于自己的行为,依靠继承和多态等来定义彼此的关系的 话;那么面向方面编程则是希望能够将通用需求功能从不相关的类当中分离出 来,能够使得很多类共享一个行为,一旦发生变化,不必修改很多类,而只需要 修改这个行为即可。 面向方面编程是一个令人兴奋不已的新模式。就开发软件系统而言,它的影 响力必将会和有着十数年应用历史的面向对象编程一样巨大。面向方面编程和面 向对象编程不但不是互相竞争的技术而且彼此还是很好的互补。面向对象编程主 要用于为同一对象层次的公用行为建模。它的弱点是将公共行为应用于多个无关 对象模型之间。而这恰恰是面向方面编程适合的地方。有了a o p ,我们可以定 义交叉的关系,并将这些关系应用于跨模块的、彼此不同的对象模型。a o p 同 一6 一 方面 s p e c t s 中山大学硕士学位论文 面向方面建模方法的设计与应用 时还可以让我们层次化功能性而不是嵌入功能性,从而使得代码有更好的可读性 和易于维护。它会和面向对象编程合作得很好。 业务逻辑持久性 方面化的分解 图2 2 需求关注点的分解【6 】 图2 2 是一张非常经典的图1 6 】,它告诉我们,需求功能通过a o p 的魔力三 棱镜的折射之后,就会变成彼此相对独立的方面,我们可以分别实现它们,然后 再组合起来。透过这个三棱镜,我们看到了从未看到的奇妙的景象。 a o p 并没有帮助我们解决任何新的问题,它只是提供了一种更好的办法, 能够用更少的工作量来解决现有的一些问题,并且使得系统更加健壮,可维护性 更好。同时,它让我们在进行系统架构和模块设计的时候多了新的选择和思路嗍。 ( 2 ) 面向方面的应用范围 a o p 主要用于封装系统的横切关注点。最常见的一些横切关注点有: 个性化应用系统的异常捕捉及处理 同志记录,跟踪,优化和监控同步和并发处理 事务的处理资源池,如数据库连接池的管理 性能的优化系统统一的认证、权限管理等 持久化 代码的调试 7 针对具体行业应用的横切行为 中山大学硕士学位论文面向方面建模方法的设计与应用 ( 3 ) 为什么要使用面向方面? 相对于面向对象编程0 0 p ,面向方面编程的优点有: 解决了o o p 中实现横切关注点带来的代码混乱和代码分散的问题。 模块化横切关注点,减少代码冗余,使系统容易理解和维护。 系统容易扩展。设计者很难顾及到系统可能需要处理的所有关注点,使 用a o p ,很容易通过建立新的方面加入新的功能;同时也可以很方便地 从系统中去除不要的功能,而且不会影响面向对象的基本代码。这就是 方面的“易拔插”特性。 设计决定的迟绑定。使用a o p ,设计师可以推迟为将来的需求作决定。 更好的代码重用性。a o p 把每个方面实现为独立的模块,模块之间是松 耦合的,这意味着更好的代码重用性。 对并发系统提供了更好的支持。使用a o p ,能更充分地实现系统的并发 处理,从而提高系统的性能。 ( 4 ) a o p 会代替0 0 p 吗? 很多人在初次接触a o p 的时候可能会说,a o p 能做到的,一个定义良好 的o o p 的接口也一样能够做到,这个观点是值得商榷的。a o p 和定义良好的 o o p 的接口可以说都是用来解决并且实现需求中的横切问题的方法。但是对于 0 0 p 中的接口来说,它仍然需要我们在相应的模块中去调用该接口中相关的方 法,这是o o p 所无法避免的,并且一旦接口不得不进行修改的时候,所有事情 会变得一团糟;a o p 则不会这样,你只需要修改相应的方面,再重新编织即可。 当然,在当前软件开发中,a o p 也绝对不会代替0 0 p 。核心的需求仍然会 由o o p 来实现,而a o p 只是实现系统的非功能性需求,如安全性、持久性等。 a o p 将会和o o p 整合起来,以此之长,补彼之短。 2 1 2 面向方面软件开发过程的提出 面向方面思想一开始提出的时候,主要用于软件开发的代码阶段,用于解决 一8 一 中山大学硕士学位论文面向方面建模方法的设计与应用 某一特定的子问题,而且是针对某些特定的代码段去应用特定的方面的。由于面 向方面方法在处理关注点分离上的优势,越来越多的软件系统引入面向方面的方 法来处理诸如安全性、授权、验证、变更管理等横切需求。如果等到代码阶段才 利用面向方面的方法来处理这些横切需求,必然会影响系统的完整性,同时也不 利于系统的重用;因此我们有必要在软件开发的早期就识别出系统的横切需求, 并利用面向方面的方法处理这些需求。 鉴于此,针对面向对象的软件开发过程o o s d ,业界提出了面向方面软件开 发过程a o s d 。a 0 s d 的主要思想是在软件丌发的早期需求和架构设计阶段 就对横切关注点进行分离,并把面向方面的思想和方法应用于软件开发的各 个阶段从设计到代码【3 】【4 1 。 2 1 3 动态方面编织技术的提出 面向方面编程的目的是模块化软件中的横切关注点,为这些横切关注点定义 自己的行为和属性。如前所述,方面是通过编织工具( w e a v e r ) 编织到特定的构 件中的。早期的编织工具( 如a s p e c t j 、a s p e c t c + + 等) ,采用的是静态编织( s t a i i c w e a v i n g ) 的技术,也就是在编译阶段( c o m p i l e t i i n c ) 就把用方面封装了的横切 关注点的实现代码合并或编织到软件的基本构件中。静态编织要求程序员在应用 编译前就把方面的代码写好。 随着面向方面技术的发展,人们提出了动态编织( d y n a m i cw e a v i n g ) 的方法: 横切关注点的实现可以动态地编织到基本代码中;方面可以在运行时( n l n t i l e ) 定义和生成,然后动态地添加到基本代码中或者从基本代码中删除1 7 】。动态编织 使程序员可以在系统启动运行后再编写方面代码,方面可以在系统运行时启用 禁用和增加,删除,这就是方面的“热部署”【8 】。 目前,很多编织工具( 如加p e c t w e r l 【z 、d a oc + + 等) 都支持方面的动态编 织【9 】( 见表2 1 ) 。动念a o p 主要使用j d k 的动态代理a _ p i 或字节码b v t e c o d e 处理技术。动态编织的灵活性使面向方面方法的优势进一步扩大。我们可以利用 面向方面技术为系统设计多套数据库的实现方案,或者设计多个用户界面;然后 在系统运行的时候才决定使用哪一套数据库实现方案或者哪一个用户界面。这大 大地提高了软件系统的灵活性和可扩展性。 9 中山大学硕士学位论文面向方面建模方法的设计与应用 表2 1 常见的动态编织工具 壤缎王爨煮糍颡谶甏垂 _ ? 澄菠骞鼍二o | ? 冁毪 轻负荷、高性能、用m 。表示方面、 蛳t w 日k z 】a v ab e a 公司 方面热部署、应用与j 2 e e 架构 a s p 耐c + + c + + 微软 与m i c f o f iv i s 岫ls t u d i o 整合 a s p c c t j j a v am m支持一般性和注释 a j d tj a v al b m 与e d 4 e 等j a v a 工具整合 a o p h pp h pc 【m s t a lc 0 l i m 大学基于p h p 语言的 2 2 面向方面的基本概念 下面我们将简单介绍一下面向方面的基本概念1 1 0 j f l l l i l 2 】,包括横切点、通知、 类型间声明、方面等。 2 2 1 连接点 连接点( j o i np o i n t ) 是程序运行流程中的一点,可以看成是在程序运行的 过程中发生的一个事件( t h i n g st h a th a p p e n ) 。典型的连接点有方法的调用、 对象的初始化、域的读写、异常处理的执行等( 详见表2 2 ) 。 表2 - 2 方面中热型的连接点 i :灌攮瀛 一 ? “。j 。囊誓謦| 善奄潮誊著影毒| | 。 方法调用( c a n ) 包括类的成员方法的调用,类的构造方法的调角等 方法执行( e x c c u n o n ) 包括类的成员方法的执行,类的构造方法的执行等 对象初始化对对象进行初始化( n e w 操作) 域成员的读写获得域成员的值,或者改写域成员的值 异常处理的执行程序抛出异常后转去的代码的执行 通知的执行方面里的“通知”定义的代码段的执行 进入某些代码段程序运行流进入到某些代码段 某个条件成立栗个条件( _ h j 表达式表不) 成立 注:调用和执行的区别:执行是指真正的方法体的运行,而调用则是指整个方法要执行所做的 切工作;因此笼统地看,同个方法的调用连接点在执行连接点之前。 2 2 2 横切点 横切点( p o i n t c u t ) 收集程序运行流程中的连接点;换句话说,横切点是某些 中山大学硕士学位论文面向方面建模方法的设计与应用 连接点的集合,这些连接点或是通过逻辑关系组合起来,或是通过通配、正则表 达式等方式集中起来。横切点代表了具有某个或某些特征的一类连接点,如“某 个类所有方法的调用”、“所有名字含s c t 子串的方法的执行”、“对某个类所有 字符串类型的域成员的读取”等。横切点是面向方面理论的重要概念。一般来说, 连接点极少单个出现。通常都是以横切点的形式出现在方面中。 2 2 3 通知 通知( a d v i c e ) 定义了当程序到达某些连接点时需要执行的操作。通知通常 有三种:b c 幻r e 通知、a f t e r 通知和a m u n d 通知,分别表示在连接点之前、之后 和代替连接点执行的操作( 见表2 3 ) 。通知的威力在于它可以访问在连接点运行 时的上下文中的值,因此可以根据情况作出不同的反应。 表2 3 方面的三种通知 通知交强 一 毫薯曩。曩蓊一褡豢一 “, j j - b e f o r e 通知 定义了当程序恰好到达某些连接点之前 需耍执行的操作 8 f t e r 通知定义了当程序恰好到达某些连接点之后 需要执行的操作 a r o u n d 通知定义了代替指定连接点原来操作的操作 注: “恰好到达某些连接点之前”是指连接点开始时刻的前一时刻: “恰好到达某些连接点之后”是指连接点结束时刻的后一时刻。 2 2 4 类型阀声明 类型间声明( i n t e r - t y p ed e c l a f a t i o n ) 是指那些跨越类构件和它们的层次结构 的声明。这些声明可能是横跨多个类的成员声明或者是类之问继承关系的改变。 不像通知是动态操作,类型问声明是编译时的静态操作。典型的类型间声明有定 义类的成员方法、定义类的域成员、定义类的继承关系、定义异常等( 见表2 4 ) 。 在类型闻声明中对类构件的定义或层次结构的改变,只在相关的方面中有 效;在其他方面或类构件中则不产生任何作用。也就是说,类型间声明实际上 并没有影响到原来的面向对象结构,即没有破坏原来面向方面所定义的内容。 中山大学硕士学位论文面向方面建模方法的设计与应用 表2 - 4 方面中典型的类型间声明 j 豢粼黟骥毫曩+ 。i :,。蕞引 i ;? 。,j f _ 鬈一曩张予 i 1 : 定义类的成员方法 为类e l p l o y e e 增加一个s h o w s t a t u s o 方法 定义类的域成员为类e i n p l o y e e 增加一个o h i m e 域 定义类的构造方法 为类e m p i o y e e 增加一个参数是i d 号的构造方法 类的继承:声明类c 是类a 的子类; 定义类的继承关系 接口的实现:声明类m 和类n 实现了接口x 定义需要打包的异常类a 抛出的所有i o 异常 警告:当对空字符串进行读取时提示警告信息“这是空串! ”; 定义警告和错误 错误;当对空对象进行添加时提示错误信蔗r 不能增加空记录! ” 定义方面的优先次序声明方面a 比方面b 具有更高的优先级 注: 方面中定义的需要打包的异常都会封装在某个异常包中。 2 2 5 方面 上述的横切点、通知以及类型间声明,组成了方面( a s p e d ) 的最核心部分 ( 同时也是方面有别于类的最明显特征) ;核心部分再加上方面自身的域成员和 方法定义,构成了一个完整的方面。换句话说,方面是横切点、通知和类型间声 明等的联合体( 见图2 3 ) 。从结构上讲,方面很像面向对象中的类,类是数据对 象和数据操作的统一体。表2 5 和表2 6 分别总结了方面与类的相同点和不同点。 袁2 5 方酝与类的相同点 + 摹一4 爱一量薹勰器鞋童黪薯、一o r ;,oi : ? 1 都有类型。类是一种类型,方面也是一种类型。 2 都可以继承。类可以继承类,方面也可以继承类或者其它方面。 3 方面和类一样,可以是抽象的,也可以是具体的。 4 与非抽象类可以实例化一样,非抽象方面也可以实例化。 5 与类相似,方面可以有静态和非静态的状态( 域) 和行为( 方法) 。 6 与类相似,方面可以有域、方法和类型作为它的成员。 7 非特权方面的成员使用跟类相同的访问规则( p u b l i c 、p d v a t e 、p r o t e c t e d ) 。 图2 _ 3 方面的组成 中山大学硕士学位论文 面向方面建模方法的设计与应用 表2 - 6 方面与类的不同点 、;,砥i 蹙:恭? :。_ + ? 叠 一_ 嘉! 藤:,_ 一:。i 一 樊 封装的关注点 横切关注点 公共关注点 横切点有无 通知有无 类型间定义有 无 构造方法无 有 析构方法无有 通过i m w 创建不能能 访问其他类零的私有成员特权方面可以访问其他类型的私有成员 不能 2 2 6 编织 编织是把特定连接点的实现代码( a d v i c e ) 插入到相应的连接点代码上。通 过编织工具,通知会“插入”到通知对应的连接点的前面、后面或连接点所在的 代码中。编织技术主要有两种,一种是静态编织,即在系统编译时把方面编织到 构件中;另一种时动态编织,即在系统运行时把方面部署到构件中。静态编织要 求程序员在系统编译前就确定方面的实现代码,而动态编织则可以在系统运行后 自由地启用和禁用方面。静态编织对系统性能损耗较少:而动态编织对系统性能 损耗相对较多,但运用更灵活,而且系统性能的损耗可以通过并发处理等方法来 弥补,因此,动态编织是编织技术的主流趋势。 2 3 已有的面向方面软件开发过程的研究与应用 本文主要是关于面向方面建模方法的,是面向方面软件开发过程a o s d 的重 要部分之一。目前业界在a o s d 上已经有了不少先进的研究和应用,这是本论 文研究的基础和参考。因此,在这一小节,我简单总结一下关于a o s d 的有关 研究和应用,并对已有研究的不足之处进行评价。 2 3 1 已有的研究和应用 面向方面技术引起了人们越来越多的关注,有关面向方面技术在软件开发中 的研究与应用也越来越多。 中山大学硕士学位论文面向方面建模方法的设计与应用 a o s d 的有关研究 y 柚gy u 和jk i c 皿l c 设计了一个并发的方面优先级模型,用来处理多 个方面应用于同一个关注点的问题【1 3 】。 gs o u 姐和ss o a r c s 等提出采用用况驱动的方法在需求设计阶段分离横 切关注点【1 4 】。 hf 址i l l 和nb o u r a q a d i 等提出把a o s d 和c b s d ( c o m p o n e n t - b a d s o f t w a r ed e v e l o p m e m ,基于构件的软件开发过程) 整合起来【15 1 。 l b a s s 和m e i n 等提出使用结构化推理方法来识别方面【1 们。 d c o p p i l 和bo o x 提出用软件计划类分离关注点1 1 ”。 ds t e i n 和sh 龃e n b e 唱等提出在面向方面建模过程中用图形方法来对 横切点进行建模【1 8 】。 nl d u g l l r a n 等提出把面向方面技术和框架技术相结合来支持产品线变 更管理f 1 9 】。 eb a n i 舔s a d 等设计了一套n e m c j ,d ( ,c 方法,用来在系统需求中识别出 方面1 2 0 1 。 bd c v e r c u x 提出使用交替时间逻辑对方面进行成分分析【2 1 】。 另外,还有很多研究是关于方面的分解、合成和重用的;还有研究是 关于设计一个语言无关的方面编织器,能把任意面向方面代码编织到 任意面向对象代码中( a 0 代码和o o 代码不一定基于同一种程序程序 设计语言) 。 a o p 和a o s d 的实际应用 数据库加密( gb 0 s t m m ) 1 2 2 l 方法的断言( t i s h i 0 等) 【2 3 】 遗传系统的安全性管理( rl a n e y 等) 1 2 4 】 软件变更检测( p f a l c 盯i n 等) 【2 5 1 用方面封装持久性( a r a s h i d 等) 【2 6 】 自动化系统的监控( hc h a n 等) 【2 7 】 软件产品线的变更管理( nh u g h r 姐和db e u c h e 等) 【1 9 】【2 8 1 中山大学硕士学位论文面向方面建模方法的设计与应用 异常检测和处理( m l 币p e n 等) 【2 9 】 网页服务管理( b v c r l l e e c k e ) 1 3 0 1 基于j 2 e e 架构的系统里e j b 的事务管理( jf a b r y ) 和业务层模式应 用( r m u r a l i 等) 1 3 1 】【3 2 l 除此之外,还有很多工业化的应用得益于a o p 。如j b o 骆4 0 就是基于a o 架构的h b 容器,相对于基于o o 架构的j b o s s3 x ,j b o 鸽4 o 的源码要比j b o s s 3 x 容易理解多了,这对于一个大型复杂系统来说是非常重要的。它已经通过了 j 2 e e 的认证,并且在工业化应用中证明是一个优秀的产品。 2 3 2 不足之处 目前,a 0 s d 的研究和应用可谓百花齐放;可是大部分研究和应用都只是局 限于某个子问题或某个应用领域,缺乏适合一般应用领域的针对整个开发过程的 一套详细的通用的规范化方法,特别是对软件开发的建模阶段( 需求分析和设计 阶段) 缺少具有指导性意义的整套方法。为了能把面向方面的思想和方法更充分 地应用到复杂系统的开发中,我们迫切需要设计一套具有通用意义的完整的面向 方面软件开发方法。 中山大学硕士学位论文面向方面建模方法的设计与应用 第3 章面向方面建模语言的设计 这一章将详细讲解面向方面建模语言( a s p c c t - o r i c m e dl 肋g l i a g c ,j w l ) 的 设计方案。a i l 用形式化语言和图形化符号描述了方面、方面与类接口的关系、 方面与用况的关系以及方面与方面的关系,最后还给出了方面的x m l 定义。 w l 是对统一建模语言( u n i f i e dm o d e l i n gl a n g u a g e ,u m l ) 的扩展,是在 u m l 中加入面向方面相关的元素。a m l 不是要代替u m l 相反,是对u m l 的补充和改善。我们尽量完整地保持u m l 的内容,有关面向对象的设计,我们 将严格按照u m l 规范【3 3 】【矧来描述;而有关面向方面的设计,我们尽可能用与 u m l 类似或兼容的方式来描述,使熟悉u m l 的读者可以很快地了解和掌握 a m i 。 3 1 方面的描述 3 1 1 文字描述 上一章已经介绍过,方面是由横切点、通知和类型间声明等要素组成的,其 中类型间声明又包括方面编织优先次序的声明、类( 或方面) 与类的继承关系的 声明、类( 或方面) 与接口的实现关系的的声明、类的域成员的定义、类的成员 方法的定义以及程序中警告和错误的定义。 3 1 2 图形表示 为了与u m 已中的类相区别,在a m i 中我们用一个双层外框的矩形表示一 个方面。根据实际需要,方面的图形表示可以隐藏具体的方面要素( 横切点、通 知等) ,也可以部分或完整地显示方面要素。 隐藏所有要素的方面 隐藏了所有要素的方面可以简单地用一个双层外框的矩形表示,矩形内写上 方面的名字即可。图3 1 ( a ) 和( b ) 分别展示了这种方面的a m l 图形表示法和它的 中山大学硕士学位论文面向方面建摸方法的设计与应用 一个具体例子( 方面l d g g i n g ) 。 隐藏了所有要素的方面的a m l 图形表示法 显示部分要素的方面 显示部分要素的方面( 如横切点和通知) 可以用图3 - 2 ( a ) 的图形来表示。图 3 2 ( b ) 是一个具体例子( 方面b g g i n g 包含两个横切点和一个通知) 。 方蘧名 p o h 吐c u t a d h c e ( 丑) l o g g i n g p o 如托眦c r e 砒e :c 盐皿i s t 章c ”a 怂弋b a s e m 啦+ ) ) p o i l i 扯u t 坤d a t c :c a n 圆赫c 件t 肺d a t e + a s e h e 竹卜) ) a 捌c ea 出zc 他a 虹i i1 节d a 怔 显示横切点和通知的方面的a m l 图形表示法 完整的方面 图3 - 3 ( a ) 和( b ) 分别展示了完整方面的a m l 图形表示法和它的一个具体例子 ( 方面l o g g i n g ) 。 方碗毫 p d 如t m t a m c e d e m m 咄0 d p a m m p r e c e 血n c e w a n 血嵋 e m r l o 蜘,l i g p o 置眦1 吐c 传a t c :c 盐( l i n 。c f e a 把( b 越e i 附) ) p o h 仲阻呷d 吐e :c a l l ( b a s e i t 曲一呷d 出+ ( b a s e i t e 竹嘞 a d _ l r i c e a 髓fc ”砒e 叩d a 协 五。l ds 曲培1 0 窖f 丑e n a m e m e t h o d h c t o l 0 9 f 丑e p 吖e 时 c s t l 钯m 嘣曲d sb e p 阳c e 如

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论