【问题标题】:Why cannot I connect an object (instance of a class) to a specific attribute of another object (instance of a class) in Enterprise Architect?为什么我不能在 Enterprise Architect 中将一个对象(类的实例)连接到另一个对象(类的实例)的特定属性?
【发布时间】:2018-06-05 06:57:04
【问题描述】:

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

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

我在 UML 中没有看到任何不允许我这样做的约束。这是我尝试过的:

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

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

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

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

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

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

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

感谢您的建议!问候,罗纳德

【问题讨论】:

  • 我知道这个问题类似于stackoverflow.com/questions/40611917。但在我的问题中,我不是通过“设置运行状态”而是通过“链接到元素功能”。所以在我看来,这不是一个重复的问题。

标签: enterprise-architect


【解决方案1】:

除了将连接器绑定到实例的实际Attribute(必须按照other answer 中所述手动创建)之外,我们还可以使用带注释的连接器,其中连接器的文本按照惯例表示其预期用法如下图:

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

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

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

对我来说,这效果最好,因为它在视觉上很清晰,并且是最快的实现方式。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 嗨@Thomas。我尝试了固定选项,但不幸的是,这只给了我连接器意图的视觉指示。此外,当固定到调整大小的元素时,连接器不会粘在该位置上。然而,我设法将属性添加到对象实例,然后我可以使用link to element feature 选项。我将在下面回答一些额外的图像以供说明。感谢您为我指明正确的方向。罗纳德
      • 是的,我知道。它不能替代其他功能。但这是实现类似行为的唯一方法 - 只是在调整元素大小时需要对其进行调整。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-05
      • 1970-01-01
      • 1970-01-01
      • 2021-10-15
      相关资源
      最近更新 更多