0

我将 Bold 用于具有OCL实现的 Delphi 。OCL 擅长过滤列表等。但是我还没有找到一个好的、通用的遍历链表的方法。

假设我有一堂课PlanMission。它包含一个PlanMission.previous指向自身的链接。它还有一个布尔属性isDummy

我想遍历一个列表,PlanMissions直到我有一个isDummy.

我可以

if isdummy then
  self
else if previous->notEmpty and previous.isdummy then
  previous
else if previous.previous->notEmpty and previous.previous.isdummy then
  previous.previous
else
  nil
endif
endif
endif

我真正想要的是这样的:

traverseList(previous, isDummy)

traverseList不存在,但它应该有 2 个参数。

  • previous: 要关注的链接
  • isDummy: 一个布尔条件,所以我知道什么时候停止

如何实现?

编辑说明 我不想要任何 Delphi 代码。我想要OCL中的代码。那些使用Bold的人知道我的意思。OCL 是一种具有查询对象、属性等的查询语言。它没有副作用,所以它是只读的。可以在此处找到 OCL 简介。

4

1 回答 1

1

您需要计算previous关系的有序传递闭包。(self、self.previous、self.previous.previous 等)

在 OCL 2.3.1 中是self->asOrderedSet()->closure(previous)

那么您可以通过以下方式提取第一个虚拟PlanMission对象(如果没有,则为 null):

let c:Set(PlanMission) = 
  self->asOrderedSet()->closure(previous)->select(x|x.isDummy) in
  if c->isEmpty() then null else select(x|x.isDummy)->first()

在第 11.9 节OCL 2.3.1的预定义迭代器表达式的映射规则中有一个定义,如果您的工具支持旧版本的 OCL,您可以使用它。closureiterate

于 2013-12-18T08:56:43.857 回答