【问题标题】:Activity Diagram: Reusing Activity/Action With different inherited type of object flow as output活动图:以不同继承类型的对象流作为输出重用活动/动作
【发布时间】:2021-06-06 14:45:40
【问题描述】:

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

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

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

这是类图:

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

这是活动图:

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

注意:

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

【问题讨论】:

    标签: uml sysml


    【解决方案1】:

    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 的 OutputPin。

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 感谢您的回答! Cameo 仍然认为这种类型的对象流使用(下降泛化链接(从房屋到平面))是不正确的(它正在引发错误)但是这个错误更多地与工具相关吗?
      • 这不是泛化而是对象流。我不认识 Cameo(只知道名字)。对象流与泛化无关。但我怀疑这是一个工具问题。
      • 具有不兼容类型的对象流的语义不是令牌仅在实际类型恰好一致时遍历。 UML 说目标类型必须是超类型。因此,模型不一致,没有意义。
      • [house was assigned] 永远不会为真,因为 Activity 总是收到一个 Flat。
      • @AxelScheithauer 现在对我来说太晚了,但你似乎在我年迈的眼睛无法识别的那篇小文章中发现了一些东西:-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-12
      • 1970-01-01
      • 1970-01-01
      • 2021-05-31
      • 1970-01-01
      相关资源
      最近更新 更多