2

我有一个关于在活动图上建模的问题一直困扰着我一段时间,我无法在任何地方找到任何答案/约定。

这是一个更好地理解我的问题的示例:

假设我有两个名为“flat”和“house”的班级。两者都是“住房”类的概括。住房包含居住在其中的人的属性“居民”。flat 包含一个属性“floor”,表示该公寓位于哪一层。

这是类图: 上面解释的类图

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

这是活动图: 上面解释的活动图

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

注意:

  • 所有类型的对象流都是类并继承自同一个其他类。
  • 我在 modelio 中代表这一点,但首先在 Cameo 中遇到了这个问题。
  • 我正在尝试尽可能地适应 UML 语言的规则。
4

2 回答 2

2

Cameo 拒绝这种模式是对的。Give Flat Floor期望 Flat 并且不会与 House 一起使用,但Assign Resident to Housing可以返回 House。我知道,在您的上下文中,它只能返回一个 Flat,但是该工具应该如何知道呢?

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

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

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

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

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

于 2021-08-09T19:02:02.127 回答
2

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

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

于 2021-06-06T18:30:43.203 回答