2

简而言之:目前我在 Sparx Enterprise Architect 中执行了大量的白盒建模。但是,我想知道 EA 不允许我添加两次子组件。是 UML 建模问题还是工具问题?

说明:为了解释我的主题,让我们假设我们要为公寓建模。公寓由房间组成,即浴室和客厅。两种房间都包括一扇门。门基本上是相同的 - 相同的制造商,相同的产品。

目标:房间的门是平等的。因此,我们不应该对它们单独建模,而是重用单个门组件(从我的角度来看)。下图显示了我的设置:

在此处输入图像描述

现在,我想创建组件图。我想要达到的目标如下所示。你会猜到我不可能得到想要的模型。相反,红色组件存在问题。

在此处输入图像描述

ISSUE:对于组件图,我总是选择将组件作为链接插入到 Sparx Enterprise Architect 中。当我第二次尝试粘贴门(子)组件时,我收到以下反馈:

在此处输入图像描述

注意:根据我的经验,我知道来自 Sparx Enterprise Architect 的错误消息通常表明存在一些建模错误。我在互联网上阅读了很多内容,甚至还买了一本关于该主题的 UML 书。不幸的是,在这两个来源中,我都无法找到我的建模问题的解决方案。解决此问题的唯一方法是将门组件作为实例而不是链接插入到组件图中,或者深度复制门组件。但是,这两个选项都感觉不自然,我觉得它们会在进一步的建模过程中引起后续问题。

4

2 回答 2

3

您不能在图表上两次添加相同的元素。对于正在连接的元素,您可以使用连接器上下文中的“虚拟化连接器端”。这将在图表上创建元素的阴影。但是,我不建议使用它,因为它会产生很多不同的问题。

UML 规范本身并不禁止在图上多次包含元素。但是他们只在少数使用泛化的图表上使用它,很明显实际上元素是相同的。现在,当您在图表上重新使用元素时,这正是问题所在。无法确定您是否有两个看起来相同的不同元素,或者它们是否只是同一事物的两个渲染。出于这个原因,我的建议是明确并在图表上只使用一次元素。

作为替代方案,可以考虑使用显示在两个 Room 组件内的复合图。您可以制作任一组合,将共享的子组件放置在该图中,并使组合图显示在主组件内。这可以通过拖动组件内的复合图并使其适合来完成:

在此处输入图像描述

在 Enterprise Architect 中嵌入图表可以实现如下:

  1. 右键单击组件 -> 选择复合图允许您选择已经存在的图。双击组件后,它将立即打开。
  2. 右键单击组件 -> 在框架中显示复合图右键单击组件 -> 在隔间中显示复合图会将图表直接嵌入到外部组件视图中。

嵌入复合图的选项

于 2020-12-06T10:19:08.183 回答
3

您显示的图表是打包元素的符号。包装没有语义。您可以在模型浏览器和图表中将元素移动到任何您想要的位置。它只会帮助您保持模型井井有条。为此目的,每个元素只能包含在一个包装元素中是有意义的。因此,不可能在两个房间都显示门。

据我了解,您想要建模,浴室和客厅都有一个部分,即门类型。为此,UML 使用复合结构图。它允许显示组件和类的内部结构。 组件房屋 在这个例子中,组合结构图显示在 House 组件的一个隔间中,在组件图中显示。如您所见,House 的子组件也可以显示其内部部件。这适用于任何级别的嵌套。当然,如果图表变得太大,你也可以使用专门的复合结构图,只显示一个组件的内部结构。

现在,有些人将带有冒号的所有内容称为“实例”。在某种程度上,他们是对的。每个结构图的语义是它告诉我们允许的实例是什么——实际上并不依赖于冒号。只有在这里,图表才告诉我们实例是其他实例的一部分:门的两个实例是浴室和客厅的一个实例的一部分,而这两个实例又是房子的一个实例的一部分。建模者选择不显示房子是什么类型的实例的一部分。它可以是一个城市,该城市可以是一个州的一部分,而该州可以是一个国家的一部分,依此类推。这实际上取决于图表的重点(以及模型的目的)。显示的图表仅说明了所有内容房子的实例,无论它是什么的一部分。因此,顶层没有冒号。

我没有使用 Enterprise Architect 对此进行建模。然而,由于这种表示法完全在 UML 规范的范围内,它应该是可能的。

我假设您在谈论软件组件。如果您谈论的是物理房间,您应该考虑使用 SysML,它为建模事物的内部结构提供了更多可能性。

于 2020-12-07T21:31:26.177 回答