7.5.14 后置条件中的旧值
如7.3.4 前置和后置条件所述,OCL可以规定UML中操作和行为的前置和后置条件。在后置条件中,表达式可以引用对象的任何特征在两个不同时刻的值:
- 该操作或行为在执行之前特征的值
- 该操作或行为在执行完毕后特征的值
后置条件中操作调用或属性导航的值是该操作完成时的值。为了引用操作开始之前特征的值,建模者必须在属性名之后加‘@pre’关键字:
context Person::birthdayHappens()
post: age = age@pre + 1
属性age引用了执行该操作的Person实例上的该属性。age@pre引用了执行该操作的Person对象在该操作执行开始时属性age的值。
对于操作调用的情况,‘@pre’附加到操作名后,在参数之前。
context Company::hireEmployee(p: Person)
post: employees = employees@pre->including(p) and
stockprice() = stockprice@pre() + 10
当特征的旧值(pre-value)是一个对象时,这个对象上的进一步属性访问时该对象的新值(操作完成时)。因此:
[email protected] --取对象a的b属性的旧值,假设为x,然后取x上c的新值
[email protected]@pre --去对象a的b属性的旧值,假设为x,然后取x上c的旧值
‘@pre’后缀只允许用在OCL后置条件表达式中,而且必须是在模型分类符的特征调用上。访问一个在操作中已经被销毁的对象的当前属性将产生null。同样,访问一个在操作中已经被销毁的对象的旧值也产生一个null。