7.7.3 示例
本小节展示使用OCL消息表达式的一个示例。
问题背景
假设我们构造了一个组件,它接收任意形式的输入并将其转换为“无用的东西”(即对它进行加密)。组件GarbageCan使用一个接口UsefulInformationProvider,后者必须由用户实现以提供组件的输入。GarbaseCan的操作getNextPieceOfGarbage可以用来读取加密的数据。图7.6展示了该组件的类图。注意操作都没有被标注为只读的。
图7.6 OclMessageExample
当出售该组件时,我们不想给我们的客户源码。然而,我们想尽可能准确的规定该组件的行为。因此,举个例子,我们想规定getNextPieceOfGarbage做什么。注意,我们不能写:
context GarbageCan::getNextPieceOfGarbage(): Integer
post: result= (datasource.getNextPieceOfData() * .7683425 + 10000)/20 + 3
因为UsefulInformationProvider::getNextPieceOfData()不是只读的(例如,它可能对一些内部的指针做递增操作从而可以返回调用所需的下一条数据)。尽管如此,我们还是想对加密信息是如何从原始数据衍生的说点啥(规定些东西)。
解决方案
为了解决这个问题,我们可以使用一个OclMessage来代表对getNextPieceOfData的调用。这使得我们可以对结果进行检查。注意我们需要确保在访问结果之前该调用已经返回。
context GarbageCan::getNextPieceOfGarbage(): Integer
post: let message : OclMessage = datasource^^getNextPieceOfData->first() in
message.hasReturned() and
result = (message.result() * .7683425 + 10000)/20 + 3