问题描述
我有一个关于在活动图上建模的问题,这个问题一直困扰着我一段时间,我无法在任何地方找到任何答案/约定。
这是一个可以更好地理解我的问题的示例:
假设我有两个名为“flat”和“house”的类。两者都是“住房”类的概括。 住房包含居住在其中的人的属性“居民”。 公寓包含一个属性“地板”,说明公寓位于哪个楼层。
在活动图中,我想表示为人们提供住房的行为。 此操作可以将房屋或公寓作为输入(因此我认为输入引脚使用“房屋”类型是正确的)以及不确定数量的人数。 我希望此操作提供更新的房屋或公寓作为输出(不是更新的房屋,因为这意味着特定于房屋或公寓的信息将丢失。 我真的不知道是否必须创建两个动作(一个用于房屋,另一个用于公寓),或者是否有办法为两个类重复使用该动作并从中获得正确的输出。
我的问题是:如何在活动图中表示,对于不同类型的对象流相同的动作作为输入,并将更新的对象流作为输出(可能是因此是不同的类型)?
注意:
- 所有类型的对象流都是类并且继承自同一个其他类。
- 我在 modelio 中代表了这个,但首先在 Cameo 中遇到了这个问题。
- 我正在努力适应 UML 语言的规则。
解决方法
蓝框中的两个流(顶部对象和下部控件)可以保持原样。 Give flat floor
仅在收到 Flat
对象并且发送控制令牌时才会开始。为了使正确的操作成为可选的,我将只使用对象流,因此仅在传递 Flat
对象时触发。这样就足够了,不需要额外的控制流。
为了清楚起见,我还将添加一个从 Assign
操作到退出阅读 [ house was assigned ]
等的受保护流。
Cameo 拒绝这种模式是正确的。 Give Flat Floor
需要一个 Flat 并且不会与 House 一起使用,但 Assign Resident to Housing
可以返回一个 House。我知道,在您的上下文中,它只能返回一个 Flat,但该工具如何知道这一点?
捕捉这一事实的正确方法是向 Activity Assign Resident to Housing
添加一个后置条件,声明输入和输出引脚的类型将相同。
然而,要定义一套完整的兼容性规则来考虑所有全局和局部的前置和后置条件真的很困难,而且工具也很难根据这些规则来验证模型。因此,UML 规范选择了简单的道路,根本不允许连接引脚。
解决方案是使用ObjectFlow的transformation属性。只需分配一个 OpaqueBehavior 将 Type House 转换为 Type Flat。 Cameo 将接受模型。建模者有责任确保此转换始终有效,因为此处无法定义异常处理。也许这应该用本地后置条件记录。
在您的具体示例中,有一个更简单的解决方案:只需分叉 Type Flat 的 ObjectFlow 并省略 Assign Resident to Housing
的 OutputPin。
附带说明:由于 Cameo 中的错误,您可以将 OutputPin 的类型更改为比 ActivityParameter 更具体的类型。这对于 InputPins 是正确的,但对于 OutputPins 应该相反。您可以使用它让 Parameter 为 House 类型,但 OutputPin-Type 将为 Flat。