(计算机软件与理论专业论文)net平台aop框架应用研究.pdf_第1页
(计算机软件与理论专业论文)net平台aop框架应用研究.pdf_第2页
(计算机软件与理论专业论文)net平台aop框架应用研究.pdf_第3页
(计算机软件与理论专业论文)net平台aop框架应用研究.pdf_第4页
(计算机软件与理论专业论文)net平台aop框架应用研究.pdf_第5页
已阅读5页,还剩103页未读 继续免费阅读

(计算机软件与理论专业论文)net平台aop框架应用研究.pdf.pdf 免费下载

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

文档简介

n e t 平台a o p 框架应用研究 汁负:机软什与理论专、i k 研究生:隋国辉指导教师:唐宁九 面向对象技术很好地解决了软件系统中角色划分的问题。借助于面向对象的 分析、设计和实现技术,开发者可以将问题域的“名词”转换成软件系统中的对 象,从而很自然地完成从问题到软件的转换。然而传统的程序经常表现出一些不 能自然地适合单个程序模块或者几个紧密相关的程序模块的行为,如:日志记录、 对上下文敏感的错误处理、性能优化以及设计模式等等、我们将这种行为称为“横 切关注点( c r o s s c u t t i n g c o n c e m ) ”,因为它跨越了给定编程模型中的典型职责界限。 面向方面的编程( a o p ) 是一种新的编程技术,它弥补了面向对象的编程( o o p ) 在跨越模块行为上的不足,通过引进a s p e c t ( 方面) ,将影响多个类的行为封装到 一个可重用模块中,允许程序员对横切关注点进行模块化,使你可以用一种松散 耦合的方式来实现独立的关注点,然后组合这些实现来建立最终系统,从而消除 了o o p 引起的代码混乱和分散问题,增强了系统的可维护性和代码的重用性。, a o p 是o o p 的延续,是g o f 设计模式的延续,设计模式孜孜不倦追求的是 调用者和被调用者之间的解耦,a o p 可以说也是这种目标的一种实现。 本文首先就a o p 的产生以及它对o o p 的发展进行阐述,给出了a o p 的原理 及实现机制,然后参考j a 、,a 平台上a o p 的各种架构,借鉴几个a o p 的开源项 目,展示了在n e t 环境下实现a o p 的一些技术和思路,最后以a s p e c t s h a r p 实现 了一个轻量级的a o p 框架,并说明了使用它所带来的设计益处以及在我们在做企 业级应用开发时实施a o p 所遇到的问题。 关键词:a o p ;a s p e c t ;n e t 平台a o p 实现;设计模式;面向方面的编程 ij q ij 人学| i 5 1 ,| j 7 :f ;z i 仑史一n e tt - f ;+ a o pj | f f l 絮i , i l l t + j l 究 n e tp l a t f o r ma o pf r a m e a p p l i e dr e s e a r c h s u io u o h u i ( c o m p u t e rs o f t w a r e t h e o r y ) d i r e c t e db yt a n gn i n g j i u t h eo b i e c t o r i e n t e dt e c h n o l o g yh a ss o l v e di nw e l it h er o l ed i v i s i o np r o b l e mo ft h e s o f t w a r es y s t e m w i t ht h ea i do fi nt h e0 b j e c t ,o r i e n t e da n a l y s i s d e s i g na n dr e a l i z a t i o n t e c h n o l o g y , t h ed e v e l o p e rm a yt r a n s f o r mt h e ”n o u n ”o ft h eq u e s t i o nt e r r i t o r y i nt h e s o f t w a r es y s t e mi n t ot h eo b j e c t t h u sv e r yn a t u r a lc o m p l e t e sf r o mt h eq u e s t i o nt ot h e s o f t w a r et r a n s f o r m a t i o n h o w e v e r , t h et r a d i t i o n a lp r o c e d u r ed i s p l a y ss o m en o tt ob e a b l ef r e q u e n t l yt os u i tt h es i n g l ep r o g r a mm o d u l eo rs e v e r a lc l o s ec o r r e l a t i o n sp r o g r a m m o d u l eb e h a v i o rn a t u r a l l y , l i k et h el o g g i n g ,t h ec o n t e x ts e n s i t i v ee r r o rp r o c e s s i n g ,t h e p e r f o r m a n c eo p t i m i z a t i o na sw e l la st h ed e s i g np a t t e r na n ds o0 i i w ec a l lt h i sk i n do f b e h a v i o r ”t r a n s v e r s ec u t t i n ga t t e n t i o nf c r o s s c u t t i n g c o n c e r n ) ”,b e c a u s ei ts u r m o u n t e d t h et y p i c a lr e s p o n s i b i l i t yb o u n d a r y a s s i g n e di nt h ep r o g r a m m i n gm o d e l a s p e c t o r i e n t e dp r o g r a m m i n g ( a o p ) i so n e k i n do fn e w p r o g r a m m i n g t e c h n o l o g y i tm a k e su pt h ed e f i c i e n c yo ft h eo b j e c t o r i e n t e dp r o g r a m m i n g ( o o p ) i n t h em o d u l eb e h a v i o r t h r o u 曲i n t r o d u c e da s p e c t ,i ts e a l sb e h a v i o r si nt h er e u s a b l e m o d u l e ,w h i c ha f f e c tm a n yk i n dc l a s s e s ,a l l o w st h ep r o g r a m m e rt oc a r r yo nt h e m o d u l a t i o nt ot h ec r o s s c u t t i n gc o n c e r n s ,e n a b l eu st ob ep o s s i b l et ou s eo n ek i n do f l o o s ec o u p l i n gw a yt or e a l i z et h ei n d e p e n d e n tc o n c e r n t h e nw ec a nc o m b i n et h e s e i m p l e m e n t a t i o n st oe s t a b l i s h eo u rf i n a l l ys y s t e m ,t h e r e b ye l i m i n a t i n gt h ec h a o t i ca n d ;h ed i s p e r s i b l ec o d ew h i c h0 0 pc a u s e d ,s t r e n g t h e n i n gt h es y s t e mm a i n t a i n a b i l i t ya n d :h ec o d er e u s a b i l i t y a o pi so o pc o n t i n u i n g ,i sg o fd e s i g np a t t e r nc o n t i n u i n g ,t h ed e s i g np a t t e r n ) u r s u e si sd i l i g e n t l yt h et r a n s f e ra n db yt h et r a n s f e rb e t w e e nd e c o u p l i n g ,a o pm a ys a y d s oi so n ek i n do fr e a l i z a t i o no ft h i sk i n do fg o a l t h i sa r t i c l ef i r s ta sw e l ia si tc a r r i e so nt h ee l a b o r a t i o no nt h ea o p p r o d u c t i o nt o h eo o pd e v e l o p m e n t i n t r o d u c e dt h ea o pp r i n c i p i ea n dt h er e a l i z a t i o nm e c h a n i s m h e nr e f e r sa o pf r a m e w o r k si nt h ej a v ap l a t f o r m p r o f i t sf r o ms e v e r a io p e nt h es o u r c e , r o j e c t so fa o pd e m o n s t r a t e ds o m et e c h n o l o g i e sa n di d e a st or e a l i z ea o p u n d e rt h e 1 e t e n v i r o n m e n t ,f i n a l l yr e a l i z e dal i g h t w e i g h ta o pf r a m eb ya s p e c t s h a r p ,a n d x p l a i n e du s e st h ed e s i g np r o f i ta sw e l la si na p p l i e st h eq u e s t i o nw h i c hi na o p s h o u l d a ya t t e n t i o n k e yw o r d s :a o p ;a s p e c t ;r e a l i z a t i o na o pu n d e rt h e n e te n v i r o n m e n t ;d e s i g n a t t e r n s ;a s p e c t o r i e n t e dp r o g r a m m i n g i7 qj l f 人一7 碰! f 学f - 论殳一n e t 甲台a o p 机架城j 1 i f 究 1 a o p ( 面向a s p e c t 的编程) 的发展背景 1 1 软件编程方法学的发展 软件编程方法学的发展在计算机科学发展的早期阶段? 开发人员利用直接的 机器编码方式来编写程序。然而大量的时间被花费在考虑机器指令集,而不是问 题本身。渐渐地,对底层机器指令集进行某些抽象的高级语言开始出现。然后出 现了结构化语言,采用分解的方式将一个软件系统划分为相对较小的、易于分析、 理解的模块,如果这些模块仍难以分析、理解,则迭代地将其分解为更小的模块, 直到这些模块可以容易的分析、理解、设计与编码。通过对这些模块进行分析、 设计,然后使用相应的编程语言实现这些模块,再以编程语言所定义的方式将这 些模块组装起来,形成最终的软件系统。 但随着问题复杂化的增加,我们需要有更好的技术来帮助人们解决问题。当 前,我们可利用面向对象的编程( o o e ) 技术,将系统看成一组协同对象,利用类来 隐藏接口内部的实现细节,“多态”为相关的类提供了一组公共的行为和接口,允 许具体化的构件无需访问基类的实现就可以改变一个特定的行为。 编程方法学与编程语言定义了我们与机器之间的通信方式。每一种新的方法 学都提供了些新的方法来分解问题,例如依赖机器的代码、独立于机器的代码、 过程、类等等。每一种新的方法学都提供了一种更为自然的方式来将系统需求映 射为编程结构,这些编程方法学的不断发展可以让我们创建复杂度更高的系统。 反之亦然,即我们允许复杂度越来越高的系统存在,因为新的技术可以帮助我们 来处理这种复杂性。 现在,大多数软件项目都选择o o p 的编程方式。确实,o o p 已经表明了它 处理一般行为的能力,它很好地解决了软件系统中角色划分的问题。借助于面向 对象的分析、设计和实现技术,开发者可以将问题领域的“名词”转换成软件系 统中的对象,从而很自然地完成从问题到软件的转换。 但是,问题领域的某些需求却偏偏不是用这样的“名词”来描述的。我们常 常会遇到这样的问题:需要对系统中的某些方法进行日志记录,这需要记录方法 散布在几十个类中。面对这种需求,最直接的办法就是创建一个基类( 或接口) , 啁川大学碗10 值论文n e t 甲台a o p 水架脚川研究 将j 盘的功能放在其巾,并让所有需要日志功能的类继承这个基类( 或接口) 。,如 果这个需求足后期提出的,需要修改的地方就会分散在几十个文 ! = ( 热1 果是c + + 这个数量还可能加倍) 中。这样大的修改量,无疑会增加出错的几率,并且加大 系统维护的难度。 人们认识到,传统的程序经常表现出一些不能自然地适合单个程序模块或者 几个紧密相关的程序模块的行为,例如日志记录、对上下文敏感的错误处理、性 能优化以及设计模式等等、我们将这种行为称为“横切关注点( c r o s s c u t t i n g c o n c e r n ) ”,因为它跨越了给定编程模型中的典型职责界限。如果使用过横切关注 点代码,您就会知道缺乏模块性所带来的问题。因为横切行为的实现是分散的, 开发人员发现这种行为难以作逻辑思维、实现和更改。 因此,面向方面的编程( a s p e c to r i e n t e dp r o g r a m m i n g ,a o p ) 应运而生。a o p 为开发者提供了一种描述横切关注点的机制,并能够自动将横切关注点织人到面 向对象的软件系统中,从而实现了横切关注点的模块化通过戈f j 分a s p e c t 代码, 横切关注点变得容易处理。开发者可以在编译时更改、插人或除去系统的a s p e c t , 甚至重用系统的a s p e c t 。 更重要的是,a o p 可能对软件开发的过程造成根本性的影响。我们可以想象 这样一种情况:o o p 只用于表示对象之间的泛化一一特化( g e n e r a l i z a t i o n s p e c i a l i z a t i o n ) 关系( 通过继承来表现) ,而对于o o p 不能很好地处理横越多个( 经 常是不相关的) 模块的行为则完全用a o p 来表现。这样,很多给对象之间横向关 联增加灵活性的设计模式( 例如d e c o r a t o r 、r o l eo b j e c t 等) 将不再必要。 一种编程思想是否真正优秀,只有从实现语言上才能看到。施乐公司帕洛阿 尔托研究中心( x e r o xp a r c ) 开发了第一个a o p 的开发环境a s p e c ( h t t p : w w w a s p e e t j o r g ) ,这个工具提供了一整套的语法,能够清楚地描述横切关注点, 并将其“织人”到j a v a 源代码中。织入后的代码仍是标准j a v a 代码,因此a s p e c t j 不会影响j a v a 的移植能力。此外,a s p e e t j 提供了一个独立的i d e ,并且能够嵌入 到j b u i l d e r 、f o r t e 等j a v a 开发环境之中,无缝地提供a o p 的能力。 但是,现在的a o p 还处于相当不完善的阶段:它只能应用于很少的几种语言 环境下,并且必须掌握源代码才能进行织入,但以r u p 之父i v a rj a c o b s o n 为代表 的科学家们仍对a o p 推崇备至:他认为a o p 将最终改变整个软件开发的方式。 珥川学碗卜学似论文一n e tj f 台a o p 骶架心川 l :i f 究 它很町能会是编程方法学发展的一个。珏程碑,并更完美地实现“j _ ! l 例驱动”的 升发思想。 1 2 分离关注点( c o n c e r n ) 一个关注点( c o n c e r n ) 就是一个特定的目的,一块我们感兴趣的区域。因此, 从某种意义上讲我们可以将系统看作由一组c o n c e r n 组成。从技术上来讲,一个 典型的软件系统是由许多个核心级c o n c e r n 和系统级c o n c e r n 组成。 例如,一张信用卡处理系统包括处理支付的“核心c o n c e r n ”,以及处理日志、 交易一致性、鉴别用户身份、安全、性能等“系统级c o n c e r n ”,而后面这些c o n c e r n 我们叫它横切关注点( c r o s s c u t t i n gc o n c e r n s ) 会在多个模块中出现。如 果使用目前的编程方法学,那么这些横跨多个模快的横切c o n c e r n 将使系统很难 设计、理解、实现以及发展。 a o p 能够比传统的o o p 方法更好地分离系统关注点,从而提供模块化的横 切关注点。我们将一个复杂的软件系统看作是由多个c o n c e r n 组合在一起而实现 的,一个典型的系统可能由业务逻辑、性能、持久数据、日志、调试、鉴别用户 身份、安全、多线程间的安全、检查错误等多种c o n c e r n 组成。同样地,在开发 过程中我们也将遇到许多c o n c e r n ,例如可理解性、可维护性、可跟踪性、可发展 性等等。图1 1 描述了由不同模块实现的一组c o n c e r n 。 图1 1 :由模块实现一组c o n c e r n 图1 2 将一组需求看作是一束通过棱镜传输的光线。我们将一个需求光束通 i n lj ij 夫学坝卜学f _ 论文_ n e t 甲台a o p 水架啦川研究 过一个l i 以标识c o n c e r n 的棱镜进行传输,棱镜将把每一个c o n c e r nix 分圯、这 个视图也町以扩展到开发过稚中的c o n c e r n , 图1 2 :棱镜模拟下的c o n c e r n 分解 1 3 系统中的横切c o n c e r n 开发人员将根据多个需求来创建系统,如前所述,我们可以将这些需求划分 为核心模块级需求和系统级需求。许多系统级的需求相互之问以及与核心级需求 一般是正交关系( 即互相独立) ,而且系统级需求一般横切多个核心模块。一个典 型的企业应用一般由鉴别用户身份( i d e n t i f i c a t i o n ) 、日志( l o g g i n g ) 、资源池 ( s o u r c e p 0 0 1 ) 、管理( a d m i n i s t r a t i o n ) 、性能( p e r f o r m a n c e ) 、存储管理( s t o r a g e m a n a g e m e n t ) 等多个横切c o n c e m 组成。每个c o n c e r n 都要横切多个子系统,例如 存储管理c o n c e r n 将影响每个有状态的业务对象。 p u b l i cc l a s ss o m e b u s i n e s s c l a s se x t e n d so t h e f b u s i n e s s c l a s s 核心数据成员 其它数据成员:日志流,保证数据完整性的标志位等 ,厘载基类的方法,c o r ed a t am e m b c i s p u b l i cv o i dp e r f o r m s o m e o p e r a t i o n ( o p e m t i o n l n f o r m a t i o ni n f o ) 安全性验证 检查传人数据是否满足协议 镇定对象以食品店当其他线程访问时的数据完整性 , 佥查缓存中是否为最新信息 , e 录操作开始执行时间 执行核心操作 “记录操作完成时间 4 i w 川大拳碱f 学位论文 一n e t 平台a o p 水架心j l l 研究 给对象解锁 】 ,一些娄似操作 i u b l i cv o i ds a v e ( p e r s i t a n c e s i o r a g cp s ) 】 p u b l i cv o i d o a d ( p e r s i t a n c e s t o r a g ep s ) 【 j 在上面的代码中,我们注意到三个问题: 1 首先,其它数据成员不是这个类的核心关注点; 2 第二p e 晌眦s o m e o p e r a t i o n ( ) 的实现做了许多核心操作之外的事,它要处 理日志、验证、线程安全、协议验证和缓存管理等一些外围操作,而且 这些外围操作同样也会应用于其他类; 3 第三,s a v e ( ) 和l o a d ( ) 执行的持久化操作是否构成这个类的核心是不 清楚的。 1 4 横切c o n c e r n 引起的问题 虽然横切关注点会跨越多个模块,但当前的技术倾向于使用一维的方法学来 处理这种需求,把对应需求的实现强行限制在一维的空间里,这个一维空问就是 核心模块级实现,其他需求的实现被嵌入在这个占统治地位的空问。换句话说, 需求空间是一个n 维空间,而实现空问是一维空问,这种不匹配导致了糟糕的需 求到实现的映射。 1 4 1 问题的表现 采用目前的方法学来实现横切c o n c e r n 已表明存在许多问题,这些问题的表 现可以分为两类: 1 代码交织( c o d e t a n g l i n g ) : 软件系统中的模块可能要同时兼顾几个方面的需要。举例来说,开发者经常 要同时考虑业务逻辑、性能、同步、日志和安全等问题,兼顾各方面的需要导致 相应关注点的实现元素同时出现,引起代码混乱和代码交织。 2 代码分散( c o d es c a t t e r i n g ) : 按照定义,因为横切c o n c e r n 跨越多个模快,所以与这些横切c o n c e r n 相关 的实现也跨越所有这些模块。例如,在一个用到数据库韵系统中,性能c o n c e r n 叮能影响所有访问数船库的模块这导致代码分激拍;符处。 1 4 _ 2 问题的影响 总j f i 言之,代码交织和代码分散影响到软件设计与开发的许多方而,主耍表 现在: i 可读性差: 同时实现几个关注点把开发人员的注意移到外围关注点,导致生广:效率 降低。 2 低产出: 同时实现多个c o n c e r n 使得开发人员将注意力从主要关心的c o n c e r n 转 移到外围的c o n c e r n ,造成了生产力的下降。 3 代码重用性差: 由于一个模块要实现多个c o n c e r n ,对类似功能有需求的其它系统不能很 方便地重用该模块,进一步造成了生产力的下降。 4 代码质量差: 交织在一起的代码含有隐含的问题。而且,一次想要实现多个c o n c e r n , 可能会造成某些c o n c e m 没有引起足够的重视。 5 难以扩展: 狭窄的视角和有限的资源总是产生在仅注意当前关注点的设计,新的需 求导致重新实现,由于实现不是模块化的,就是说实现牵涉到多个模块, 为了新需求修改子系统可能会带来数据的不一致,而且还需相当规模的 测试来保证这些修改不会带来b u g 。 1 4 3 目前提出的解决方法 由于许多系统都有横切c o n c e r n ,因而也出现了一些技术来使得系统的实现模 块化。这些技术包括m i x i nc l a s s e s 、设计模式、与特定应用领域相关的解决方法。 采用m i x i nc l a s s 技术,可以推迟一个c o n c e r n 的实现。基本类包含一个m i x i n 类实例,并允许系统的其它部分来设置该实例。例如在信用卡处理系统中,实现 业务逻辑的类包含一个l o g g e rm i x i n 。系统的另一部分可以设置该l o g g e r 来获取 相应的l o g g i n g 类型。例如该l o g g e r 可以被设置为采用文件系统或消息中间件来实 6 川夫宁确f 学位沧盘一n e tf 卉a o i 秘颦啦川研究 现。_ 1 ,i :这种方式下,虽然推迟厂l o g g i n g ,但确:所有的i 已录ll 志点组合类鄢小包含 激活l o g g i n g 操作的代码,也不控制i tj 基记录信息。 与设计模式巾的v i s i t o r 模式和模板方法模式类似,行为设计模式可以推迟实 现。然而与m i x i n 巾的情况稍i 同,对操作的控制,即激活v i s i t i n g 逻辑或激活模 板方法都留在了主类中。 与特定应用领域相关的解决方法一一例如框架和应用服务器一一可以使开发 人员以模块化方式解决一些横切c o n c e r n 。例如,企业j a v a b e a n s ( e j b 架构解决了 诸如安全、管理、性能、由容器管理的持久性等横切c o n c e r n 。b e a n 开发人员只 关心业务逻辑,而部署开发人员只关心部署事宜,例如将b e a n 数据映射为数据库, b e a n 开发人员无需关心数据的存储事宜。这里,用x m l 映射描述符来实现数据 持久性横切c o n c e r n 。 与特定应用领域相关的解决方法为解决特定的问题而提供了一种特定的解决 方案。该方法的一个缺点是开发人员面对每一种解决方案都需要学习新的技术。 而且,由于这些解决方案是应用于特定领域,因而并没有直接解决横切c o n c e r n 引起的问题,而是要依靠特殊的解决方法。 1 5 系统架构师面临的难题 好的系统架构师会考虑到当前及未来的需求,以避免系统的实现需要不断打 补丁。但这里有一个问题,即对未来的预测是十分困难的。一方面,如果没有考 虑未来的横切需求,那么就可能需要在今后修改或重新实现系统的大部分。而另 一方面,太过于关注不一定需要的需求会导致过分设计的、难以理解的、臃肿的 系统。因而系统架构师面临这样一个两难的困境:怎么设计算不过分设计? 应该 宁可设计不足还是宁可过分设计? 例如,系统架构中是否应包含一个最初阶段不需要的日志系统? 如果答案是 肯定的,那么在哪里记录日志? 记录什么样的扫志信息? 类似的难题在于优化系 统性能相关的需求中也会出现,因为我们无法预先知道系统的瓶颈所在。通常的 方法是先建立系统,构造出其部分原型,然后采用优化改造来提高系统的性能。 这种方法潜在地需要改变由系统原型所指示的系统的多个部分,而且随着时问的 推移,使用方式的改变又将引起新的系统瓶颈。而考虑可重用的库,对系统架构 i j t l j q 夫宁碗f f z f 知沦文- n i :t r 青a o i ,玳架晦川研究 师而青则址蜓加雉的任务,i h 为他会发现很难考虑町承用席的所以腑川环境。、 总之 殳计l i f | j 很难顺及到系统可能需要处理的所有关注点。即使预先知通j 系统需求,实现系统所需的细节也不可能很完整,因而系统架构两临着设计不足, 过分设计的两难境。、 2a o p 综述 我们知道,j 2 e e 应用系统只有部署在j 2 e e 容器中才能运行,那么为什么划 分为j 2 e e 容器和j 2 e e 应用系统? 实际上j 2 e e 容器分离了一般应用系统的一些 通用功能,例如事务机制、安全机制以及对象池或线程池等性能优化机制。这些 功能机制是每个应用系统几乎都需要的,因此可以从具体应用系统中分离出来, 形成一个通用的框架平台,而且,这些功能机制的设计开发有一定难度,同时运 行的稳定性和快速性都非常重要,必须经过长时间调试和运行经验积累而成,因 此,形成了专门的j 2 e e 容器服务器产品,如t o m c a t 、j b o s s 、w e b s p h e r e 、w e b l o g i c 等。 从j 2 e e 系统划分为j 2 e e 容器和j 2 e e 应用系统两个方面,我们已经看到一 种分散关注的思路( s e p a r a t i o no fc o n c e r n so 2 1 一个共享数据访问的例子 假设有在一个应用系统中,有一个共享的数据对象必须被多个访问类并发同 时访问,为了完成上述并发访问同一资源的功能,需要引入锁( l o c k ) 的概念, 多个访问类同时访问一个共享数据对象时,每个访问类在访问这个数据对象时, 需要将数据对象上锁,访问完成后,再实行解锁,供其它并发线程访问,这是我 们处理并发访问资源的方式。 为了实现这个需求,先实现传统的编程,这里我们假定有一个写锁,对数据 对象实行写之前,首先对这个对象进行上写锁,写操作完毕后,必须释放写锁。 首先,我们需要一个锁,这个锁可以是数据对象中一个字段或其它,这里使 用d o u gl e a ( c o m p u t e rs c i e n c ed e p a r t m e n t ,s t a t eu n i v e r s i t yo fn e w y o r ka to s w e g o , o s w e g o ,) 的r e e n t r a n t w r i t e r p r e f e r e n c e r e a d w r i t e l o c k 作为我们的锁资源。 i m p o r te d u o s w e g o c s ,d 1 u t i l c o n c u t r e n t * ; i 型! ! 叁二! ! 型! ! ! 丝堕鉴二:竺! 芏鱼垒旦! 塑竺坐型塑兰一 p u b l i cc l a s sw o r k e re x t e n d st h r c a d d a t ad a t a ; r e e n t r a n t w r i t e r p r e f e r e n c e r e a d w r i t e l o c kr w l = n e wr e e n t r a n t w r i t e r p r e f e r e n c e r e a d w r i t e l o c k 0 ; p u b l i cb o o l e a nc r e a t e d a t a ( ) t 叫 r w l w r i t e l o c k o a c q u i r e ( ) ;j 二锁 对d a t a 实行写逻辑操作 1 c a t c h ( ) r e t u r nf a l s e ; f i n a l l y ( r w l w r i t e l o c k 0 r e l e a s e ( ) ;懈锁 ) r e t u r nt r u e ; ) p u b l i cb o o l e a nu p d a t e d a t a ( ) ( t r y r w l w r i t e l o c k 0 a c q u i r e 0 ;j 2 锁 网 d a t a 实行写逻辑操作 1 c a t c h ( ) ( r e t u r nf a l s e ;) f i n a l l y r w l w d t e l o c k o r e l e a s e ( ) ;| f 懈锬 l r e t u r nt r u e ; ) p u b l i cv o i dr u n ( ) ( 臌行c r e a t e d a t a 0 或u p d a t e d a t a ( ) l 假设可能存在另外一个访问类,也将对数据对象实现写操作,代码如下 i m p o r te d u o s w e g o c s d 1 u t i l c o n c u r r e n t + : p u b l i cc l a s sa n o t h e r w o r k e r e x t e n d st h r e a d d a t ad a t a ; r e e n t r a n t w r i t e r p r e f e r e n c e r e a d w d t e l o c kr w l = n e wr e e n t r a n t w r i t e r p r e f e r e n c e r e a d w r i t e l o c k 0 ; p u b l i cb o o l e a nu p d a t e d a t a ( ) ( y r w l w r i t e l o c k o a c q u i r e ( ) ;& 锁 x , d a t a 实行写逻辑操作 ) c a t c h ( ) ( r e t u r nf a l s e ;l f i n a l l y r w l w r i t e l o c k 0 r e l e a s e ( ) ;解锁 l r e t u r nt r u e ; 】 p u b l i cv o i dr u n ( ) f 9 i j q l tj 人- 产硕i 一7 吖l 沦史 n f 7 1 甲台a o p # l 絮啦川研究 泓miu p d a t e d a t a 0 以上足传统编程的实现,这种锁的实现方式是在每个具体类小实现,如下l 剥 图2 1 传统编程方式下共享访问同一数据对象 这种实现方式的主要缺点: 1 冗余:有很多重复的编码,如r w l w r i t e l o c k 0 a c q u i r e ( ) 等; 2 减少重用:重用被打折扣,具体访问类因为包含“锁”状态之类的相关 代码,只能被重用在相关有“锁”的场合,重用范围很窄。如:w o r k e r 的u p d a t e d a t a 0 方法的重用性几乎为零。 3 “数据对象写操作必须使用锁控制”这个设计目的不容易显现,如果更 换了一个新的程序员,他可能编写一段不使用锁机制就对这个数据对象 写操作的代码。 4 c 圾j a v a 只提供了单继承,如果将与锁相关的操作抽象为一个基类, 那么具体访问类只能继承这个父类,如果具体访问类还要继承其它父类, 将无法方便实现。 仔细研究这个应用的“锁”,它其实有下列特性: 1 “锁”功能不是具体访问类的首要或主要功能,访问类主要功能是访问 数据对象,例如读取数据或更改动作。 o lj qjr 1 人:碰l : 7 :f l i t j c n e i 旷台a o i ,_ f | i i 韶心川研究 2 “锁”行为其实是和具体访问类的主要功能,1 i 以独立、阢分j 1 束枘 3 “锁”功能) 实足这个系统的一个横向切i 7 i i 涉及许多类、诈多类的 法。如下图: 上锁解锁 图2 2 将锁看作是系统的横切关注点 因此,一个新的程序结构应该是关注系统的横向切面,例如这个应用的“锁” 功能,这个新的程序结构就是a s p e c t ( 方面) 在这个应用中,“锁”方面( a s p e c t ) 应该有以下职责: 提供一些必备的功能,对被访问对象实现加锁或解锁功能。以保证所有在修 改数据对象的操作之前能够调用l o c k ( ) 3 m 锁,在它使用完成后,调用u n l o c k ( ) 解锁。 2 2 面向方面编程( a s p e c t0 r i e n t e dp r o g r a m m i n g ) 一般情况下,对象是由一行行的代码“粘合”在一起的。创建这个对象或创 建那个对象,为那个对象( 其值为这个对象) 设置属性,其问还点缀着一些用户 数据,将一切搅拌在一起。将多个组件以这种方式连接起来会出现这样的问题: 要实现不同的方法时,需要花费大景时间编写同样的代码。这些代码行中往往会 有以下操作:将这个方法的活动记录e l 志到一个文件中以备调试,运行安全性检 查,启动一个事务,打开一个数据库连接,捕捉c + + 异常或者w i n 3 2 结构化异 常以转换为c o m 异常,还要验证参数。而且,还要切记在方法执行完之后销毁 叫川人学硕卜 f 扯论文n e 3 r 台a o p 机能j 缸川_ f i j f 究 力法, :始时的设霄。, 这利,m 复代码经常现的原因托于,丌发人员被训练为根据软件新闻稿- i 的 名词来设计系统。如果设计的是银行系统,a c c o u n t 类和c u s t o m e r 类必不可少 它们都将自己独特的详细信息收集到一处,但是它们的每个方法也都需要进行| 1 志、安全检查、事务管理等操作。区别在于,日志等操作是一些与特定应用无关 的系统方面。人人都需要它们,人人都编写这些代码。人人都讨厌编写重复的代 码,但并不是人人都需要编写这些代码。例如,c o m + 和n e t 程序员可以进行 所谓的属性化编程,也称声明性编程。这种技术允许程序员用属性来修饰类型或 者方法,声明需要运行时提供某种服务。再如c o m + 提供的一些服务,包括基 于角色的安全性、实时激活、分布式事务管理和封送处理。在调用方法时,运行 时会放置一组在客户端和服务器之问获得的对象( 对于c o m + 程序员而言称为 “侦听器”,对于n e t 程序员而言称为“消息接收”) ,为每个方法提供服务,无 须组件开发人员编写任何代码。这是面向方面编程( a o p ) 的雏形。 面向方面编程( a o p ) 是一种区别于传统编程技术的新的编程思想,最初由 g r e g o rk i c z a l e s 在施乐的p a l oa l t o 研究中心领导的一个研究小组于19 9 7 年提出 ( 参见h t t p :w w w p a r c x e r o x c o m c s l g r o u p s l s d a p u b l i c a t i o n s p a p e r s l k i c z a l e s e c o o p 9 7 f o r - w e b p d f 最简单的形式) 。它使开发人员可以更好地将本不该彼此纠 缠在一起的任务( 例如数学运算和异常处理) 分离开来。之后,a o p 经由几个不 同小组的努力在各自的方向上得到了发展,但是,到目前为止,a o p 仍处于发展 阶段。 面向对象设计最根本的魅力在于,它能够将真实世界领域中的实体及各自的 行为建模为抽象的对象。以面向对象方式设计的系统产生了很多有效的业务对象, 比如p e r s o n 、a c c o u n t 、o r d e r 以及e v e n t 。面向对象设计的缺点在于,这样的业 务对象会因为混合的属性和与对象最初意图不一致的操作而变得混乱。 通过使设计者运用动态和静态横切,用一种非强制性的整洁和模块化的方法 来添加对象行为,面向方面编程有效地解决了这一问题。 面向对象技术很好地解决了软件系统中角色划分的问题。借助于面向对象的 分析、设计和实现技术,开发者可以将问题领域的“名词”转换成软件系统中的 对象,从而很自然地完成从问题到软件的转换。然而,问题领域的某些需求却不 能川这样的“鼎两来狲述;, 山f f l f ( a s p e c t ) 类似于编程i l i 。;【| j 的类。方1 f j f 定义切人点和迎知( a d v i c e ) 并由诸如a s p e c t j 这样的方面编译器来编译,以便将横切( 包括动态的和静态的) 织人( i n t e r w e a v e ) 现有的对象中。 方i i i i 的重新组合:在这一步里,方面集成器通过创建一个模块单元( 方面) 来指定重组的规则,重组过程一一也q 织入( w e a v i n g ) 或结合( i n t e g r a t i n g ) 一 一则使用这些信息来构建最终系统。拿信用卡的那个例子来说你可以指定( 用某 种a o p 的实现所提供的语言) 每个操作的开始和结束需要记录,并且每个操作在 涉及到业务逻辑之前必须通过验证。 在a o p 的领域中,c o m + 侦听器就是通过元数据与组件相关联的一些方面 ( a s p e c t ) ,运行时使用元数据来构造这组方面( a s p e c t ) ,通常是在创建对象时进 行的,当客户端调用方法时,那些特殊的方面依次获得了处理调用、执行其服务 的机会,最后再调用对象的方法。返程时,每个方面又有机会进行展开。这样, 就可以将每个组件的每个方法中都要编写的相同代码行提取出来并放在各个方面 中,让运行时来处置它们。这组方面共同为组件方法的执行提供了上下文。上下 文在环境中提供了方法的实现,其中的操作具有特殊的意义。 图2 3 安全地存在于上下文中的对象 图2 3 显示了一个安全地存在于上下文中的对象,该上下文提供了错误传播、 事务管理和同步。与w i n 3 2 控制台应用程序中的程序能够假定在上下文中存在控 制台,而且调用p r i n t f 的结果将显示在控制台上一样,a o p 对象也可以假设事务 已经建立,且调用数据库将是该事务的一部分

温馨提示

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

评论

0/150

提交评论