面向方面编程中必要语义约束的研究
第13章对象约束语言

7
13.4 OCL语法 语法
OCL指定了每一个约束都必须有 一个上下文.上下文(context)指定了 哪一个项目被约束.OCL是一个类型化 的语言,因此数据类型扮演了重要角色 ,如高级语言C++,Java一样,也有多 种数据类型.
8
13.3.1 固化类型
一个约束就是对一个(或部分)面向对象 模型或者系统的一个或者一些值的限制. UML类图中的所有值都可以使用OCL来约 束.约束的应用类似于表达式,在OCL中 编写的约束上下文可以是一个类或一个操 作.其中需要指定约束的固化类型,而约 束的固化类型可以由以下三项组成: invariant pre-condition post-condition
OclVoid类型是与所有其他类型相一致的一种类型,它只 有一个叫OclUndefined的实例,应用于未定义类型的任 何特性调用,除了oclIsUndefined()返回"真",其他都 会产生OclUndefined. colIsUndefined(): Boolean 如果对象与OclUndefined相 同,那么oclIsUndefined()的计算结果为"真". OclAny类型是一个UML模型里所有类型和OCL标准库的 父类,它包括了诸多子类例如Real,Boolean,Sring, OclState和Integer等,如图13-3所示.模型里所有的子 类都继承由OclAny定义的特性.下面是对所有OclAny中 操作的描述. =(object:OclAny):Boolean 如果self与object是同一对象 ,则返回值为"真". post:result = (self = object) <>(object:OclAny):Boolean 如果self是一个与object不 同的对象,则返回值为"真". pre:result = (self <> object)
面向语义集成—本体在Web信息集成中的研究进展

中图分类号 : P9 T33
文献标识码 : A ED Ⅱ : GRATl oN:
S 【 E~ ANTI —oRⅡ C
T HE RoLE OF oNToL oGY N EB 肿 I W
l 0RM_ TI A I oN DⅡ EG_ ATI R oN
D N i o#, A GSi e , A GD n-iI E GZ — n T N — i Y N og n hH hw 2 qg
r .) olegfCt u r ' c a dTcnl y P k g Ui rt, ei 0 1 ‰ 1 1p llr o o l t  ̄i e n e o g , ei n ei Bln 1 ̄7 , e r l l r e e p n h o n v sy jg
2 N , n aoa  ̄ m Ma i e e i .Pk gU / r ,成 昭 107 , m  ̄ . a oo L br o "  ̄ l t c n rp o h eP c t n ei n e时 n vs 08 1 c , J
Ke r s y wo d : ̄l lg t oy;src ua  ̄to o tu trla h d;s ma t eh d no na o t g a ct 目r c’ e n i m to ;ifn 6 n it r f c;3 ‘ c re i B
l 引言
随着 We b的迅猛发 展, 困特 网上 的资 源越来 越丰 富 , 已
维普资讯
第2 2卷 第 1 期 2O O 2年 1月
文章编号 : 0 一98 (02 1 05 f 1 i 0 120 ) —0 1 一i 0 3
计 算机 应 用
C mp tr pia o s o ue Ap l t n ci
约束与约束类型课件

03
软约束的适用场景
软约束适用于需要灵活决策和调整的情况。在某些情况下,硬约束可能
过于僵化或难以满足实际需求,而软约束可以提供更加灵活和适应性的
指导。
软约束的分类
基于原则的软约束
这种类型的软约束基于一定的原则或价值观,例如企业道 德准则、社会责任等。它要求决策者遵循这些原则,但并 不强制执行。
基于最佳实践的软约束
预期。
自动化系统
在自动化系统中,硬约束可以用于 定义系统的技术限制和安全要求, 以确保系统的正常运行和安全性。
游戏设计
在游戏设计中,硬约束可以用于定 义游戏规则和技术限制,以确保游 戏的公平性和可玩性。
04
时间约束
时间约束的定义
时间约束是指对某个操作或事件在时间方面的限制或规定,以确保其按照预定的 时间要求进行。
第二季度
第三季度
第四季度
数量型资源约束
指资源的数量有限,无 法满足所有需求的情况 。例如,土地、水、矿 产等自然资源的数量有 限,需要合理利用和保 护。
质量型资源约束
指资源的质量受到限制 ,无法满足所有需求的 情况。例如,劳动力、 技术、信息等资源的质 量参差不齐,需要选择 合适的资源以满足需求
。
结构型资源约束
时间约束通常用于计划、调度、控制和优化等领域,以确约束
指具有确定性的时间要求,如必须在某个确定的时间点完成某个 任务。
软时间约束
指具有一定弹性或缓冲时间的要求,如任务需要在某个时间段内完 成。
混合时间约束
指同时存在硬时间和软时间约束的情况,如任务需要在某个确定的 时间点之前或之后的某个时间段内完成。
硬约束的定义
硬约束是指那些在特定条件下必须满 足的限制条件,一旦违反,将导致系 统无法正常工作或产生错误结果。
语义网的研究与展望

