Определение множественности атрибута с ограничением

#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:

Существует несколько способов моделирования этого

  1. Наложите ограничение на ассоциацию

Это самое простое и очевидное решение. Поместите ограничение, описывающее логику в символ примечания в фигурных скобках {} , и привяжите его к ассоциации. Ограничение может иметь любую форму, например, естественный язык или формальный язык, такой как OCL Обратите внимание, что в таком случае ваша множественность для ограничения будет варьироваться от 1 до достижимого максимума для всех возможных значений каждого значения перечисления.

Недостатком является то, что информация является чисто текстовой и может быть трудной для понимания.

  1. Создайте подклассы (решение, ранее предложенное Джимом Л. в его ответе)

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

Недостатком этого решения является то, что когда у вас есть возможность перейти с одного year на другой, это будет не простое изменение атрибута, а скорее полная замена одного объекта с подтипом на другой с другим подклассом в качестве типа.

  1. Множественность как переменные

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

Этот подход создает множество возможных подробных решений, но я группирую их вместе, поскольку все они следуют одному и тому же подходу с небольшими различиями в том, как обрабатывать значения множественности. Я приведу только один подробный пример решения (подробнее, если кто-то спросит)

Одним из решений здесь является использование типа данных, а не перечисления. Тип данных будет иметь в своей структуре имя (которое все еще может использовать перечисление в качестве основы) и два значения (нижнее и верхнее значения кратности). Тогда ваш attribute1 будет иметь этот тип данных, и ваши множества будут ссылаться на attribute1 и его конкретные свойства. Ваш тип даты может, например, содержать имя свойства, minM и maxM, и тогда для атрибута у вас будет множественность minM..maxM .

Конечно, вам нужно добавить ограничения, гарантирующие это {0<=minM<=maxM} в отношении типа данных, и неплохо указать набор возможных значений для типа данных где-нибудь в документации, например, в виде таблицы.

Недостатком этого решения является то, что взаимосвязь между конкретным значением и его ограничениями на множественность не отображается непосредственно на диаграмме. Однако это уравновешивается гораздо большей гибкостью решения.

  1. Множественность как формула

Если существует простая логика между, например, годом и количеством связанных элементов, которые могут быть записаны в виде формулы, такая формула также может использоваться во множестве. Это особенно полезно, если вы разделяете свое перечисление на два отдельных числовых атрибута (эй, у вас есть класс, при выборе вы все равно можете использовать перечисление, просто сопоставьте его внутри класса!). Я сделаю это предположение в своем примере.

Допустим, что вместо 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. Вы можете поблагодарить меня кнопками «принять» и «проголосовать». 😊