【问题标题】:if-condition in uml state machine diagramuml 状态机图中的 if 条件
【发布时间】:2014-08-12 04:15:16
【问题描述】:

考虑到这种情况:

...下订单时会检查可用性,如果通过,则开始准备工作,否则订单将被拒绝。

如果客户在开始准备之前决定使用信用卡付款,则订单的价格将锁定在信用卡上。

准备工作完成后,订单即送达,如果下单后超过 30 分钟,则可享受 50% 的折扣。

我的疑问是如何在状态机图中对 if 条件进行建模,我会按照以下方式对其进行建模,但我不确定它是否正确:

我应该如何对状态机图中的条件进行建模?

【问题讨论】:

标签: uml state-machine


【解决方案1】:

这张图(取自here)可能会有所帮助:

所以回答你的问题,你没有做错,这只是风格和可读性的问题。据我所知,UML 并没有真正定义表示条件的标准方法。因此,只需选择看起来最好且有意义的东西。

【讨论】:

  • 您示例中的图表似乎是一个不好的示例,因为它不是状态机图(状态在哪里?)。它看起来更像是一个活动图,但我什至不确定这是有效的 UML。
  • 无论如何,状态机图看起来都差不多,基本上我想说的是,对于如何在 UML 或状态机图中表示条件没有通用标准(每个人都这样做不同,包括所有的大学教科书),所以我只是向他展示了一种看起来很干净的方法。他的做法是正确的,所以我将他的问题解释为应该使用什么风格。
【解决方案2】:

无法在状态机的状态元素内定义条件。查看您的图表。我想,你应该把一些信息放在图表上。例如,使用选择元素来定义替代转换路径。或者从准备和交付状态绘制“准备订单”和“付款”行为的详细图表。

并非总是可以将所有信息都放在一张图表上。

【讨论】:

    【解决方案3】:

    在 UML 状态机图中,条件与转换相关联。转换具有“trigger-signature [guard]/activity”形式的 3 部分标签。 Guard 是有条件的,必须评估为真才能进行转换。过渡标签的所有 3 个部分都是可选的。

    根据您的问题描述,我可能会定义 3 个状态,分别命名为“等待订单”、“准备订单”和“交付订单”。存在从“等待订单”到“准备订单”的过渡,该过渡可以标记为“order placed [order is available] /”。我选择停止该活动,因为根据问题描述,我没有看到与此转换相关的任何活动。您也许可以绘制另一个标记为“order placed [order is unavailable] / refuse order”的过渡。但是,此转换将从“等待订单”开始并返回到“等待订单”,因为当订单被拒绝时我们不会更改状态。在这个过渡中,我包含了refuse order 活动,因为我假设有一些与拒绝订单相关的实际活动。

    另外,我看到绘制的过渡包括一个决策菱形,其中通向菱形的箭头标有trigger,菱形外的一个箭头标有[guard] / activity,另一个箭头出菱形标有[else] / activity。我不确定这在技术上是否是正确的 UML。

    我认为您在准备和交付状态的输入活动中设置的条件非常好。因为这些条件似乎与进入这些状态时发生的活动相关联,而不是与任何状态转换相关联。

    【讨论】:

      【解决方案4】:

      在 UML 状态图中,if 条件应该建模为 choice 元素,用菱形符号表示。传出转换必须用方括号中的相应条件(UML 术语中的“守卫”)标记。如 kkrambo 所述,可以另外给出触发器(事件)和行为(动作)。

      示例:

      Thisthis 提供了一些关于选择的好建议(以及一般的状态图)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多