java不变式_18.1 约束和不变式

第18章 验证架构

到目前为止还没有解决的一个问题是,如何定义EMF中建模对象的有效状态的组成。在本章中将会介绍,您可以在模型中声明当对类的实例执行验证时验证的约束和不变式。另外,本章将详细讨论这些新元素如何影响EMF生成的代码,以及如何从代码或者通过生成的编辑器调用验证。

18.1  约束和不变式

EMF的约束和不变式的概念受这些概念在UML中的定义启发。在UML中,约束是必须在某个时刻有效的一条语句,而不变式是一条总是应该为真的断言。例如,方法的前置条件是一个约束,因为它是一种限制,必须在方法执行以前得到满足。另一方面,比如说,一个不变式可能表述不管在什么时候查询,代表人的年龄的属性的值必须不小于0。

在EMF中,类或数据类型可以包含一个代表一个或多个约束的Ecore批注 。当调用验证时,每个约束对应着关于该分类符的实例的状态的断言。使用PrimerPO示例,假设想要定义类Item的如下两个约束:

订购的物品的数量必须大于零。

物品的运送日期必须晚于订单日期。

如果使用批注Java定义模型,那么可以将下面的批注添加到Item接口的开头部分(批注必须写在单独一行中):/**

* @modelannotation="http://www.eclipse.org/emf/2002

/Ecore constraints='NonNegativeQuantity ValidShipDate'"

*/

public interface Item

{

...

}

如果模型被表示为XML schema ,可以按照如下方式声明约束:

ecore:constraints="NonNegativeQuantity ValidShipDate">

...

注意constraints是Ecore名称空间("http://www.eclipse.org/emf/2002/Ecore")中定义的属性之一,这些属性用于表示Ecore模型元素(否则无法在XML SCHEMA 中直接表达这些元素)。

在Rose类图中,可以在Class Specification对话框的Ecore页面中设置constraints字段,如图18-1所示 。

69b85e650f4c8d8b796f9f6ffb7cc311.png

图18-1  UML中建模的约束

虽然在指定约束方面批注机制十分方便,但是对于不变式来说它还显得不够充分。不变式是为某个对象定义的,它是关于这个对象的一条强语句,由于这个原因,任何操作该对象的代码应该很容易访问它。EMF将不变式表示为类的操作。不变式操作有一些特殊属性:它的类型是EBoolean,以指出是否满足不变式,并且它有两个参数,其类型分别为EDiagnosticChain和EMap 。验证架构使用前者来累积约束和不变式验证的结果,而后者则缓存需要在验证过程的各个步骤访问的信息。将在下一节更详细地讨论这些类型。注意,因为在Ecore内的数据类型上无法定义操作,所以也无法在这些数据类型上声明不变式。

回到PrimerPO示例,USAddress的一个可能的不变式可以断言:如果"US"是指定的国家,则state属性不为空。对于定义为批注Java的模型,可以这样编写代码:/**

* @model

*/

public interface USAddress

{

...

/**

* @model

*/

boolean hasUSState(DiagnosticChain diagnostics, Map context);

}

如9.3.7节所述,可以通过特殊的Ecore appinfo批注来使用XML SCHEMA 表示操作。这种机制用于以如下方式声明不变式:

source="http://www.eclipse.org/emf/2002/Ecore">

...

要想使对EBoolean、EDiagnosticChain和EMap的引用解析为期望的Ecore类型,必须首先为Ecore导入模式:

schemaLocation=

"platform:/plugin/org.eclipse.emf.ecore/model/Ecore.xsd"/>

注意使用平台方案URI来标识安装在Eclipse工作台内的插件中的资源。每次需要引用EMF提供的模型时,您都可以使用这种形式的URI。

当使用这种模式创建模型时,需要在EMF项目向导的Package Selection页面解析Ecore依赖性。这是从Referenced generator models表中选择Ecore(external - org.eclipse. emf. ecore)完成的。

在UML中,hasUSState不变式被模型化为具有<>构造型(stereotype) 的操作,如图18-2所示。

14d6f22ae5a12b300b778506c0a5d37c.png

图18-2  UML中建模的不变式不管您起初选择如何表达模型,总是可以直接向模型添加约束和不变式。图18-3显示了样本Ecore编辑器中打开的模型,其中约束和不变式分别被直接表示为操作和批注。

ba81d9a5b4314a85d61e3e80bddf2d80.png

图18-3  PrimerPO Ecore模型中的不变式和约束

【责任编辑:云霞 TEL:(010)68476606】

点赞 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值