好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

面向方面的程序设计.ppt

56页
  • 卖家[上传人]:人***
  • 文档编号:580034016
  • 上传时间:2024-08-28
  • 文档格式:PPT
  • 文档大小:1.53MB
  • / 56 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 1面向方面的程序设计面向方面的程序设计--兼谈计算科学的创新兼谈计算科学的创新 2面向方面的程序设计面向方面的程序设计nAspect oriented programming((AOP)) 3n Xerox(施乐施乐)公司公司PARC研究中心在研究中心在19971997年的欧洲年的欧洲面向对象编程大会(面向对象编程大会(ECOOP97ECOOP97)上首次提出)上首次提出Aspect-Aspect-oriented programmingoriented programming((AOPAOP))n 自自20022002年起,每年分别在欧洲和美国轮流召开专门年起,每年分别在欧洲和美国轮流召开专门的面向方面软件开发(的面向方面软件开发(AOSDAOSD)国际会议与会者包括)国际会议与会者包括美国、加拿大、荷兰、英国、法国、丹麦、日本、以美国、加拿大、荷兰、英国、法国、丹麦、日本、以色列等我国一些学校也对色列等我国一些学校也对AOPAOP给以关注并开展了一些给以关注并开展了一些研究工作研究工作n 从从AOP概念提出经过了近十年的时间,这种技术概念提出经过了近十年的时间,这种技术现在已经开始被工业界采用。

      现在已经开始被工业界采用 4AOPAOP产生的背景产生的背景 计算机软件设计的一个重要原则,就是要清计算机软件设计的一个重要原则,就是要清晰晰分离各种关注点分离各种关注点((separation of concerns),然),然后分而治之,各个击破,最后形成统一的解决方案后分而治之,各个击破,最后形成统一的解决方案业务逻辑存储日志安全需求关注点标识 5 关注点:是指一个特定的目标、概念或者兴趣域关注点:是指一个特定的目标、概念或者兴趣域n从技术的角度,软件系统分别包括从技术的角度,软件系统分别包括核心级和系统级核心级和系统级的关的关注点n核心级关注点是系统要完成的核心级关注点是系统要完成的业务功能业务功能;;n系统级关注点是完成核心级关注点所必须的系统级关注点是完成核心级关注点所必须的配套设施配套设施,这,这些配套设施通常被认为是整个系统的系统特性,或者是业些配套设施通常被认为是整个系统的系统特性,或者是业务功能的功能约束务功能的功能约束例如:信用卡处理系统例如:信用卡处理系统 核心关注点是核心关注点是处理付款处理付款;; 系统级关注点包括系统级关注点包括日志、事务、认证、安全和性日志、事务、认证、安全和性能能等等。

      等等 6n软件系统中,某个行为,例如操作日志的软件系统中,某个行为,例如操作日志的记录,存在于软件的各个部分中,这个行记录,存在于软件的各个部分中,这个行为可以看作是横向存在于软件之中,他所为可以看作是横向存在于软件之中,他所关注的是软件的各个部分的一些共有的行关注的是软件的各个部分的一些共有的行为n在很多情况下,这种行为不属于业务逻辑在很多情况下,这种行为不属于业务逻辑的一部分这种操作并不是业务逻辑调用的一部分这种操作并不是业务逻辑调用的必须部分,但是,我们却往往不得在代的必须部分,但是,我们却往往不得在代码中显式进行调用,并承担由此带来的后码中显式进行调用,并承担由此带来的后果 7n在目前的技术框架下,通常在目前的技术框架下,通常系统级关注点在系统级关注点在逻辑上逻辑上相互之间相互之间彼此正交(相互独立),彼此正交(相互独立),同时在同时在实现上实现上趋向于趋向于和若干核心模和若干核心模块交织块交织 例如:信用卡管理系统的每个核心业务关注点都和安全、例如:信用卡管理系统的每个核心业务关注点都和安全、日志等系统关注点相联系日志等系统关注点相联系 8n核心级关注点核心级关注点(业务)多数情况下可以(业务)多数情况下可以被很好地分解,并被很好地分解,并通过编程语言模块化通过编程语言模块化实现(子模块或软构件)实现(子模块或软构件)。

      n系统级关注点系统级关注点(横向关注点),使用当(横向关注点),使用当前的程序设计方法导致前的程序设计方法导致在许多构件中要在许多构件中要重复包含(扩散)这些代码重复包含(扩散)这些代码 9横切示例(crosscutting)nAuthentication 权限权限nCaching 缓存缓存nContext passing 内容传递内容传递nError handling 错误处理错误处理nLazy loading 懒加载懒加载nDebugging 调试调试nLogging、、tracing、、profiling and monitoring 日志、跟踪、日志、跟踪、优化、校准优化、校准nPerformance optimization 性能优化性能优化nPersistence 持久化持久化nResource pooling 资源池资源池nSynchronization 同步同步nTransactions 事务事务 10现有软件技术的不足 目前的实现技术只提供了一维方法学实现系统的关注点,该单一维度一般是核心需求和关注点的模块化实现,其他类型的需求也被迫和该主导维度一致。

      安安全全事事务务业业务务业务主导维业务主导维 问题空间是问题空间是n n维的,而解空间是一维的这种失配必然导致需求和维的,而解空间是一维的这种失配必然导致需求和实现之间的失配实现之间的失配 11源程序就会变成一些为不同关注目的而编制的源程序就会变成一些为不同关注目的而编制的指令的缠结混乱物指令的缠结混乱物缠结现象缠结现象是现有软件系统中许多不必要的是现有软件系统中许多不必要的复杂性的核心复杂性的核心它增加了功能构件之间的依赖性,它增加了功能构件之间的依赖性,分散了构件原来假定要做的事情,分散了构件原来假定要做的事情,提供了许多程序设计出错的机会,提供了许多程序设计出错的机会,使得一些功能构件难以复用,使得一些功能构件难以复用,源代码难以开发、理解和发展源代码难以开发、理解和发展 12v某一应用的领域专家,不太可能对分布、认证、某一应用的领域专家,不太可能对分布、认证、访问控制、同步、加密、冗余等问题的复杂实访问控制、同步、加密、冗余等问题的复杂实现机制很熟悉,所以就不能保证他们在程序中现机制很熟悉,所以就不能保证他们在程序中进行正确的调用进行正确的调用v开发人员很难正确预见到未来对程序的新需求开发人员很难正确预见到未来对程序的新需求。

      13方面(Aspect)n设计上讲,是横切系统的一些软件系统级关注点设计上讲,是横切系统的一些软件系统级关注点n实现上讲,它支持将横切系统的关注点封装在单独的模块单实现上讲,它支持将横切系统的关注点封装在单独的模块单位中,它是位中,它是AOP将横切关注点局部化和模块化的实现机制将横切关注点局部化和模块化的实现机制n常见的常见的“方面方面”::异常和出错处理异常和出错处理同步和并发控制同步和并发控制 内存访问模式内存访问模式日志、安全日志、安全事务、性能事务、性能 14 AOP AOP核心内容就是所谓的核心内容就是所谓的“横切关注点横切关注点”,即,即“方面方面”,,AspectAspect是是AOPAOP提供的一种程序设计单元提供的一种程序设计单元而在而在OOP中中,这些一般关注点的实现单元叫作类这些一般关注点的实现单元叫作类 AOPAOP的目标,是要将这些横切关注点与业务逻的目标,是要将这些横切关注点与业务逻辑代码相分离,从而得到更好的软件结构、性能以辑代码相分离,从而得到更好的软件结构、性能以及稳定性等方面的好处及稳定性等方面的好处 AOPAOP被认为是后面向对象时代的一种新的重要被认为是后面向对象时代的一种新的重要的程序设计技术。

      的程序设计技术 15AOP的基本思想n通过分别描述系统的不同关注点及其关系,以一种松耦合的方式通过分别描述系统的不同关注点及其关系,以一种松耦合的方式实现单个关注点,然后依靠实现单个关注点,然后依靠AOP环境的支撑机制,将这些关注环境的支撑机制,将这些关注点组织或编排成最终的可运行程序点组织或编排成最终的可运行程序 普通关注点可以使用传统的结构化方法和面向对象方法体统的机普通关注点可以使用传统的结构化方法和面向对象方法体统的机制 系统关注点使用系统关注点使用Aspect机制 16AOP程序设计的一般步骤n一、一、对需求规约进行对需求规约进行Aspect分解n确定哪些功能是组件必须实现的,即提取出确定哪些功能是组件必须实现的,即提取出核心核心关注点n哪些功能可以以哪些功能可以以aspect的形式动态加入到系统组的形式动态加入到系统组件中去,即提取出系统级的件中去,即提取出系统级的横切关注点横切关注点 17AOP程序设计的一般步骤n二、二、对标识出的对标识出的Aspect分别通过程序机制实现分别通过程序机制实现 构造系统的组件构造系统的组件 利用利用组件语言组件语言实现系统的组件。

      对于实现系统的组件对于OOP语言,这些组件可以是语言,这些组件可以是类;对于过程化程序设计语言,这些组件可以是各种函数和类;对于过程化程序设计语言,这些组件可以是各种函数和API 构造系统的构造系统的aspect 利用一种或多种利用一种或多种aspect语言语言实现实现aspect  aspect语言必须提供声明语言必须提供声明aspect的机制aspect如何声明如何声明连接点如何定义连接点如何定义aspect代码如何定义代码如何定义aspect的参数化程度等的参数化程度等 18n三、三、用用aspect编织器将所有的单元编排重组在一起,形成最终的可运行编织器将所有的单元编排重组在一起,形成最终的可运行系统 为组件语言和为组件语言和aspect语言构造相应的语法树;依据语言构造相应的语法树;依据aspect中的连接点定中的连接点定义对语法树进行联结;在连接的语法树上生成中间文件或目标代码义对语法树进行联结;在连接的语法树上生成中间文件或目标代码 aspect语言必须提供将语言必须提供将aspect代码和基础代码组合编排(代码和基础代码组合编排(weaving))在一起的机制。

      在一起的机制定义编排语言和规则定义编排语言和规则解决解决aspect之间潜在的冲突之间潜在的冲突为组装和执行建立外部约束为组装和执行建立外部约束 aspect语言必须提供生成可运行系统的实现机制语言必须提供生成可运行系统的实现机制系统的组合是在编译时静态组装还是运行时动态进行系统的组合是在编译时静态组装还是运行时动态进行对程序单元分别进行编译的模块化编译机制对程序单元分别进行编译的模块化编译机制对组装结果的验证机制等对组装结果的验证机制等 19AOP的本质n 将横切关注点(如日志、权限验证、并发控制等非功能需将横切关注点(如日志、权限验证、并发控制等非功能需求)单独用求)单独用aspect实现,而业务功能用现有的软件技术实实现,而业务功能用现有的软件技术实现由AOP机制提供将这些分离的关注点编织为一个可执行机制提供将这些分离的关注点编织为一个可执行程序n提高代码的可理解性、可维护性、可复用性等提高代码的可理解性、可维护性、可复用性等横切关注点横切关注点 20AOP系统的软件开发过程业务逻辑存储日志安全需求关注点标识编织器Aspect分解Aspect重组 21AOP与OOP比较OOP是是AOP的技术基础,的技术基础,AOP是对是对OOP的继承和发的继承和发展。

      展n可扩展性:可扩展性: 指软件系统在需求更改时程序的易更改能力指软件系统在需求更改时程序的易更改能力 OOP主要通过提供继承和重载机制来提高软件的可主要通过提供继承和重载机制来提高软件的可扩展性 AOP通过扩展通过扩展Aspect或增加或增加Aspect,系统相关的,系统相关的各个部分都随之产生变化各个部分都随之产生变化 22n可重用性:可重用性: 指某个应用系统中的元素被应用到其他应用系统的能指某个应用系统中的元素被应用到其他应用系统的能力 OOP以类机制作为一种抽象的数据类型,提供了比过以类机制作为一种抽象的数据类型,提供了比过程化更好的重用性程化更好的重用性nOOP的重用性对非特定于系统的功能模块有很好的支持,的重用性对非特定于系统的功能模块有很好的支持,如堆栈的操作和窗口机制的实现如堆栈的操作和窗口机制的实现n对于不能封装成类的元素,如异常处理等,很难实现重对于不能封装成类的元素,如异常处理等,很难实现重用AOP使不能封装成类的元素的重用成为可能使不能封装成类的元素的重用成为可能 23n易理解性和易维护性易理解性和易维护性n代码缠结问题的存在,使代码缠结问题的存在,使OOP技术在易理解性和易维护技术在易理解性和易维护性方面都难有很大的提高。

      性方面都难有很大的提高n统计发现:统计发现:“如果一个他人写的程序有如果一个他人写的程序有37处需要改动,处需要改动,对于一个最优秀的软件开发人员,也大概只能找到对于一个最优秀的软件开发人员,也大概只能找到35个个”n对于对于AOP,对一个,对一个Aspect修改可以通过联结器影响到系修改可以通过联结器影响到系统相关的各个部分,从而大大提高系统的易维护性统相关的各个部分,从而大大提高系统的易维护性 24AOP特性nAspect的实现和传统开发方法中的实现和传统开发方法中模块的实现不同模块的实现不同 Aspect的开发彼此独立,是一种松耦合关系的开发彼此独立,是一种松耦合关系 主代码的开发者甚至可能没有意识到主代码的开发者甚至可能没有意识到aspect的存在只是在最后系统组装时,才将各只是在最后系统组装时,才将各aspect代码和主代码代码和主代码编排融合在一起编排融合在一起主代码和主代码和AspectAspect之间采用之间采用“隐式调用隐式调用”v某一应用的领域专家,不太可能对分布、认证、访问控制、同步、某一应用的领域专家,不太可能对分布、认证、访问控制、同步、加密、冗余等问题的复杂实现机制很熟悉,所以就不能保证他们在加密、冗余等问题的复杂实现机制很熟悉,所以就不能保证他们在程序中进行正确的调用。

      程序中进行正确的调用v开发人员很难正确预见到未来对程序的新需求开发人员很难正确预见到未来对程序的新需求 25AspectJnAspectJ是是Xerox PARC开发的基于开发的基于Java语言语言的的AOP扩展,它既是一种规约语言,也是一扩展,它既是一种规约语言,也是一种种AOP的实现语言的实现语言nAspectJ是一种支持是一种支持“面向面向Aspect”概念的语言概念的语言 26AspectJnAspectJ提供了支持提供了支持“面向面向Aspect”概念的如下语言结构及定概念的如下语言结构及定义:义:  Joinpoints:预定义好的程序的特定执行点预定义好的程序的特定执行点例如:例如: 方法的调用和执行方法的调用和执行 对属性的读写访问对属性的读写访问 异常处理异常处理 对象和类的初始化执行对象和类的初始化执行 构造器的调用和执行构造器的调用和执行 27 Pointcuts::用来指明所需连接点的语言元素用来指明所需连接点的语言元素可能包括一系列可能包括一系列的连接点的连接点,,同时它还可以为在连接点上执行的通知提供上下文同时它还可以为在连接点上执行的通知提供上下文。

      例如:例如: pointcut callSetter( ); call (public void HelloWorld.set*(..)) 其中:其中: pointcut说明声明的是一个切入点,命名说明声明的是一个切入点,命名 callSetter,后面的空,后面的空括号表示该切入点不需要上下文信息括号表示该切入点不需要上下文信息 Call表示该切入点捕获的是对指定方法的调用,指定的方法是表示该切入点捕获的是对指定方法的调用,指定的方法是在类在类HelloWorld中声明的共有的、返回值为空、以中声明的共有的、返回值为空、以set开头、开头、拥有任意参数的方法拥有任意参数的方法 28 Advices:要在:要在Pointcuts执行的执行的Aspect的代码 AspectJ提供了提供了3种把通知关联到连接点的方式:种把通知关联到连接点的方式:after、、before、、around after和和before分别表示通知在连接分别表示通知在连接点的前面或者后面运行,点的前面或者后面运行,around则表示通知在连接点则表示通知在连接点的外面运行,并可以决定是否运行此连接点。

      的外面运行,并可以决定是否运行此连接点 例如:例如: 在银行信息系统中,实现帐户存取模块、权限验证模在银行信息系统中,实现帐户存取模块、权限验证模块和日志记录模块帐户存取模块可用块和日志记录模块帐户存取模块可用OOP技术来实技术来实现,其他的模块可采用现,其他的模块可采用AOP技术 在在around通知中验证权限,只有验证通过才运行该连通知中验证权限,只有验证通过才运行该连接点,在接点,在before和和after通知中就输出日志记录通知中就输出日志记录 Aspect:上述三者的结合以类似于类的概念,将:上述三者的结合以类似于类的概念,将Pointcut和和Advice组合在一起,形成一个程序单元组合在一起,形成一个程序单元 29nAspectJ为程序员提供了编译、调试等工具为程序员提供了编译、调试等工具nAspect编排器编排器n将不同将不同aspect组装到一起组装到一起nAspect调试器调试器n独立的独立的Aspect浏览器浏览器n和一些流行的和一些流行的IDE环境(环境( Forte 、、 Jbuilder 、、 Emacs )的集成nAspectJ可以引入新的数据成员和新的方法。

      可以引入新的数据成员和新的方法 30应用示例应用示例1:1:一个简单的使用面向对象方法设计的图元编辑器的示例在该图元编辑器在该图元编辑器中,抽象图元类中,抽象图元类FigureElement有有两个图元子类两个图元子类Point和和Line,分,分别对点和线进行别对点和线进行管理这两个类管理这两个类体现了良好的模体现了良好的模块性,类中源代块性,类中源代码都紧密相关,码都紧密相关,内聚度很高,并内聚度很高,并且每个类的接口且每个类的接口都很清晰都很清晰显示更新的需求:显示更新的需求:无论图元何时移动、无论图元何时移动、移动到哪里,都要移动到哪里,都要通知屏幕管理器通知屏幕管理器((Display)其位)其位置发生了改变置发生了改变 31 采用面向对象的设计方法,典型的做法是在每个移动图采用面向对象的设计方法,典型的做法是在每个移动图元的操作代码中,都插入一段通知元的操作代码中,都插入一段通知Display其位置发生了改变的其位置发生了改变的代码(调用代码(调用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 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( ); }} 32Aspect DisplayUpdating{Pointcut move(): call(void Line.setP1(Point))|| 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{ private 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做以下的事情:做以下的事情:n在任何对象调用在任何对象调用TestClass.sayHello()方法的前后打印一条消方法的前后打印一条消息。

      息n测试测试TestClass.sayAnyThing()方法的参数至少有三个字符方法的参数至少有三个字符public class TestClass{public void sayHello(){System.out.println(“Hello,,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 34public aspect MyAspect{public pointcut sayMethodCall():: call(public void TestClass.say*());;pub1ic pointcut sayMethodCal1Arg(String str):: call(public void TestClass.sayAnyThing (string))&&args(str);;before():sayMethodCal1(){ System.out.print1n(“\nTestClass.”+ thisJoinPointStaticPart.getSignature().getName()+”start…”);;}after()::sayMethodCal1(){ System.out.print1n(“\nTestClass.”+ thisJoinPointStaticPart.getSignature().getName()+”end…”);;}before(String str)::sayMethodCallArg(str){ if(str.1ength()3){ System.out.println(“Error::I can’t say words less than 3 characters”);; return;; }} 35应用示例应用示例3 3:例外处理:例外处理 以数据库查询为例,分别用以数据库查询为例,分别用OOP的的Java语言语言和和AOPAOP的的AspectJAspectJ语言加以语言加以 实现。

      实现public class DBQuery {{public ResultSet executeQuery(String sql){{try{{// 数据库连接操作数据库连接操作// 数据库查询操作数据库查询操作}}catch(java.lang.ClassNotFoundException e){{//对对ClassNotFound 例外进行处理例外进行处理}}catch(SQLException e){{// 对对SQL例外进行处理例外进行处理}}catch(Exception e){{// 对其他例外进行处理对其他例外进行处理}}}}}} 36分析以上代码,主要存在以下几点不足:分析以上代码,主要存在以下几点不足:n要求编程人员掌握大量的例外类库和复杂的语法结构,要求编程人员掌握大量的例外类库和复杂的语法结构,实际应用中容易出错;实际应用中容易出错;n对例外的处理并不是对例外的处理并不是DBQuery类的核心功能,但编程类的核心功能,但编程人员要花费大量精力在例外的处理上,而忽略了问题人员要花费大量精力在例外的处理上,而忽略了问题本身;本身;n当当DBQuery所在类包中定义了多个类或所在类包中定义了多个类或DBQuery中定中定义了多个方法时义了多个方法时( (如数据库记录的添加、更新、删除等如数据库记录的添加、更新、删除等操作),就要重复定义多个相同的例外处理;操作),就要重复定义多个相同的例外处理;n大量的例外处理代码可能引起更多的不必要错误,给大量的例外处理代码可能引起更多的不必要错误,给程序调试和维护带来了困难;程序调试和维护带来了困难;基于以上几点,可认为它是有安全隐患和不健壮的程序。

      基于以上几点,可认为它是有安全隐患和不健壮的程序 37 基于基于AOP 安全编程的思想,在安全编程的思想,在DBQuery类类中保留单纯的数据库连接和查询代码,而将其中保留单纯的数据库连接和查询代码,而将其中实现例外处理的代码抽取出来,组织成单独中实现例外处理的代码抽取出来,组织成单独模块 38aspect ExHandle{{declare soft: Exception : within(DBQuery);;pointcut Callmethod(DBQuery query):this(query)&& call(* * DBQuery.*(..)) ;;after (DBQuery query) throwing (java.lang.ClassNotFoundException e): Callmethod(query) {{//对对ClassNotFound 例外进行处理例外进行处理}}after (DBQuery query) throwing (SQLException e ): Callmethod(query) {{//对对SQL例外进行处理例外进行处理 }}after (DBQuery query) throwing (Exception e ): Callmethod(query) {{//对其它对其它例外进行处理例外进行处理}}}} 39 以下几方面为突出的安全优点:以下几方面为突出的安全优点:n程序开发人员可专注于数据库连接和查询操作本身,程序开发人员可专注于数据库连接和查询操作本身,而无须同时考虑对例外的处理;而无须同时考虑对例外的处理;n安全代码被独立到单独的安全代码被独立到单独的aspect 中,使程序更易理解,中,使程序更易理解,且当安全策略需要修改时,只需变动且当安全策略需要修改时,只需变动ExHandle 代码,代码,而无需改动而无需改动DBQuery 类;类;n当添加新的类或当添加新的类或DBQuery类中添加新的方法时,编程类中添加新的方法时,编程人员不必考虑新的错误处理策略,甚至不必去了解这人员不必考虑新的错误处理策略,甚至不必去了解这些策略,些策略, ExHandle代码将自动应用于它们。

      代码将自动应用于它们 40应用应用4 4:一个异常处理的实例:一个异常处理的实例 下面的代码是一个简单的方面的例子,它打印所下面的代码是一个简单的方面的例子,它打印所有的没有被包中定义的任何方法处理的异常我们能有的没有被包中定义的任何方法处理的异常我们能在测试时使用这个代码,看是否有没预料到的错误,在测试时使用这个代码,看是否有没预料到的错误,由此指出包中的一个漏洞由此指出包中的一个漏洞public aspect ExceptionPrinter{pointcut allMethods( )::executions(* *(....));;static after( ) throwing (Exception e)::allMethods( ){System.out.println(“Uncaught exception::”+ e);;}} 41应用5:AOP技术在并发访问控制中的应用n当多个线程要访问同一个变量或对象时,为了保证数当多个线程要访问同一个变量或对象时,为了保证数据的一致性,要实施一些并发访问控制策略据的一致性,要实施一些并发访问控制策略n通常的做法是采用加锁和解锁的方法。

      即多个访问类通常的做法是采用加锁和解锁的方法即多个访问类同时访问一个共享数据对象时,每个访问类在访问这同时访问一个共享数据对象时,每个访问类在访问这个数据对象时,将数据对象上锁,访问完成后,再解个数据对象时,将数据对象上锁,访问完成后,再解锁,供其他并发线程访问锁,供其他并发线程访问workerAnotherworker数据对象数据对象上锁上锁解锁解锁上锁上锁解锁解锁 42public aspect Lock{ReentrantWriterPreferenceReadWriteLock rwl = new ReentrantWriterPreferenceReadWriteLock();public pointcut writeOperations( ): execution(public boolean Worker.createData( ))|| execution(public boolean Worker.updateData( )) || execution(public boolean AnotherWorker.updateData( ));before( ): writeOperations( ){rwl.writeLock( ).acquire( );//在写操作之前上锁在写操作之前上锁after( ): writeOperations( ){rwl.writeLock( ).release( );//在写操作之后解锁在写操作之后解锁}} 43AOPAOP研究内容研究内容nEarly aspects: aspect-oriented requirements engineering and architecture design.nAspect-oriented modeling and designnDesign patterns for aspect-oriented systemsn 44nAspect-oriented programming languages, platforms and frameworksnType systems for aspectsnComposition models and operators for aspectsnOptimization and performance improvement of aspect-oriented composition 45nApplication of AOSD in specific areas such as embedded systems, banking systems, ambient computing, etc.nAspects in feature-oriented approaches and product lines.nAspects in reengineering 46小结小结nAOP起源于程序设计中起源于程序设计中“横切横切”引发的引发的“代码散布代码散布”和和“代码交织代码交织”问题。

      在目前的程序设计技术下,程问题在目前的程序设计技术下,程序中的横切无法避免,其实现代码相互纠缠在一起,序中的横切无法避免,其实现代码相互纠缠在一起,是软件复杂度的来源之一是软件复杂度的来源之一nAOP就是要能分离出那些隐含的、相互交织纠缠的系就是要能分离出那些隐含的、相互交织纠缠的系统关注点,并使之明确使用统关注点,并使之明确使用AOP为程序员提供的新为程序员提供的新的模块化武器,横切的代码就可以局部化,程序的结的模块化武器,横切的代码就可以局部化,程序的结构很明白,代码也常常很简短构很明白,代码也常常很简短 47n面向面向方面方面不仅不仅在增加分割系在增加分割系统统特性上的价特性上的价值值——对对基本基本系系统统的安全性、日志、持久性、的安全性、日志、持久性、调试调试、跟踪、分布式、、跟踪、分布式、执执行行监监控等n方面的方面的另一个另一个重要的目的是重要的目的是提供了一个提供了一个把用例与方面把用例与方面连连接起来接起来的新范型的新范型在在现现存的构件模存的构件模块块性的性的顶顶端增加用端增加用例模例模块块)) 48子用例异常用例异常用例异常用例基本用例基本用例n面向方面技术也使面向方面技术也使UML中用例模块化中用例模块化 49子用例异常用例异常用例异常用例基本用例基本用例编织器编织器 50n可以肯定的是:可以肯定的是:AOP不会是处理关注点分离问不会是处理关注点分离问题的最后解决方案。

      题的最后解决方案 如果如果AOP对系统关注点的分离粒度太细,则会适得其反,导对系统关注点的分离粒度太细,则会适得其反,导致模块间关系更加复杂,反而使复杂度增加因此,应用致模块间关系更加复杂,反而使复杂度增加因此,应用AOP时时仍然要遵从良好的设计原则,只分离需要分离的关注点仍然要遵从良好的设计原则,只分离需要分离的关注点 51 AOPAOP的概念也就是面向方面的软件开发的概念也就是面向方面的软件开发((AOSDAOSD))将会使我们可以完美的继承已经存在的软件,在将会使我们可以完美的继承已经存在的软件,在系统的整个生命周期中,可以不断的进行开发迭系统的整个生命周期中,可以不断的进行开发迭代和不断的发布更新版本代和不断的发布更新版本 我们今天叫做面向方面的技术将把软件生命周我们今天叫做面向方面的技术将把软件生命周期成本降低至少期成本降低至少2020% 52 它与它与“子程序子程序”概念十分相像,但是概念十分相像,但是n不是所有的关注点都能很利索地通过子程序不是所有的关注点都能很利索地通过子程序实现n子程序调用的程序员必须对调用的子程序有子程序调用的程序员必须对调用的子程序有足够的了解。

      足够的了解n一段程序必须知道要显式地调用另一段子程一段程序必须知道要显式地调用另一段子程序,并且知道怎样去调用,这极大限制了程序,并且知道怎样去调用,这极大限制了程序员并行独立解决子问题的能力序员并行独立解决子问题的能力 53n这不是一种横空出世的新思想,它依赖这不是一种横空出世的新思想,它依赖于十年前就已经众所周知的补丁技术于十年前就已经众所周知的补丁技术(补丁技术已成为专利技术!)然而(补丁技术已成为专利技术!)然而什么是新的呢什么是新的呢? ?就是实现了就是实现了“正确地打补正确地打补丁丁”,把补丁技术系统化、抽象化和形,把补丁技术系统化、抽象化和形式化,这正是理解复杂系统的最自然方式化,这正是理解复杂系统的最自然方式 54 反向思维,反向思维,保持原衣服不动,保持原衣服不动,把在何处打补丁把在何处打补丁的信息写在补丁的信息写在补丁上大部分创新的基本思想都来自日常生活,大部分创新的基本思想都来自日常生活,而且原理简单而且原理简单打补丁--反向打补丁打补丁--反向打补丁--系统化、抽象化、形式化--系统化、抽象化、形式化实现两次创新!!实现两次创新!! 55希望寄托在年轻人身上希望寄托在年轻人身上 !!!! 56谢谢 谢谢再再 见见 。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.