பைடு நூலகம்
文献标识码: A
1 语义网的定义及概述
万 维 网 之 父— ——伯 纳 斯·李( Berners- Lee) 在 2002 年 描 绘 了 下 一 代 互联网的前景, 并将下一代互联网称为“语义网”( Semantic Web) 。他描述 道 :“ 语 义 网 是 当 前 网 络 的 延 伸 , 信 息 在 其 中 被 赋 予 明 确 含 义 , 从 而 实 现 人与计算机的更好协作。”与仅为人可读的万维网不同, 语义网是一种智 能网络, 它的目标是对现行互联网进行扩展, 使整个互联网能够自动处 理, 使全部内容易于使用, 建立一个可理解的全球平台。或者说, 语义网 是机器可理解的信息, 是数据网, 更是全球性的数据库, 在语义网中, 一 切 可 以 确 定 的 内 容 , 例 如 人 、时 间 、事 件 、物 体 等 , 都 作 为 实 体 分 布 在 网 中, 每个实体都有一个统一资源标志。语义网代表着下一阶段的信息革 命, 它犹如一个巨型的大脑, 组成其各个部分的数据库智能化程度极高, 协调能力也将非常强大, 可以解决各种难题。所以, 有人将语义网称作是 “数据库智能化、协调好的巨型大脑”。语义网的核心是元数据, 它通过在 现有 Web 基础上增加共用的、标准的机 器 可 理 解 的 元 数 据 , 使 得 原 来 Web 环 境 下 难 以 实 现 的 许 多 应 用 成 为 可 能 或 变 得 更 有 成 效 , 如 信 息 获 取、信息过滤、Web 自动服务等。
面向对象的参数化约束模型及其实现

面向对象的参数化约束模型及其实现
面向对象的参数化约束模型是一种基于对象的约束模型,它将约束和参数化结合在一起,以提供更灵活的约束管理。
它可以用来控制对象之间的关系,以及对象的行为。
面向对象的参数化约束模型的实现需要考虑以下几个方面:
1. 对象模型:首先,需要定义对象模型,即定义对象的属性和行为。
这些属性和行为可以用来描述对象之间的关系,以及对象的行为。
2. 约束模型:其次,需要定义约束模型,即定义对象之间的约束关系。
这些约束关系可以用来控制对象之间的关系,以及对象的行为。
3. 参数化模型:最后,需要定义参数化模型,即定义参数化约束的参数。
这些参数可以用来控制对象之间的关系,以及对象的行为。
面向对象的参数化约束模型的实现可以采用多种方式,比如使用面向对象的编程语言(如Java),使用约束求解器(如Gecode),或者使用可视化约束编辑器(如Clingo)。
面向对象的参数化约束模型的实现可以帮助开发人员更好地控制对象之间的关系,以及对象的行为。
它可以帮助开发人员更好地管理复杂的约束,以及更好地实现参数化约束。
总之,面向对象的参数化约束模型是一种有效的约束模型,它可以帮助开发人员更好地控制对象之间的关系,以及对象的行为。
它的实现可以采用多种方式,比如使用面向对象的编程语言,使用约束求解器,或者使用可视化约束编辑器。
61条面向对象的编程原则

