2013-11-26 2 views
0

Я использую Жирный для Delphi, который имеет реализацию 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? Как Odes OCL вступает в игру? – jpfollenius

+0

@jpfollenius Он спрашивает: tez codez plz ?? – EProgrammerNotFound

+0

Отсутствует код delphi, это тривиально в Delphi. OCL очень отличается от Delphi. Он часто используется в modeldriven развития. Полужирный для Delphi имеет одну реализацию 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 Правило отображения для Предопределенных Iterator выражений из OCL 2.3.1 существует определение closure в терминах iterate, которые вы можете использовать, если ваш инструмент поддерживает старую версию O CL.

+0

Интересно, спасибо за ссылку –

 Смежные вопросы

  • Нет связанных вопросов^_^