Почему я не могу подключить объект (экземпляр класса) к определенному атрибуту другого объекта (экземпляр класса) в Enterprise Architect? - PullRequest
0 голосов
/ 05 июня 2018

У меня есть вопрос относительно связывания элементов с атрибутами:

Вопрос: Почему я не могу подключить объект (экземпляр класса) к определенному атрибуту другого объекта (экземпляр класса)в Enterprise Architect?

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

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

enter image description here

Конечный результат будет выглядеть следующим образом, где у меня есть класс Store, соединяющийся через два атрибута Manager и Deputy с классом Person:

enter image description here

Оттуда я могу выбрать фактический атрибут для ссылки:

enter image description here

Я также пометил атрибуты containment как By Reference, чтобы указать, что значение атрибутов не должно быть скалярным или простым значением (отображается как звездочка рядом с атрибутом):

enter image description here

Но как только я создаю экземпляры классов, я не могу однозначно связать Person с соответствующими атрибутами экземпляра Store:

enter image description here

Это потому, что Link to Element Feature не позволяет мне выбрать attribute.Даже когда я добавляю дополнительный атрибут к экземпляру Store1 (test в моем примере), я не могу выбрать этот атрибут из списка атрибутов.Так что не ясно, какой из двух Person экземпляров на самом деле является Manager и Deputy.

enter image description here

Есть ли объяснение, почему это невозможно?Это ошибка?Как другие пытаются смоделировать такие отношения?

Спасибо за ваш совет!С уважением, Рональд

Ответы [ 3 ]

0 голосов
/ 07 июня 2018

Основываясь на подсказке @Thomas, я понял, что могу переопределить атрибуты в экземпляре объекта, чтобы иметь возможность соединить их с другим экземпляром объекта.

С помощью приведенных ниже строк сценария я теперь легко могувоссоздать все атрибуты в экземпляре объекта:

$objectId = '{F4DB0F04-18D4-4acb-BA1D-FF55813D7559}'

$object = $ea.GetElementByGuid($objectId);

$classifier = $ea.GetElementById($object.ClassifierID);

$attrsByRef = $classifier.Attributes |? Containment -eq 'By Reference'

$attrsByRef | Select Name, AttributeGuid

Name    AttributeGUID                         
----    -------------                         
Manager {614E5483-2E06-4070-AFB7-B4EDB4A981A7}
Deputy  {82403A08-5E2A-4e68-B39A-6220C889C6E9}

foreach($attr in $attrsByRef) 
{ 
    $objattr = $object.Attributes.AddNew($attr.Name, $attr.Type); 
    $objattr.ClassifierID = $attr.ClassifierID; 
    $objattr.Update(); 
}

Затем я могу использовать стандарт link to element feature из пользовательского интерфейса или через StyleEx из API для подключения экземпляров Person с правильным атрибутом:

Object with Attributes

Теперь в браузере проекта я вижу атрибуты объекта:

Project Browser View

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

0 голосов
/ 11 июня 2018

Вместо привязки соединителей к фактическому Attribute экземпляра (который должен быть создан вручную, как указано в другой ответ ), мы также можем использовать аннотированный соединитель, где текст соединителяусловно обозначает его предполагаемое использование, как показано на следующем рисунке:

Object instance with connections to two different instances of the same type with annotated connectors

Это имеет некоторые преимущества перед другим решением:

  1. Нет необходимости кодировать - все можно сделать с помощью пользовательского интерфейса
  2. Нет необходимости в пользовательских функциях sparx (Link to Element Feature) - все можно моделировать с помощью простого UML

OneНедостаток аналогичен другому решению: в случае изменения имени класса аннотация коннектора также должна быть обновлена.С другой стороны, изменение имени класса, на мой взгляд, менее вероятно, чем изменение имени атрибута.Другим недостатком является то, что весь механизм зависит от соглашения (class.attribute).

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

0 голосов
/ 05 июня 2018

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

Связывание с функциями является функцией Sparx и не соответствует стандарту UML.Вы можете отправить в Sparx запрос функции (да, здесь так много функций), чтобы поддержать то, что вы хотите.

В любом случае, вы можете использовать Pin End(s) из контекстного меню.Это позволит закрепить один (или оба) конца (-ов) конца разъема там, где вы хотите.

...