logo
天地变化的道理
使用率很高网站
生活要常常分享
您身边百科全书
免费为您秀产品
面向切面的程序设计
面向切面的程序设计 -{zh-hans:面向方面编程;zh-hant:剖面导向程式设计;zh-tw:特性导向程式设计;}-(Aspect-oriented programming,AOP,又译作面向方面程序设计、面向切面程序设计、-{zh-hans:剖面导向程序设计;zh-hant:面向方面的程式设计;}-),是计算机科学中的一种编程范型,旨在将交叉切入关注与作为业务主体的核心关注进行分离,以提高程序代码的模块化程度。“方面”(aspect)通过规定叫做“点切入”(pointcut)的一种量化或查询,在各种接合点(join point)上应用通告(advice),从而改变现有基础代码的行为(behavior)。比如点切入与通告的一个实例:“对所有方法名以codice_1开头的方法添加后台日志”。该思想使得开发人员能够将与代码核心业务逻辑关系不那么密切的功能(如日志功能)添加至程序中,同时又不降低业务代码的可读性。 简介. 面向方面编程将代码逻辑切分为不同的模块(即,一段特定的逻辑功能)。几乎所有的编程思想都涉及代码功能的分类,将各项关注(concern)封装成独立的抽象模块(如函数、过程、模块、类以及方法等),后者又可供进一步实现、封装和重写。部分关注“交叉切入”程序代码中的数个模块,即在多个模块中都有出现,它们即被称作交叉切入关注。 日志功能即是交叉切入关注的一个典型案例,因为日志功能往往跨越系统中的每个业务模块,即交叉切入(crosscut)所有有日志需求的类及方法体。而对于一个信用卡应用程序来说,存款、取款、帐单管理是它的核心关注,日志和持久化将成为交叉切入整个对象结构的交叉切入关注。 方面的概念源于对面向对象编程和计算反射的融合。面向方面编程语言拥有很多类似于元对象协议的功能,但有更多的限制。方面相关的编程概念包括、混入和。使用面向方面范型的其他方式有和Hyper/J的hyperslices方式。 历史. “面向方面编程”这一术语由施乐帕洛阿尔托研究中心的Chris Maeda首先提出,但其具体时间已经不可考证了。术语“交叉切入”(crosscut)是由提出的。同许多重大的技术创新一样,面向方面编程,也是在不同的地方被独立发展出来。面向方面编程的早期工作,主要是由下面几个机构和人员作出的: 基本概念. 是对软件工程有意义的小的、可管理的、可描述的软件组成部分,一项关注通常只同一个特定概念或目标相关联。传统的编程语言,以一种线性的文本来描述软件,只采用一种方式比如类,将软件分解成模块;这导致某些关注比较好的被捕捉,容易进一步组合、扩展;但还有一些关注没有被捕捉,弥散在整个软件内部。 关注分离(SOC)是标识、封装和操纵只与特定概念、目标相关联的软件组成部分的能力,即标识、封装和操纵关注的能力。分离关注使得解决特定领域问题的代码从业务逻辑中独立出来,业务逻辑的代码中不再含有针对特定领域问题代码的调用,业务逻辑同特定领域问题的关系通方面来封装、维护,这样原本分散在在整个应用程序中的变动就可以很好的管理起来。 核心关注是一个软件最主要的关注。在传统的编程语言中,将软件分解成模块的主要方式,是支配性分解,即按主关注进行模块分解。用来描述、设计、实现一项给定关注的软件构造单位是方法。如果两个关注的实现的方法存在交集,则称谓这两个关注相互交叉切入(crosscut)。 面向方面编程的核心概念,是从核心关注中分离出交叉切入关注。面向方面编程,在支配性分解的基础上,提供叫做(aspect)的一种辅助的模块化机制,这种新的模块化机制可以捕捉交叉切入关注。 接合点模型. 面向方面编程语言的通告相关构件,定义了一个接合点模型(JPM)。一个JPM定义了三种东西: 对接合点模型进行比较可以基于:所暴露的接合点,如何规定接合点,在接合点上允许的操作,能够表达的结构性增强机制。 AspectJ的接合点模型. -{H|zh-hans:重定向;zh-hant:重新导向;}--{H|zh-cn:字符;zh-tw:字元;}--{H|zh-hans:文件; zh-hant:档案;}--{H|zh-hans:快捷方式; zh-hant:捷径;}--{H|zh-hans:项目;zh-hant:专案;zh-tw:计划;zh-hk:计划;zh-mo:计划;}--{H|zh-cn:计算机; zh-sg:电脑; zh-tw:电脑;}- 所有有效的Java程序也是有效的AspectJ程序,但是AspectJ容许编程者定义叫的特殊构造。方面包含一些对于标准类不能获得到的实体。它们是扩展方法、点切入和通告。 扩展方法. 允许编程者在这个方面之内向现存的类增加方法、字段或接口。下面例子中,方面codice_2向类codice_3增加一个codice_4方法(参见访问者模式): aspect VisitAspect { void Point.acceptVisitor(Visitor v) { v.visit(this); ⋮ 点切入. 在AspectJ中接合点包括:方法或构造子调用或执行,一个类或对象的初始化,字段读或写访问,异常处理等。接合点不包括:循环、codice_5调用,codice_6子句,多个语句等。 点切入是通过组合“原始点切入指示符”(PCD - primitive pointcut designator)来规定的。例如: aspect VisitAspect { pointcut set() : execution(* set*(*) ) && this(Point) && within(com.company.*); 这个点切入匹配一个方法执行接合点,如果这个方法名字开始于codice_7,并且此对象(codice_8)是在codice_9包中类型codice_3的实例。这个点切入可以使用名字codice_11来提及。点切入可以复合和命名来重新使用。 “种类”PCD匹配特定种类的接合点(比如方法执行),并且倾向于接受类似Java模样的签名作为输入: execution(* set*(*)) 这个点切入匹配一个方法执行接合点,如果这个方法名字开始于codice_7,并且精确的只有一个任何类型的实际参数。 “动态”PCD检查运行时间类型和绑定变量: this(Point) 这个点切入在当前执行对象是类codice_3的实例之时匹配。注意一个类的未限定名字可以通过Java的正常类型查找来使用。 “范围”PCD限制接合点的词法作用域: within(com.company.*) 这个点切入匹配在codice_9包中任何类型的任何接合点。codice_15是一种形式的通配符,它用来匹配具有一个签名的任何东西。 通告. 通告规定在(通过点切入指定的)一个接合点(之前、之后或周围)运行特定代码(指定如若一个方法中的代码)。面向方面编程的运行时间系统,在这个点切入匹配一个接合点的时候,自动调用通告。例如: aspect VisitAspect { after() : set() { Display.update(); 这在效果上指定了:“如果codice_11点切入匹配这个接合点,在接合点完成之后,运行代码codice_17。” 实现. 下列编程语言已经实现了AOP,于语言之内或外部库:
面向切面的程序设计
本站由爱斯园团队开发维护,感谢
那些提出宝贵意见和打赏的网友,没有你们的支持,
网站不可能发展到今天,
继往开来,善终如始,我们将继续砥砺前行。
Copyright ©2014 iissy.com, All Rights Reserved.