状态机是否需要暴露其当前状态?

Ben*_*jol 8 design-patterns state-machine

我们使用状态机"框架"(基于状态模式),它不暴露其当前状态,这有时意味着我必须以迂回的方式做事.

当我质疑这个设计决定时,其中一个理由是"如果你需要知道当前的状态,你就错了".

它是否正确?我不是国家机器方面的专家.

(我在这里问,因为我知道我状态模式有一种固有的偏见,我发现它太冗长了.)

想象一个系统,其中一个状态读取两个传感器.一个传感器给出一个数值,另一个给出一个布尔值,它告诉你第一个是否"可靠".系统根据最后n个良好值输出一个值,该值是当前的"好"值或插值(或其他一些奇特的计算).

我的想法是有两个子状态 - 一个'好',另一个'不'.当一个新值到来时,我想询问状态机状态,以便我知道如何处理插值.

(我想我已经回答了我自己的问题:解决方案是NewDataValue(val)在状态机中有一个事件,它只能从'良好'状态转发价值?)

pax*_*blo 10

我必须同意那个"使用错误"评论的人.

状态机的整个要点是一个黑盒子,事件被泵入其中,并根据这些事件(包括状态转换)导致某些事情发生.事件本身不应完全依赖于机器的当前状态.

我不能设想一个事件应根据当前状态改变的情况(但如果你有一个,请随时启发我).

事件将永远是它的本质.如果需要根据当前状态对其进行不同的处理,那么状态机本身就会出现问题,而不是事件泵.

事实上,基于当前状态改变事件的整个想法在封装面前飞逝.

最好的状态机有一个非常简单的形式:

                         +------+
                         |      | state
                         V      |  transitions
            +---------------+   |
 events --> |               | --+
            | state machine |
effects <-- |               |
            +---------------+
Run Code Online (Sandbox Code Playgroud)

换句话说,事件以某种方式被泵入其中(独立于状态)并且基于其状态和事件具有某些效果.它保持着自己的状态.


根据您的问题的更新,您希望根据最后一次读数是好的还是基于之前读数的公式来处理输出,我只想将其放在效果部分.让状态机输出当前值以及是否来自传感器或计算的指示.

然后,处理效果的代码可以使用该信息执行它喜欢的操作.这有效地为您提供了所需的信息,并没有打破黑盒性质.