Как указать уникальный идентификатор класса - PullRequest
1 голос
/ 03 октября 2019

Я должен указать для класса Employee, что каждый сотрудник может быть четко идентифицирован по его личному номеру. Я не знаю, считаю ли я слишком сложным, потому что у меня нет настоящей идеи.

Атрибуты: final int personelNumber ...

Ответы [ 3 ]

3 голосов
/ 04 октября 2019

Вам даже не нужно ограничение OCL, чтобы выразить это в UML. В метаклассе Property есть свойство isID, которое обеспечивает это:

Из спецификации UML 2.5 § 9.5.3 (стр. 111)

Свойство может быть помечено черезсвойство isID как (часть) идентификатора (если таковой имеется) для классификаторов, членом которых оно является. Интерпретация этого остается открытой, но это может быть сопоставлено с реализациями, такими как первичные ключи для таблиц реляционной базы данных или атрибуты ID в XML. Если несколько свойств помечены как isID (возможно, в обобщающих классификаторах), то именно комбинация кортежей (свойство, значение) будет логически обеспечивать уникальность для любого экземпляра. Следовательно, нет необходимости в какой-либо спецификации порядка, и некоторые значения свойства могут быть пустыми. Если свойство является многозначным, то включаются все значения.

Обозначение этого свойства аналогично обозначению других ограничений, использующих {id} после имени и типа атрибута

enter image description here

2 голосов
/ 03 октября 2019

Вы не предоставляете свою метамодель, и ясно, что каждому Сотруднику их personelNumber однозначен и поэтому обязательно уникален. Предположительно, в какой-то области, например, в Компании, personelNumber должен быть уникальным, поэтому ответом часто бывает что-то вроде.

context Company
inv UniquePersonelNumber: employees->isUnique(personelNumber)
0 голосов
/ 04 октября 2019

Два альтернативных выражения OCL можно найти в следующем вопросе: Почему allInstance не для isUnique?

В вашем случае это будет:

context Employee
inv personalNumberUnique : Employee.allInstances() -> isUnique(personalNumber)
...