
3.3.2 约束规则(Constraint)
约束规则是用来约束对象或过程的可能结构和行为的规则,即描述对象的关联方式或状态变化的方式的规则。
约束规则指用于支配资源对象的可能结构或业务过程的可能行为的业务规则,即指定资源之间的关联方式、资源或业务过程发生状态变化的可能方式等。约束规则主要用于维护对象的完整性,当创建对象或对象之间的关系发生变化时,控制对象或过程的行为。
根据业务规则的适用对象的不同,约束规则还可以分为结构性、操作/行为和刺激/响应三种类型。
1.结构性规则(Structural Rule)
结构性规则(Structural Rule)主要用于类型和关联,用于指定与结构有关的必须保持为真的条件,通常称为类不变量。结构性规则有助于定义与业务的结构相关的不同术语,主要用于表达静态的业务系统。有些结构性规则可以直接通过类图中的类和关联的多重性定义,而不需要附加新的约束。
例如,图3-6中的客户类(Customer)与证券类(Portfolio)之间的关联关系及其多重性,就已经描述了这两类对象之间应有的结构约束。对这样的情况,就没有必要再附加新的约束了。
对于不能用UML图直接表示的结构性约束,则必须给出明确的指定。例如,对于图3-7中的表达式{refer_to.ocl Type<>Option}为Option类上的关联referto指定了“选项对象(Option)不能引用其他选项(Option)对象”这样的一个约束。

图3-7 选项类上关联的约束
表示这个约束的完整的OCL表达式如下。

如果将规则改成“选项可以引用其他选项,但不能引用自己”,则这个规则就可以表示为下面的OCL表达式。

2.操作或行为约束规则(Operational/Behavioral Constraint)
操作或行为约束规则主要指操作的前置条件和后置条件。它们规定了对象在操作执行之前或执行之后必须满足的条件,限制了状态变更可能发生的方式,以及执行操作的对象如何受到操作的影响。
前置条件表示了操作将正确地执行需要的约束,后置条件保证正确的操作结果。例如,对于图3-5中的订单类(Order),要求其PutOnMarket操作在执行前应处于“created”状态,并且在执行后处于“onMarket”状态。这样的约束也可表示成如下表达式。

实际上,这个规则也可以使用UML状态图描述。例如,图3-8就描述了这个业务规则。图中的两个状态Created和onMarket以及它们之间的迁移共同定义了操作PutOnMarket()的前置条件和后置条件。

图3-8 带有操作或行为规则的状态图
3.刺激或响应约束规则(Stimulus/Response Constraint)
刺激或响应约束规则用于指定业务系统中发生某些事件时应执行的特定操作。由于OCL是一种陈述性的语言,因此不能用于定义动作。更好的方法是,使用带有动作的活动图或状态图来定义这类规则。
在活动图或状态图中,可以使用刺激或操作的事件部分指定UML模型中的守卫条件,而且图中的动作也可以被指定为动作或状态迁移的规格说明。
例如,图3-9所示的活动图中,使用了OCL表达式编写的动作迁移的守卫条件。

图3-9 带有刺激或相应规则的活动图