#constraints #uml #ocl
#ограничения #uml #ocl
Вопрос:
У меня есть 2 класса в UML, и теперь нужно создать ограничение для этой части — attribute1: String находится в class1, а attribute2: int — в class2, связь между классами является обобщением — может быть изменена на association.
Мне нужно как-то это написать
if attribute1 contains 'First year',
then attribute2 have multiplicity [1..2],
else if attribute1 contains 'Second year',
then attribute2 have multiplicity [3..4], and so on.
Я знаю все значения, которые может принимать attribute1, определенные как перечисление (12 значений, но только 4, если необходимы условия, потому что у каждого 3 одинаковая часть текста в начале). Я создаю UML в enterprise architect, если это важно. Вот изображение классов
или
Комментарии:
1. У меня возникли проблемы с разбором вашего английского. Я особенно не могу разобрать «par (attribute1: String находится в class1, а attribute2: int — в class2, связь между классами является обобщением — может быть изменена на ассоциацию)».
2. Пожалуйста, отформатируйте свой вопрос и выделите части, которые должны быть кодом.
3. Я хотел бы, чтобы вы предложили нарисовать ту часть диаграммы, в которой вы уверены, а затем перефразировать остальное. Это может сделать его более понятным.
4. Теперь намного понятнее. Ответ ниже.
Ответ №1:
Существует несколько способов моделирования этого
- Наложите ограничение на ассоциацию
Это самое простое и очевидное решение. Поместите ограничение, описывающее логику в символ примечания в фигурных скобках {}
, и привяжите его к ассоциации. Ограничение может иметь любую форму, например, естественный язык или формальный язык, такой как OCL Обратите внимание, что в таком случае ваша множественность для ограничения будет варьироваться от 1 до достижимого максимума для всех возможных значений каждого значения перечисления.
Недостатком является то, что информация является чисто текстовой и может быть трудной для понимания.
- Создайте подклассы (решение, ранее предложенное Джимом Л. в его ответе)
Подкласс может переопределять атрибут, например, изменяя множественность. На родительском уровне класс будет иметь множественность с максимально достижимым максимумом, в то время как каждый подкласс, зависящий от конкретного года, будет иметь множественность, соответствующую требованиям для этого года. Вам также в любом случае необходимо смоделировать ограничение для каждого из подклассов, определяющее, какие значения перечисления доступны для этого конкретного подкласса.
Недостатком этого решения является то, что когда у вас есть возможность перейти с одного year на другой, это будет не простое изменение атрибута, а скорее полная замена одного объекта с подтипом на другой с другим подклассом в качестве типа.
- Множественность как переменные
Идея заключается в том, что вы обрабатываете логику сопоставления между возможными значениями и связанными кратностями, и при ассоциации вы представляете множественность, используя атрибуты этого сопоставления, а не конкретные числа.
Этот подход создает множество возможных подробных решений, но я группирую их вместе, поскольку все они следуют одному и тому же подходу с небольшими различиями в том, как обрабатывать значения множественности. Я приведу только один подробный пример решения (подробнее, если кто-то спросит)
Одним из решений здесь является использование типа данных, а не перечисления. Тип данных будет иметь в своей структуре имя (которое все еще может использовать перечисление в качестве основы) и два значения (нижнее и верхнее значения кратности). Тогда ваш attribute1 будет иметь этот тип данных, и ваши множества будут ссылаться на attribute1 и его конкретные свойства. Ваш тип даты может, например, содержать имя свойства, minM и maxM, и тогда для атрибута у вас будет множественность minM..maxM
.
Конечно, вам нужно добавить ограничения, гарантирующие это {0<=minM<=maxM}
в отношении типа данных, и неплохо указать набор возможных значений для типа данных где-нибудь в документации, например, в виде таблицы.
Недостатком этого решения является то, что взаимосвязь между конкретным значением и его ограничениями на множественность не отображается непосредственно на диаграмме. Однако это уравновешивается гораздо большей гибкостью решения.
- Множественность как формула
Если существует простая логика между, например, годом и количеством связанных элементов, которые могут быть записаны в виде формулы, такая формула также может использоваться во множестве. Это особенно полезно, если вы разделяете свое перечисление на два отдельных числовых атрибута (эй, у вас есть класс, при выборе вы все равно можете использовать перечисление, просто сопоставьте его внутри класса!). Я сделаю это предположение в своем примере.
Допустим, что вместо attribute1 у вас есть два атрибута: yearNo и yearType. Более того, допустим, что в первый год у вас может быть 1 или 2 объекта class2 в вашем объекте класса 1, на второй год у вас будет 3 или 4 и так далее. В общем случае у вас в n-м году от 2n до 1-2 n элементов, поэтому ваша множественность будет 2*yearType-1..2*yearType
Недостатком этого подхода является то, что это возможно, только если за ним стоит формула.
Дополнительные замечания:
- Я считаю, что упомянутое в решении 4 разделение вашего атрибута1 является хорошим решением, независимо от того, какое решение вы выберете.
- Обобщение не имеет множественности. Этот тип связи показывает, что объект подкласса является объектом того же типа, что и объект супертипа. На мой взгляд, вам не следует использовать этот тип отношений здесь. Скорее всего, вы имели в виду общую / составную агрегацию, а не обобщение (но у него другая стрелка — ромб, а не треугольник. Конечно, это можно вполне безопасно заменить ассоциацией.
- Не используйте ассоциацию с перечислением (в общем случае с типом данных). Если вы помещаете атрибут в качестве текстового атрибута в класс, свяжите его с типом через зависимость (пунктирная линия с открытой стрелкой). Для перечисления (типа данных в целом) это единственная связь. Для обычных классов в качестве типа атрибута вы можете заменить встроенный атрибут ассоциацией (графически показанной) (с именем роли, чтобы сделать его полностью заменяемым).
Комментарии:
1. Можно было бы надеяться, что модель отражает некоторую стабильную проблемную область. Некоторые идеи в этом ответе представляют то, что я бы назвал «метапрограммированием» или «программированием на основе данных», которое является гибким, но добавляет сложности и не отражает проблемную область.
Ответ №2:
Я думаю, вам нужно заменить перечисление явными подклассами в Class2
. Затем каждый класс может переопределить множественность для attribute2
. Хотя вы могли бы выразить это в OCL о перечислении, мало кто это понял бы.
Комментарии:
1. Придется подробнее изучить это, все еще много узнаю об UML, спасибо
2. Вы можете поблагодарить меня кнопками «принять» и «проголосовать». 😊