0

OCLの実装を持つ Delphi には Bold を使用します。OCL は、リストのフィルタリングなどに適しています。しかし、リンクされたリストをトラバースするための適切で一般的な方法は見つかりませんでした。

class があるとし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 に答える