【问题标题】:ForAll and filter with Iterator in OCL在 OCL 中使用迭代器进行 ForAll 和过滤
【发布时间】:2015-02-20 09:49:57
【问题描述】:

我需要在 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

请告诉我是对是错。

【问题讨论】:

  • 呵呵。这是我第一眼看到的。您应该在问题中添加 OCL :-)
  • 我不是 OCL 专家,但对我来说似乎没问题。请问您在哪种情况下需要它?
  • 我正在准备 OCL 测试,这是示例问题之一。
  • 这是 100% 学术代码 :)。
  • 我是这么认为的。在这种情况下,你的老师最终会纠正你;-) 但正如所说:看起来不错。

标签: uml ocl


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2018-09-27
    • 2022-01-06
    • 1970-01-01
    • 2017-07-18
    • 1970-01-01
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多