【问题标题】:How do you represent an asynchronous action that can modify the program state in a statechart?您如何表示可以在状态图中修改程序状态的异步操作?
【发布时间】:2013-11-08 16:48:19
【问题描述】:

我有一个做两件事的动作,首先它会改变应用程序的状态,其次它会调用一个 web 服务。当 webservice 发送它的响应时,它会影响当前的应用程序状态。

假设我有上述设置。 Method1() 调用 Web 服务并导致状态从 A 更改为 B。在Method1()调用到Finish()调用之后,状态可以从B更改为CB更改为Success等。

如果B 更改为Success,它也可以从Success 更改为C

如果可以在 Method1() 操作之后的任何时间设置状态,我将如何绑定 SuccessFail 状态?

【问题讨论】:

    标签: uml statechart


    【解决方案1】:

    我不确定是否真正理解您的整个问题,但为了设计您的问题,我会使用事件。 当事件发生时可以触发转换,因此我将创建一个“ReceiveResponse”事件以及状态 B 和决策节点之间的转换(如下图所示)。 这模拟了这样一个事实,即如果您的状态机处于状态 B 并收到响应,则会触发转换,并且会根据响应的值将状态从 B 更改为 Success 或 Fail。

    也许您能多描述一下可能的转换或状态吗?您的对象是否可以同时处于两种状态?

    希望对你有帮助

    EBR

    【讨论】:

    • ReceiveReponse 事件发生时,应用程序可以处于BState2 状态。如果在应用程序处于B 状态时发生这种情况,那么状态可能会更改为State2
    • 首先对不起我的错误,我上传了我之前的回复,以保持状态 C 而不是 State2 ...
    • 现在状态机的目标是列出对象的所有可能状态和转换。看起来你只有 5 种可能的状态,对吧?您能否详细说明它们之间可能的转换并解释何时触发这些转换。例如我的对象处于状态 B,接收响应发生,如果响应 == false 下一个状态将是 Fail 如果响应 == true 下一个状态将是 Success。如果当前状态是 B 并且 Method2 被调用,则下一个状态将是 C。我会知道您的对象收到响应并且当前状态不是 B 会发生什么?
    • 这是一个场景:当前状态是B,检查响应的例程得到response == true,状态现在是Success,用户调用method2,状态现在是@987654331 @。这里有一个不同的场景也可能发生:当前状态是B,检查我们是否有响应(我们没有),用户调用Method2()并且状态更改为C,我们最终收到响应和@987654335 @状态现在是Success
    • 我上传图片是为了考虑到您的最后评论。但是我有一些cmets。 1)您确定状态图真的是描述您的问题的最佳方式吗? 2)也许你有更多要描述的......我的意思是你可能有一个“等待响应”状态(成功和失败)将与 A 和 B 状态平行? 3)从我的角度来看,您的第一个图表存在一些错误,例如初始状态和 A 状态之间的转换对我来说似乎是错误的,您描述 Method1() 、 Method2() 等是由转换的触发器执行的,而不是转换的触发器等。
    【解决方案2】:

    我建议使用序列图。

    1. 序列图允许异步调用类/组件方法。 (或由表示为方法的事物处理的 http 请求)这确实是您所需要的。您可以让序列图专注于它们是多个控制流以实现特定结果。

    2. 状态图的层次非常低,可能映射到这个域很差。但是,如果必须,您的所有方法/交互都必须重新转换为状态更改,而不是调用。状态机在状态之间移动,而不是在方法和类之间移动。因此,您的状态转换必须是“接收值为 A 的 B 消息”。我怀疑不是你想要的。这并不能真正帮助我理解您的系统。

    3. 如果您需要这样做是因为您正在执行 MDA/生成 UML,那么请大大扩展您的问题。我假设这是一个基本的 UML 问题,如果不告诉我,我可以添加更多详细信息。

    【讨论】:

    • 好吧,首先,我的 UML 技能肯定低于标准,所以请多多包涵。我被要求显示应用程序可能处于的不同状态,但我一直在试图弄清楚如何显示状态可以随时更改为Fail,然后更改为流中的下一个状态。例如,如果我在状态A 并且状态更改为Fail,当我在应用程序中继续时,状态可以更改为B,然后C
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-25
    • 2014-06-27
    • 2022-01-27
    • 1970-01-01
    • 1970-01-01
    • 2021-08-02
    • 1970-01-01
    相关资源
    最近更新 更多