为什么我不能在Enterprise Architect中将对象(类的实例)连接到另一个对象(类的实例)的特定属性?

时间:2018-06-05 06:57:04

标签: enterprise-architect

我有一个关于元素与属性链接的问题:

问题:为什么我不能在Enterprise Architect中将对象(类的实例)连接到另一个对象(类的实例)的特定属性?

我没有看到任何不允许我这样做的UML限制。这就是我试过的:

  1. 我知道我可以将类链接到另一个类的特定属性,如下图所示:
  2. enter image description here

    1. 最终结果将如下所示:Store类通过两个属性ManagerDeputy连接到Person类:
    2. enter image description here

      1. 从那里我可以选择要链接到的实际属性:
      2. enter image description here

        1. 我还将属性containment标记为By Reference,以指示属性的值不应是标量或简单值(显示为属性旁边的星号):
        2. enter image description here

          1. 但是一旦我创建了类的实例,我就无法明确地将Person连接到Store实例的相应属性:
          2. enter image description here

            1. 这是因为Link to Element Feature不允许我选择attribute。甚至,当我向Store1实例(在我的示例中为test)添加其他属性时,我无法从属性列表中选择该属性。所以不清楚,两个Person实例中的哪一个实际上是ManagerDeputy
            2. enter image description here

              有没有解释为什么这是不可能的?这是一个错误吗?其他人如何试图模仿这种关系?

              感谢您的建议!此致,罗纳德

3 个答案:

答案 0 :(得分:3)

不是将连接器绑定到实例的实际Attribute(必须按照other answer中的说明手动创建),我们也可以使用带注释的连接器,其中连接器的文本由约定表示其预期用途,如下图所示:

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

这比其他解决方案有一些优势:

  1. 无需编码 - 一切都可以通过用户界面完成
  2. 无需自定义sparx功能(Link to Element Feature) - 所有内容都可以通过普通UML进行建模
  3. 一个缺点与另一个解决方案类似:如果类名更改,连接器注释也必须更新。另一方面,在我看来,更改类的名称不如更改属性名称。另一个缺点是整个机制依赖于约定(class.attribute)。

    对我来说,这是最好的,因为它视觉上清晰,是最快的实施方式。

答案 1 :(得分:1)

根据@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(); 
}

然后,我可以使用UI中的标准link to element feature或API中的StyleEx来将Person实例与正确的属性相关联:

Object with Attributes

在项目浏览器中,我现在可以看到对象下的属性:

Project Browser View

这当然不是一个理想的解决方案,但在我看来,更好的是使用关联来为每个单一属性建模。

答案 2 :(得分:0)

非常简单:实例没有属性。一个都没有。您可以显示实例化属性的值,但这不一样。由于这个简单的原因,您无法链接连接器。

链接到功能是Sparx功能而非UML标准。您可以向Sparx发送一个功能(例如,这么多功能)请求以支持您的意愿。

无论如何,您可以使用上下文菜单中的Pin End(s)。这会将连接器端的一个(或两个)端固定到您想要的位置。