0

我需要在 OCL 中执行 2 个可用于收集的函数:forAll 和 filter。诀窍是我只能使用iterator

这就是我带来的:

context Collection(T)::forAll(expr) : Boolean
    body : self -> iterate(t: T, acc: Boolean = true | expr(t) and acc)

context Collection(T)::filter(expr) : Collection(T)
    body : self -> iterate(t: T, acc: Collection(T) = {} | if expr(t) then acc->include(t) else acc endif

请告诉我这是对还是错。

4

1 回答 1

0

您的定义forAll很好,实际上它与OCL 版本 2.4的第 11.9 节(预定义迭代器表达式的映射规则)中给出的相同。

filter操作等效于selectOCL 定义的操作,其术语与您所做的几乎相同,但有以下区别:

  • 它应该acc->including(t)代替acc->include(t).
  • Collection是一个抽象类型,那么我想你不能写acc:Collection(T) = {},因为实际的类型acc是未定义的。而不是你可以使用Bag(T) = Bag{}(但在这种情况下Set(T)::filter(expr)会返回 aBag而不是 a Set)。

OCL 规范通过select为每个集合类型(然后我们有Set(T)::select(body):Set(T),Sequence(T)::select(body):Sequence(T)等)分别定义不同的累加器类型来解决这个问题。

于 2015-02-20T01:49:57.570 回答