小编Ron*_*oni的帖子

状态机 - 无状态 vs. 传统的 if-else 代码,难以掌握好处

我最近遇到了一个脏的 if-else 代码,所以我寻找了一个重构选项,并找到了state-machine作为脏if-else代码的优雅替代品的推荐。但有些事情我很难理解:看起来作为客户,我有责任将机器从一种状态转移到另一种状态。现在,如果有 2 个转换选项(取决于在当前状态下完成的工作结果)我还需要使用 if-else 吗?如果是这样,该模式的主要好处是什么?从我的角度来看,机器可能会从起始状态自动进行转换

在问之前,我已经阅读了以下内容,它只会加强我的观点:

使用无状态自动推进状态机

如何封装.NET Stateless 状态机

转换到目标状态并触发转换和状态之间的状态机?

在我的示例中,我有一个MarketPriceEvent需要存储在 Redis 中的对象。在存储之前,它必须通过验证路径。验证路径状态是:

  • 基本验证
  • 比较
  • 另一个比较
  • 收藏
  • 错误审计

问题是我要做出很多决定。例如:只有BasicValidation成功通过,我才想转移到Comparison. 现在,如果Comparison成功,我想移至Storing,否则移至ErrorAuditing。所以如果我们要进入代码:

 _machine.Configure(State.Validate).PermitIf(Trigger.Validated, State.Compare1, () => isValid);

        _machine.Configure(State.Compare1).OnEntry(CompareWithResource1).
            PermitIf(Trigger.Compared, State.Store, () => isValid)
            .PermitIf(Trigger.Compared, State.Compare2, () => !isValid);
Run Code Online (Sandbox Code Playgroud)

在我的客户端/包装器代码中,我会写:

//Stay at Validate state
        var marketPriceProcessingMachine = new MarketPriceProcessingMachine();

        if (marketPriceProcessingMachine.Permitted(Trigger.Validated))
                       marketPriceProcessingMachine.Fire(Trigger.Validated);
        //else 
        // ...
Run Code Online (Sandbox Code Playgroud)

简而言之,如果我需要使用if-else,我从这样的状态机概念中得到了什么好处?如果它是确定性的,为什么它不会自我移动到下一个状态?如果我错了,怎么了?

c# state-machine stateless-state-machine

2
推荐指数
1
解决办法
2422
查看次数