Activity 图:重用 Activity/Action 将不同继承类型的对象流作为输出

Activity Diagram: Reusing Activity/Action With different inherited type of object flow as output

我有一个关于在 Activity 图上建模的问题,这个问题困扰了我一段时间,但我无法在任何地方找到任何答案/惯例。

这里有一个例子可以更好地理解我的问题:

假设我有两个 class 分别命名为“flat”和“house”。两者都是 class“住房”的概括。 住房包含居住在其中的人的属性“居民”。 公寓包含一个属性“floor”,表示公寓所在的楼层。

这是class图表:

在 activity 图表中,我想表示为人们提供住房的行为。 此操作可以将房屋或公寓作为输入(因此我认为输入引脚使用“住房”类型是正确的)以及未定义的人数。 我希望此操作提供更新的房屋或公寓作为输出(不是更新的房屋,因为这意味着特定于房屋或公寓的信息将会丢失。 我真的不知道我是否必须创建两个动作(一个用于房屋,另一个用于公寓),或者是否有办法为两者重用该动作 class 并从中获得正确的输出。

这是activity图表:

我的问题是: 如何在 activity 图表中表示一个对于不同类型的对象流作为输入相同的动作,并给出更新对象流作为输出(因此可能是不同类型)?

nb:

蓝框中的两个流程(顶部对象和底部控件)可以保持原样。 Give flat floor 只有在接收到 Flat 对象时才会开始 并且 发送了控制令牌。为了使正确的操作成为可选的,我将只使用对象流,因此仅在传递 Flat 对象时触发。这就足够了,不需要额外的控制流程。

为了清楚起见,我还将添加一个从 Assign 操作到退出读取 [ house was assigned ] 等的受保护流。

Cameo拒绝这个模型是对的。 Give Flat Floor 需要公寓,不适合房子,但 Assign Resident to Housing 可以 return 房子。我知道,在您的上下文中它只能 return 一个 Flat,但是该工具应该如何知道?

捕捉这一事实的正确方法是向 Activity Assign Resident to Housing 添加后置条件,声明输入和输出引脚的类型相同。

然而,要定义一套完整的兼容性规则来考虑所有全局和本地的前置条件和后置条件真的很难,而且工具也很难根据这些规则来验证模型。因此 UML 规范选择了简单的道路,根本不允许连接引脚。

解决方案是使用 ObjectFlow 的转换 属性。只需分配一个 OpaqueBehavior 即可将 Type House 转换为 Type Flat。然后 Cameo 将接受该模型。建模者有责任确保此转换始终有效,因为此处无法定义异常处理。也许这应该用本地后置条件记录下来。

在您的具体示例中,有一个更简单的解决方案:只需分叉类型为 Flat 的 ObjectFlow 并省略 Assign Resident to Housing 的 OutputPin。

附带说明:由于 Cameo 中的错误,您可以将 OutputPin 的类型更改为比 ActivityParameter 更具体的类型。这对于 InputPins 是正确的,但对于 OutputPins 应该是相反的。您可以使用它来让参数为 House 类型,但 OutputPin-Type 将为 Flat。