在 UML 组件图中重用子组件

Reuse sub-components in UML component diagram

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

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

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

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

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

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

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

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

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

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

  1. 右键单击组件 -> Select 组合图 允许您select 一个已经存在的图。双击组件即可打开
  2. 右键单击组件 -> 在框架中显示复合图右键单击组件 -> 在隔间中显示复合图 将嵌入图表直接进入外部组件视图。

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

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

现在,有些人将所有带冒号的东西都称为“实例”。在某种程度上,他们是对的。 every 结构图的语义是它告诉我们允许的实例是什么——而这实际上并不依赖于冒号。只有在这里,图表告诉我们一些关于实例是其他实例的一部分的信息:Door 的两个实例是 Bathroom 和 Living Room 的一个实例的一部分,而后者又是 House 的一个实例的一部分。建模者选择不显示房屋属于哪种类型的实例。它可以是城市,城市可以是州的一部分,州可以是国家的一部分,等等。这实际上取决于图表的重点(以及模型的目的)。显示的图表只说明了 House 的 all 个实例,无论它是什么的一部分。因此,顶层没有冒号。

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

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