摘抄自《OOD 启思录》--Arthur J.Riel 著鲍志云译“你不必严格遵守这些原则,违背它们也不会被处以宗教刑罚。
但你应当把这些原则看成警铃,若违背了其中的一条,那么警铃就会响起。
”“你不必严格遵守这些原则,违背它们也不会被处以宗教刑罚。
但你应当把这些原则看成警铃,若违背了其中的一条,那么警铃就会响起。
”----------Arthur J.Riel(1)所有数据都应该隐藏在所在的类的内部。
p13(2)类的使用者必须依赖类的共有接口,但类不能依赖它的使用者。
p15(3)尽量减少类的协议中的消息。
p16(4)实现所有类都理解的最基本公有接口[例如,拷贝操作(深拷贝和浅拷贝)、相等性判断、正确输出内容、从ASCII描述解析等等]。
p16(5)不要把实现细节(例如放置共用代码的私有函数)放到类的公有接口中。
p17如果类的两个方法有一段公共代码,那么就可以创建一个防止这些公共代码的私有函数。
(6)不要以用户无法使用或不感兴趣的东西扰乱类的公有接口。
p17(7)类之间应该零耦合,或者只有导出耦合关系。
也即,一个类要么同另一个类毫无关系,要么只使用另一个类的公有接口中的操作。
p18(8)类应该只表示一个关键抽象。
p19包中的所有类对于同一类性质的变化应该是共同封闭的。
一个变化若对一个包影响,则将对包中的所有类产生影响,而对其他的包不造成任何影响.(9)把相关的数据和行为集中放置。
p19设计者应当留意那些通过get之类操作从别的对象中获取数据的对象。
这种类型的行为暗示着这条经验原则被违反了。
(10)把不相关的信息放在另一个类中(也即:互不沟通的行为)。
p19朝着稳定的方向进行依赖.(11)确保你为之建模的抽象概念是类,而不只是对象扮演的角色。
p23(12)在水平方向上尽可能统一地分布系统功能,也即:按照设计,顶层类应当统一地共享工作。
p30(13)在你的系统中不要创建全能类/对象。
对名字包含Driver、Manager、System、Susystem 的类要特别多加小心。
基于UML2.0的面向方面建模方法研究
基于UML2.0的面向方面建模方法研究
杨敬中;张广泉
【期刊名称】《苏州大学学报(工科版)》
【年(卷),期】2007(027)001
【摘要】面向方面编程是一种基于关注点分离的新技术,它成功解决了面向对象编程中所存在的代码缠结和散射问题,但在软件设计阶段并没有得到很好的支持.通过分析面向方面编程的特点及其概念,比较UML2.0的两种不同扩展方法,提出了基于Profile机制来定义新的模型元素,并为其增加新的语义,再通过对象约束语言(OCL)来对这些新增模型元素加以约束,从而实现了UML2.0对面向方面建模的支持.【总页数】6页(P21-26)
【作者】杨敬中;张广泉
【作者单位】苏州大学计算机科学与技术学院,江苏,苏州,215006;苏州大学计算机科学与技术学院,江苏,苏州,215006
【正文语种】中文
【中图分类】TP311
【相关文献】
1.基于CPN的UML
2.0形式化建模 [J], 孔莹莹;蒲海涛;隋瑞升
2.一种面向方面的UML建模方法研究 [J], 史玉珍;李波
3.基于UML2.0的系统建模 [J], 李云全;刘淑芬;申自浩
4.基于UML2.0的设备管理系统需求建模 [J], 李攀;俞集辉;付志红
5.基于UML2.0的电力缺陷设备管理系统建模研究 [J], 黄月涓;郭剑毅;苏畅;张丽;章程;邓锦辉
因版权原因,仅展示原文概要,查看原文内容请购买。
信息系统工程概论课程重点项整理
信息系统整理第一章信息系统工程导论(概述)1.何谓信息系统?指利用信息技术,以计算机为主要处理工具的收集、传输、加工、存储信息,并能输出有用信息的系统。
6. 一般信息系统有哪些基本功能?(P10)常见的信息系统的基本功能如下:(1)信息收集:由人或其他环境设施输入数据(信息),为系统输入信息。
(2)信息存储:一般用数据库作为信息存储工具,具有管理大量数据集、提供从海量数据中快速检索指定信息的功能。
(3)信息加工:根据业务部门信息加工的要求,提供统计/分析/计算等信息处理功能。
(4)信息输出(查询/显示):根据人或系统的要求,输出有用的、可视化的信息。
(5)人机交互(界面):利用该功能,实现信息系统和人、应用环境之间进行信息交换,为人提供一个环境友好、使用便利的人机交互界面。
8.什么是信息系统工程?信息系统工程与一般系统工程有何区别?(P17-18)(1)定义:信息系统工程是按照工程学原理指导信息系统的构建过程,把信息系统的开发建设作为一项系统工程来管理,并且运用系统论和工程学的观点把信息系统的开发过程分为总体规划、系统分析、系统设计和系统实现等阶段。
(2)区别:信息系统工程具有一般系统的特征属性,可以用系统科学与系统工程学的基本理论和基本方法来指导。
同时,信息系统又是一种特定的计算机应用系统,具有一般计算机应用系统开发的特征属性。
信息工程技术已经形成了一系列软件开发技术规范、测试技术和管理方法,这些技术方法具有系统工程的思想,但又不完全一致。
10. 简述信息系统工程的方法论体系。
(P18-21)所谓方法论是指一组相关方法的集合。
信息系统工程方法论是系统工程方法在信息领域中的应用,其产生与发展主要源于信息系统工程的实践探索和理论总结。
它的主要内容涉及3个方面:(1)一般系统工程的通用方法。
(2)信息系统工程方法。
信息系统工程方法从工程实践的角度,根据应用范围和抽象程度可以划分为战略层、战役层和战术层3个不同层次。
计算机编程语言中的语法与语义分析
计算机编程语言中的语法与语义分析计算机编程语言是人与计算机进行交流的工具,它具有自身的语法和语义规则。
语法和语义分析是计算机编程中非常重要的概念,它们帮助程序员确保代码的正确性和一致性。
本文将探讨计算机编程语言中的语法和语义分析的概念、作用和实际应用。
一、语法分析语法分析是计算机编译器或解释器的一个重要组成部分。
它负责将输入的代码按照语法规则进行解析,并构建相应的语法树或抽象语法树。
语法分析的目的是确定代码的结构和规则是否符合语法要求。
在计算机编程中,语法规则由编程语言的定义决定。
不同的编程语言具有不同的语法规则。
例如,C语言要求每条语句以分号结尾,而Python语言使用缩进来表示代码块的层次结构。
语法分析器通常使用上下文无关文法(Context-Free Grammar)来描述语言的语法规则。
上下文无关文法使用产生式(Production)描述非终结符和终结符之间的关系。
例如,在C语言中,一个赋值语句的产生式可以表示为:`expression = expression`。
语法分析的过程通常使用自顶向下或自底向上的方法进行。
在自顶向下的方法中,分析从整个代码出发,根据语法规则逐步向下分解,直到最小的语法单元。
而在自底向上的方法中,分析是从最小的语法单元开始,根据语法规则逐步向上合并,直到整个代码。
通过语法分析,编译器或解释器可以检测代码中的语法错误,并及时提示程序员。
这有助于提高代码的可读性和可维护性。
二、语义分析语义分析是在语法分析的基础上,对代码的意义和行为进行分析。
它关注代码中的语义错误、冲突和逻辑问题。
语义分析的目的是确保代码在语法上正确,并具有正确的语义。
语义分析器通常检查以下方面的问题:1. 类型检查:计算机编程语言通常具有静态类型或动态类型的特性。
语义分析器检查代码中的类型声明和操作,以确保类型的一致性。
例如,在Java中,如果一个方法声明为接收整数参数,那么调用该方法时必须传入整数类型的参数。
编程语言的语法与语义分析
编程语言的语法与语义分析编程语言是程序员用来编写计算机程序的一种人造语言。
它具有自己的语法和语义规则,用以描述计算机程序的结构和行为。
在编写程序时,程序员需要通过语法和语义分析来确保程序的正确性和可靠性。
一、语法分析语法分析是编程语言的第一步,它用于检查程序中的语法错误。
语法是一种规则系统,用于定义编程语言中有效语句和表达式的结构。
通过语法分析,程序员可以确定程序是否符合语法规则。
常见的语法分析方法包括上下文无关文法和词法分析。
1. 上下文无关文法上下文无关文法(Context-Free Grammar)是一种形式化的语言描述工具,用于定义编程语言的语法。
它由一组产生式(Production Rules)组成,每个产生式描述了一个语法结构的生成方式。
通过上下文无关文法,程序员可以将程序按照规定的语法结构进行构造。
例如,C语言中的产生式可以定义为"E -> E + T",表示表达式E的生成方式为"E加T"。
2. 词法分析词法分析(Lexical Analysis)是语法分析的一部分,用于将程序源代码划分为一个个的词法单元(Tokens)。
词法单元是编程语言的最小单位,包括关键字、标识符、操作符等。
通过词法分析,程序员可以检查程序中的词法错误,并将其转化为更易于处理的数据结构。
例如,在C语言中,"for(int i=0; i<10; i++)"可以被词法分析为"for"、"("、"int"、"i"、"="、"0"、";"、"i"、"<"、"10"、";"、"i++"、")"等词法单元。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
面向方面编程中必要语义约束的研究1杨剑青,杨宗源,谢瑾奎华东师范大学计算机科学技术系,上海 (200062)E-mail:learwwj@摘要:面向方面编程(AOP)可以很好地解决非功能性关注点(Non-Functional Concern)的封装问题,但是目前的AOP技术过于灵活,甚至会不恰当地破坏原有对象的封装性,以及代码正确性。
本文讨论了在软件设计或者编程实现过程中,对于AOP应该加以适当约束,具体包括常量性质的约束,单件(Singleton)类型的约束等等,在各个不同的具体应用领域中,还可以相应有不同的约束,通过这些约束,AOP才能更好地为软件开发所服务。
关键词:AOP;约束;软件开发;软件工程中图分类号:TP3111.引言面向方面编程(Aspect Oriented Programming,以下称为AOP)可以用来解决软件开发中,对于系统级关注点实现的代码纠缠和难以管理等问题。
但是对其任意使用可能在某些情况下,造成对原有面向对象模型语义的破坏,本文提出了在现有的AOP实现机制上,添加适当的约束来解决这一问题,并且刻画出了所提出约束的设计模式。
2.AOP简介面向对象方法已经在软件工业界取得了巨大的成功。
面向对象方法通过把不同大小级别的功能单元封装在类中,来提高软件的开发效率。
但是,对于一些系统级别的,非功能性的关注点(Non-Functional Concern),比如操作同步,资源的互斥,数据加密解密,数据的压缩解压缩等等,面向对象技术的解决方案却会引入一系列的问题,比如代码纠缠(Code Tangling)和难以管理[2]。
所谓代码纠缠,就是指相同的代码反复地出现在不同的类中,而没有办法使用面向对象方法(比如继承)加以消除;而难以管理主要指的是面向对象技术只提供了封装功能关注点的单元,而没有提供封装横切关注点(Cross-Cutting Concern)的单元,导致这些关注点的修改十分困难。
AOP的方法对于解决上述问题能够提供极大的帮助,使用AOP的方法,开发人员可以显式地捕捉横切关注点的结构,将横切关注点封装为一个单独的实体,并且可以便捷地修改实现横切关注点的代码,下面结合最常使用的AOP实现,AspectJ (/ajdt)来简单介绍一下AOP中的一些重要概念[3]:a. Join Point是在程序的执行流程中具有良好定义的点,AspectJ提供几种不同类型的Join Point,方法调用Join Point,域设置Join Point以及异常抛出Join Point。
比如calls(void Rectangle.setWidth(float))定义了所有在Rectangle对象上,对方法setWidth的调用。
b. Pointcut是Join Point的集合,比如Pointcut setArea() : calls (void Rectangle.setWidth(float)) || calls(void Rectangle.setLength(float)),定义了所有在Rectangle对象上,对方法setWidth和setLength的调用。
c. Advice是当程序执行到Pointcut时所运行的代码。
Before Advice在程序运行到Join Point,计算执行之前运行;After Advice在Joint Point结束,计算执行之后运行;Around Advice 在程序执行到Join Point时开始运行,并且对该Join Point的计算是否确实运行有显式的控制。
1本课题得到高等学校博士学科点专项科研基金(项目编号:20060269002)的资助。
d. Introduction 是一种可以向类中添加新的域,以及改变类的继承关系的机制,但和Advice 有所不同,Introduction 是在编译时静态实现的。
上文介绍的一些概念,就是在使用AspectJ 进行AOP 开发时经常使用到的一些编程实体,下面就结合一个具体的实例,提出无约束地使用这些元素所带来的问题。
3. 无约束AOP 引起的问题3.1问题描述任意地使用AOP 中提供的各种机制,有可能会引起一系列的副作用。
比如没有约束地使用AOP 会严重地破坏原有面向对象模型的封装性,改变原有对象中域的值以及方法的执行流程,从而导致了原有对象的语义发生变化。
下面所要给出的一个实例就是通过使用AOP 来改变了原有对象的行为,从而使程序中出现了难以发现的错误。
3.2实例实例中的原有类(即实现功能关注点的类)是一个结构十分简单的类Rectangle ,其中只有两个分别代表长和宽的域width 和length ,以及这两个域的setter 和getter 方法,实现功能性关注点的方法是getCircumference 和getArea 分别计算类Rectangle 的周长和面积。
Rectangle 的类图如下所示:图1 Rectangle 的类图BadAspectDemo 中只有一个main 方法,简单地构造一个Rectangle 类的对象,然后设置width 和length 的值,最后调用它的getCircumference 方法和getArea 方法,以及输出计算结果。
具体代码如下所示:public class BadAspectDemo {public static void main(String[] args) {Rectangle r = new Rectangle();r.setLength(4);r.setWidth(5);System.out.println(r.getCircumference());System.out.println(r.getArea());}}在没有使用AOP 技术的情况下,这段程序的输出结果一目了然,必定是18.0以及20.0,但是在采用了AOP 对Rectangle 中的一些方法进行了增强以后,输出结果就会发生十分微妙的变化。
为了对Rectangle类,进行增强,本实例中采用的环境是ajdt 1.5开发包以及eclipse 3.3,在给项目加上AspectJ特性以后,再重新运行BadAspectDemo,输出结果就会变成36.0以及20.0,面积的计算结果仍然正确,但是周长的结果变成了原来的2倍,可见,Rectangle的getCircumference方法的逻辑或者语义已经被改变,Rectangle类的封装性已经被破坏了,具体破坏封装性的Aspect代码如下所示:public aspect BadRectangleAspect {pointcut calculateCircumference(Rectangle r):Rectangle.getCircumference())&&target(r);call(floatr):calculateCircumference(r){before(RectangledoubleSizeAndLength(r);}after(Rectangle r):calculateCircumference(r){halfSizeAndLength(r);}private void doubleSizeAndLength(Rectangle r) {2);r.setLength(r.getLength()*2);*r.setWidth(r.getWidth()}private void halfSizeAndLength(Rectangle r) {r.setLength(r.getLength()2);//2);r.setWidth(r.getWidth()}}BadRectangleAspect这个Aspect对Rectangle类中的getCircumference方法作了拦截,在调用这个方法之前,执行了BadRectangleAspect中的doubleSizeAndLength私有方法,将Rectangle的width和length域的值设置为原来的2倍,所以在执行getCircumference方法计算周长时,程序使用的width和length值是原来的2倍,因此计算结果也就变为了正确值的2倍;而在调用getCircumference方法之后,BadRectangleAspect又去执行了私有方法halfSizeAndLength,将Rectangle的width和length域设置为当前值的1/2。
所以在执行getCircumference方法后,width和length又变回了正确的值。
getArea方法计算的Rectangle 面积仍然是正确的,程序就输出了变成了令人迷惑的结果。
上面这个实例中,Rectangle采用的是面向对象技术进行功能性关注点的建模,其代码都是正确无误的,但是BadRectangleAspect对Rectangle类,进行了增强以后,在不修改Rectangle类代码的前提下,反而扭曲了Rectangle类的行为,破坏了原有的封装性,并且这种情况的破坏是没有任何收益的。
而且通过这种方式引起的软件错误往往更难定位,因为绝大多数的开发人员都会将注意力集中在实现功能性关注点的Rectangle类中,而容易忽略实现非功能性关注点的Aspect中的代码。
综上所述,AOP虽然是一种解决横切关注点的利器,但是如果对其的使用过于的随意,则将会导致极其不理想,甚至是危险的结果,因此,下面一个部分就着重提出了几种Aspect 的约束[5],并且给出了实现这些约束的设计模式,通过使用这些设计模式来实现约束,可以让AOP更好地为开发人员服务。
4.对AOP施加适当的约束4.1 Constant型的Aspect在上面这个实例中,就是由于BadRectangleAspect中的Before Advice对Rectangle的域,进行了写操作,从而改变了getCircumference的行为以及正确性。
因此,对于AOP的应用必须要加以约束。
在设计AOP程序或者实现AOP机制时,应该可以通过在Aspect上定义关键字的方法来为AOP添加约束,虽然现在的AspectJ还没有这种机制,但是后续的版本应该要提供这种特性。
首先Aspect应该可以有Constant型的约束,这种Aspect的功能只是增加原有类中没有的功能,而不是改变它们,首先Constant型的Aspect中不可以有Around类型的Advice,因为Around类型的Advice实际上是重写了被拦截的方法,有可能改变被拦截方法,也就是原有类中方法的逻辑;其次,Constant型的Aspect不能调用任何修改运行时信息或者原有类本身数据的方法,因为这样会导致不可测的运行结果,而且引起的错误难以发现。