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

Why cannot I connect an object (instance of a class) to a specific attribute of another object (instance of a class) in Enterprise Architect?

我有一个关于link元素到属性的问题:

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

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

  1. 我知道我可以link classes到另一个class的特定属性如下图:

  1. 最终结果将如下所示,我有一个 Store class 通过两个属性 ManagerDeputy 连接到 Person class:

  1. 从那里我可以 select 实际属性到 link 到:

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

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

  1. 这是因为 Link to Element Feature 不允许我 select 和 attribute。甚至,当我将附加属性添加到 Store1 实例(在我的示例中为 test)时,我也无法从属性列表中 select 该属性。所以不清楚,两个 Person 实例中的哪一个实际上是 ManagerDeputy.

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

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

很简单:实例没有属性。 None 完全没有。您可以显示实例化属性的值,但这不一样。出于这个简单的原因,您不能 link 连接器。

链接到功能是 Sparx 的功能,而不是 UML 标准。您可以向 Sparx 发送一个功能(呵呵,这里有这么多功能)请求以支持您想要的功能。

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

根据@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 实例:

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

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

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

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

  1. 无需编码 - 一切都可以通过 UI
  2. 无需自定义 sparx 功能 (Link to Element Feature) - 一切都可以通过普通 UML 建模

一个缺点类似于另一个解决方案:如果 class 名称更改,连接器注释也必须更新。另一方面,我认为更改 class 的名称比更改属性名称的可能性小。另一个缺点是整个机制取决于约定 (class.attribute)。

对我来说,这种方法效果最好,因为它在视觉上很清晰,而且实施起来最快。