Как моделировать взаимоисключающие атрибуты в UML? - PullRequest
0 голосов
/ 12 ноября 2009

Я работаю над моделью анализа в UML, и я немного застрял при попытке представить ограничение на пару атрибутов в диаграмме классов. В следующем классе:

+-----------+
| SomeClass |
+-----------+
| isFoo     |
| isBar     |
| isBaz     |
| isQuux    |
+-----------+

все перечисленные атрибуты являются логическими типами, а последние два, isBaz и isQuux, являются взаимоисключающими. Как мне это указать? Я бы предпочел не использовать специальные заметки - больше беспорядка.

Все, что я могу найти об ограничениях в UML, похоже, применяет их к ассоциациям , а не к атрибутам. Я мог бы разбить атрибуты на связанный класс, но это простые булевы типы, поэтому что-то вроде этого выглядит как избыточное:

+-----------+
| SomeClass |
+-----------+ 0..1   isBaz   1 +-------------------+
| isFoo     |------------------| ThereCanBeOnlyOne |
| isBar     |      |           +-------------------+
|           |      |{NAND}     | isBaz             |
|           |------------------| isQuux            |
+-----------+        isQuux    +-------------------+

Каков «правильный» способ моделирования взаимоисключающих атрибутов в UML?

Ответы [ 2 ]

1 голос
/ 14 ноября 2009

Есть только два варианта: смоделировать атрибуты как ассоциации с логическим типом данных или использовать ограничение OCL.

Упрощенное и исправленное (в OCL значение равно только одному «=») может быть: context SomeClassinv not isBaz = isQuux

Кстати, я не уверен насчет точного значения для вас понятия «взаимоисключающий». Обычно это подразумевает XOR (предопределенное ограничение на ассоциации в стандарте), но затем вы используете NAND. Возможно ли в вашей модели, что оба атрибута имеют ложное значение? (Я предполагаю, что это невозможно в моем ограничении OCL)

1 голос
/ 12 ноября 2009

Я хотел бы изучить использование Object Constraint Language для его описания.

Я никогда не использовал его после пары лекций, но я уверен, что это то, что вам нужно.

Примерно так может выражаться то состояние, которое вы хотите:

{context SomeClass
inv isBaz==True implies isQuux==False
inv isQuux==True implies isBaz==False}

Эта презентация может дать вам хорошую отправную точку.

...