为什么我不能在 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 中有任何限制不允许我这样做。这是我试过的:
- 我知道我可以link classes到另一个class的特定属性如下图:
- 最终结果将如下所示,我有一个
Store
class 通过两个属性 Manager
和 Deputy
连接到 Person
class:
- 从那里我可以 select 实际属性到 link 到:
- 我还将属性
containment
标记为 By Reference
以指示属性的值不应是标量或简单值(在属性旁边显示为星号):
- 但是一旦我创建了 classes 的实例,我就无法明确地将
Person
连接到 Store
实例的相应属性:
- 这是因为
Link to Element Feature
不允许我 select 和 attribute
。甚至,当我将附加属性添加到 Store1
实例(在我的示例中为 test
)时,我也无法从属性列表中 select 该属性。所以不清楚,两个 Person
实例中的哪一个实际上是 Manager
和 Deputy
.
有什么解释为什么这是不可能的吗?这是一个错误吗?其他人如何尝试模拟这种关系?
感谢您的建议!此致,罗纳德
很简单:实例没有属性。 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
(必须手动创建,如 中所述)连接器按照约定表示其预期用途如下图所示:
这比其他解决方案有一些优点:
- 无需编码 - 一切都可以通过 UI
- 无需自定义 sparx 功能 (
Link to Element Feature
) - 一切都可以通过普通 UML 建模
一个缺点类似于另一个解决方案:如果 class 名称更改,连接器注释也必须更新。另一方面,我认为更改 class 的名称比更改属性名称的可能性小。另一个缺点是整个机制取决于约定 (class.attribute
)。
对我来说,这种方法效果最好,因为它在视觉上很清晰,而且实施起来最快。
我有一个关于link元素到属性的问题:
问题:为什么我不能在 Enterprise Architect 中将一个对象(class 的实例)连接到另一个对象(class 的实例)的特定属性?
我没有看到 UML 中有任何限制不允许我这样做。这是我试过的:
- 我知道我可以link classes到另一个class的特定属性如下图:
- 最终结果将如下所示,我有一个
Store
class 通过两个属性Manager
和Deputy
连接到Person
class:
- 从那里我可以 select 实际属性到 link 到:
- 我还将属性
containment
标记为By Reference
以指示属性的值不应是标量或简单值(在属性旁边显示为星号):
- 但是一旦我创建了 classes 的实例,我就无法明确地将
Person
连接到Store
实例的相应属性:
- 这是因为
Link to Element Feature
不允许我 select 和attribute
。甚至,当我将附加属性添加到Store1
实例(在我的示例中为test
)时,我也无法从属性列表中 select 该属性。所以不清楚,两个Person
实例中的哪一个实际上是Manager
和Deputy
.
有什么解释为什么这是不可能的吗?这是一个错误吗?其他人如何尝试模拟这种关系?
感谢您的建议!此致,罗纳德
很简单:实例没有属性。 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
(必须手动创建,如
这比其他解决方案有一些优点:
- 无需编码 - 一切都可以通过 UI
- 无需自定义 sparx 功能 (
Link to Element Feature
) - 一切都可以通过普通 UML 建模
一个缺点类似于另一个解决方案:如果 class 名称更改,连接器注释也必须更新。另一方面,我认为更改 class 的名称比更改属性名称的可能性小。另一个缺点是整个机制取决于约定 (class.attribute
)。
对我来说,这种方法效果最好,因为它在视觉上很清晰,而且实施起来最快。