如何将 pay phone 建模为状态机?

How do you model a pay phone as a state machine?

我不明白状态机是如何应用于问题的。特别是 - 该模型是否根据定义描述了每个可能的 排列 状态?你如何合并持续存在并在状态之间修改的内存

作为最简单的示例,让我们仅以支付 phone 接受硬币的部分为例,并确定是否可以拨打电话。通话费用为 50 美分、五分硬币、一角硬币和四分之一硬币。

状态机会是这样的树吗:

quarter -> quarter -> valid
quarter -> dime -> dime -> nickel -> valid
dime -> dime -> dime -> dime -> dime -> valid

或者更像是:

Accepting_Coins -> Quarter_Inserted -> Add_25c_to_Balance -> Check_balance -> Balance_is_50c -> valid

Accepting_Coins -> Quarter_Inserted -> Add_25c_to_Balance -> Check_balance -> Balance_is_NOT_50c -> Accepting_Coins

Accepting_Coins -> Dime_Inserted -> Add_10c_to_Balance -> Check_balance -> Balance_is_50c -> valid

第二个版本需要内存中的余额变量。

我想编写事件驱动程序,其中 FSM 模型指导控制流并拒绝我定义为无效事件序列的内容。

如评论中所述,对于纯有限状态机,您需要定义支付 phone 迄今为止作为状态接受的每个可能的金额。接受插入的硬币对应于一个转换。

是否需要 "overflow" 的额外状态取决于...如果支付 phone 将拒绝任何不代表模型转换的硬币,那么您不需要不需要它:模型(图形)中没有过渡(边缘)就足够了。但是在一个非常详细的实现中,您还可以添加状态,用于说明硬币卡住、插入无效硬币、插入过多(支付 phone 将如何响应?它会返回硬币,还是只是 returns 全部?...等),按下按钮,...

但这是最​​基本的模型:

您可能还需要拨号、拨打和结束通话的转换。一旦通话结束,您将再次转换到状态 0,因此可以接受新的付款。