C# Statele状态机《从复杂逻辑到状态机的演变》

开源库

stateless

需求

近期我正在开发一个上位机程序。由于流程变得相当复杂,导致了大量的if逻辑判断,使代码变得混乱且难以维护。考虑到这个问题,我计划引入状态机来简化整个流程,提高代码的可维护性。通过使用状态机,我希望能够更清晰地表达程序的状态变化,减少条件判断的数量,使代码更加简洁和易于理解。

For example

举例:下发

状态枚举

开始 下发 完成

  public enum State
  {
      Start,
      Down,
      Complete
  }

触发枚举

异常 正常

public enum Trigger
{
    Normal,
    Abnormal
}

状态机类

public class MyStateMachine
{
     private readonly StateMachine<State, Trigger> stateMachine;
     public MyStateMachine()
     {
         stateMachine = new StateMachine<State, Trigger>(State.Start);
     
         // 状态:开始
         stateMachine.Configure(State.Start)
             .PermitIf(Trigger.Normal, State.Down,() => ShouldTransitionToComplete())
             .Permit(Trigger.Normal, State.Down)  // 触发正常,走下一个流程
             .Ignore(Trigger.Abnormal);           // 忽略异常情况
     
         // 状态:下发
         stateMachine.Configure(State.Down)
             // 触发正常,走下一个流程   
             // () => ShouldTransitionToComplete(): Function that must return true in order for the trigger to be accepted.
             .PermitIf(Trigger.Normal, State.Complete, () => ShouldTransitionToComplete())  
             // 触发异常,返回上一个流程   
             // () => ShouldTransitionToStart(): Function that must return true in order for the trigger to be accepted.
             .PermitIf(Trigger.Abnormal, State.Start, () => ShouldTransitionToStart());
             .Ignore(Trigger.Restart);
         
         stateMachine.Configure(State.Complete)
             .PermitIf(Trigger.Restart, State.Start,() => ShouldTransitionToStart())
             .Ignore(Trigger.Normal)    // 忽略正常情况
             .Ignore(Trigger.Abnormal); // 忽略异常情况
     }
     
    // 正常
     private bool ShouldTransitionToComplete()
     {
         // 添加根据条件的逻辑
         MessageBox.Show("下一步");
         return true;
     }
     
    // 异常
     private bool ShouldTransitionToStart()
     {
         // 添加根据条件的逻辑
         MessageBox.Show("请重新开始"); 
         return true;
     }
     
     // 触发状态机的方法
     public void TriggerState(Trigger trigger)
     {
         stateMachine.Fire(trigger);
     }
     
     // 获取当前状态的方法
     public State GetCurrentState()
     {
         return stateMachine.State;
     }

Winform测试

按键
private void button1_Click(object sender, EventArgs e)
{
    myStateMachine.TriggerState((MyStateMachine.Trigger)Trigger.Normal);
}
private void button2_Click(object sender, EventArgs e)
{
    myStateMachine.TriggerState((MyStateMachine.Trigger)Trigger.Abnormal);
}
private void button1_Click_1(object sender, EventArgs e)
{
    myStateMachine.TriggerState((MyStateMachine.Trigger)Trigger.Restart);
}
显示
private void Form1_Load(object sender, EventArgs e)
{
    // 省略其他代码...

    // 在Form1加载时订阅Form2的事件处理程序
    //ParentValueChanged += form2.ParentFormValueChangedHandler;

    // 启动Task更新UI
    Task.Run(() =>
    {
        while (true)
        {
            this.Invoke(() =>
            {
                // 在UI线程中更新UI
                // 可以在这里进行一些其他的UI更新操作
                this.label1.Text = myStateMachine.GetCurrentState().ToString();
            });
        }
    });
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值