OCL все экземпляры ()

В свое время я немного изучил OCL и столкнулся со следующим вопросом, на который я не нашел правильного ответа. Я просмотрел документацию по OCL 2.4 Spec, но не нашел ничего похожего на чтобы ответить на мой вопрос:

В основном примеры allInstances() используются следующим образом:

контекст Person inv: Person.allInstances().forAll(p : Person | p.employeeNumber ‹> self.employeeNumber)

где Person — это класс с атрибутом employeeNumber.

Разрешено ли также использовать allInstances() для себя и других атрибутов, и будет ли он иметь то же самое, например ‹Type›.allInstances()?


ocl
person user2680083    schedule 09.05.2018    source источник


Ответы (1)


Вы попадаете в одну из самых неясных областей спецификации OCL. allInstances() — это операция типа, поэтому ее можно считать статической, но ключевое слово static было добавлено в OCL 2.2 без какой-либо четкой семантики или примеров.

Реализация Eclipse на основе OCL Pivot является прототипом разрешения неясностей. OclElement::allInstances() моделируется как статическая операция в /org.eclipse.ocl.pivot/model/OCL-2.5.oclstdlib, поэтому источник должен быть типом.

Если вы вызываете self.allInstances(), вы получаете «Требуется значение« Класс », а не« Объект »».

Если вы вызовете self.oclType().allInstances(), вы получите нечто более интересное.

NB. реализация oclType() для поддержки полного отражения является еще одним разъяснением спецификации.

Если вам нужна переносимость между реализациями OCL, придерживайтесь чего-то вроде Person.allInstances()->isUnique(employeeNumber).

person Ed Willink    schedule 09.05.2018
comment
Не уверен, правильно ли я понимаю, eclipse не разрешает self.allInstances(). NB означает NetBeans? а это позволяет? - person user2680083; 16.05.2018
comment
(разделить по длине) Когда я смотрю документацию по 7.5.10, становится ясно, что статические функции из модели можно использовать с помощью оператора ::. Что сбивает с толку, так это то, что это операция, применимая к экземплярам метакласса классификатора. Я не знаю, что такое метакласс в OCL, и пока не нашел его. Мои мысли до сих пор исходили из точки зрения «Больше c» и «Варианты». Объекты являются экземплярами класса, и пока я понимаю, что это метакласс. - person user2680083; 16.05.2018
comment
NB — это Нота Бене. - person Ed Willink; 16.05.2018