ocl ограничение с рекурсивным классом - PullRequest
0 голосов
/ 12 ноября 2018

Для небольшого контекста: Class может иметь другие Class как Requirement, которые должен быть взят студентом. Class берется Student через ClassGroup, который можно упорядочить по времени с его атрибутом sessionYear.

enter image description here

Я хочу поставить неизменное ограничение OCL, которое проверит, были ли для sessionYear a ClassGroup его Class Requierement уже приняты до этого sessionYear.

другими словами: sessionYear для Requirement <<code>sessionYear для Class

Я попробовал довольно много вариантов, и моя ближайшая попытка была такая:

context Etudiant inv C6: if ClassTaken->notEmpty then classTaken->forAll(ct|ct.class.Requirement.OfferedGroup->collect(sessionYear)->forAll(sy| sy < cs.sessionYear)) else true endif

Но проблема в том, что в forAll(sy| sy->sy < cs.sessionYear), sy не будет Student обязательным ClassTaken для ClassGroup, а скорее как Bag со всеми экземплярами OfferedGroup, которые Requirement за это.

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Я закончил тем, что сделал что-то вроде этого:

context Student
 inv C6: inscription->forAll(insc|ClassTaken.class.Requirement->forAll(prer|inscription->exists(preIns|preIns.ClassTaken.class = prer 
 and if preIns.ClassTaken = insc.ClassTaken then true
  else preIns.ClassTaken.sessionYear < insc.ClassTaken.sessionYear endif)))
0 голосов
/ 12 ноября 2018

Попытка использовать несколько ограничений - это хакерство, которое не всегда приводит к удовлетворительному результату за разумный период времени.

OCL - формально читаемый язык с умеренной читаемостью.

Как только вы выразитеЯсно, что намерение вашего ограничения на английском (или французском или ...) языке вы обнаружите, что его можно относительно легко транслитерировать в OCL.

Думайте / дизайн не взламывайте.

...