第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所示 。
图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所示。
图18-2 UML中建模的不变式不管您起初选择如何表达模型,总是可以直接向模型添加约束和不变式。图18-3显示了样本Ecore编辑器中打开的模型,其中约束和不变式分别被直接表示为操作和批注。
图18-3 PrimerPO Ecore模型中的不变式和约束
【责任编辑:云霞 TEL:(010)68476606】
点赞 0