冒号课堂§3.3:切面范式 - 编程入门网
了OOP,而是OOP的一种补充——尽管AOP并不局限于OOP。”
冒号课堂§3.3:切面范式(3)时间:2011-06-25 BlogJava xyz98问号的求知欲很强:“AOP实现的机理是什么?” 冒号回答:“如果一个程序是一个管道系统,AOP就是在管道上钻一些孔,在每个孔中注入新的代码流。因此AOP实现的关键是将advice的代码嵌入到主体程序之中,术语称编织(weaving)。这是很自然的——将问题分解之后再合成,问题才得以还原。编织可分两种:一种是静态编织,通过修改源码或字节码(bytecode)在编译期(compile-time)、后编译期(post-compile)或加载期(load-time)嵌入代码——请注意,这里涉及到刚才提到的元编程和产生式编程;另一种是动态编织,通过代理(proxy)等技术在运行期(run-time)实现嵌入。具体的工具包括一些扩展性语言如AspectJ、AspectC++等和一些框架如AspectWerkz、Spring、Jboss AOP等。” 叹号搔着头:“听起来怪复杂的。” 引号倒不在乎:“这些机理是AOP的实现者需要操心的,使用者只需关心AOP是否好用,性能如何等等。” “为了让你们有更直观的印象,我们借用光学原理来类比。”冒号用幻灯片展示了一幅图—— “众所周知,白光经过三棱镜的折射而分解为七色光,是谓光的色散。再经过一个倒置的三棱镜,七色光又重新会聚为白光。”冒号简述中学的物理知识,“如果把一个复杂的系统看作复合色的白光,经过第一个三棱镜——关注分离器,系统被分解为不同的切面,如同不同的单色的彩光。这些切面经过第二个三棱镜——编织器,再度合成为原系统。” 叹号脸上的迷惘之色渐去:“这下清楚多了。” 句号积极发言:“从中看出,AOP的实施分三步:切面分解、切面实现和切面合成。其中第一步是在设计者的头脑中进行的,第三步是通过AOP的工具实现的,真正需要程序员编码的部分在第二步,即分别实现各切面的advice。” 冒号赶紧补漏:“你好像忽略了切面的另一要素pointcut,如果程序员不指明advice挂靠的切入点,系统如何知道该何时何处调用他编写的执行代码呢?” 句号的嘴张成O状:“是哦,我怎么把这茬给忘了?” 在AOP的议题结束前,冒号不忘指出:“与OOP一样,AOP在带来便利的同时,也增加了一定的复杂度和性能损耗。它们更适用于大中型程序,用在小型程序中则不啻牛刀杀鸡。” ,插语 [1] 耦合(coupling)用来衡量模块之间的依赖程度,聚合(cohesion)用来衡量模块内在的关联强度。它们常用来作为软件质量的评判标准,耦合度宜低,聚合度宜高。 。总结 SoC是Separation of concerns的缩写,指应将关注点分离;DRY是Don’t Repeat Yourself的缩写,指应尽量减少重复代码。 抽象与分解是治愈代码紊乱、松散、重复的良方。 抽象与分解的原则是单一化和正交化,以保障软件系统符合“高聚合、低耦合”的要求。 横切关注点指与程序的纵向主流执行方向横向正交的关注焦点。 接入点是附加行为——建议(advice)的执行点,切入点(pointcut)是指定的接入点(join point)集合,这些接入点共享一段插入代码。切入点与建议组成了切面(aspect),是模块化的横切关注点。 编织是将附加的切面逻辑嵌入到主体应用程序之中的过程。编织分静态编织和动态编织两种。静态编织在编译期、后编译期或加载期嵌入代码,动态编织则在运行期嵌入。 AOP的实施分三步:切面分解、切面实现和切面合成。 OOP只能沿继承树的纵向方向重用,AOP可以沿横向方向重用。 语言之间的天然差别,译者的专业水准、语言 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |