2013-11-26 24 views
0

我使用粗體的德爾福實施OCL。 OCL善於過濾列表等,但我還沒有找到一種遍歷鏈表的好方法。關注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簡介here.

+0

我不明白。你想在Delphi中做到這一點? OCL如何發揮作用? – jpfollenius

+0

@jpfollenius他問:teh codez plz ?? – EProgrammerNotFound

+0

沒有delphi代碼,在Delphi中很平凡。 OCL與Delphi非常不同。它經常用於模式驅動的開發。德爾福的Bold實現了OCL的一個實現。 –

回答

1

您需要計算previous關係的有序傳遞閉包。 (個體,self.previous,self.previous.previous等)

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

那麼可提取第一虛設PlanMission(或空如果都沒有)由:

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存在的iterate方面具有的closure定義,如果你的工具支持的O舊版本,您可以使用CL。

+0

有趣,感謝您的鏈接 –