DotNETWeekly-io / DotNetWeekly

DotNet weekly newsletter
MIT License
198 stars 3 forks source link

【开源项目】Stateless #678

Open gaufung opened 3 weeks ago

gaufung commented 3 weeks ago

https://github.com/dotnet-state-machine/stateless

gaufung commented 3 days ago

image

状态机(State Machine) 是软件开发过程中很常见的概念,在编程语言的语法层面,我们需要写很多 if-else 语句,如果想要在但是我们可以借助 Stateless 开源库来简化这个过程。 举例来讲,一个灯控制系统,它的控制逻辑是这样的:

image

那么使用编程语言实现的话,代码如下:

if (CurrentState == State.ON)
{
    CurrentState = State.OFF;
}
else
{
    if(_enforceTimeConstraint)
    {
        if (IsLightNeeded()) CurrentState = State.ON;
    }
    else
    {
        CurrentState = State.ON;
    }
}

当控制逻辑变得的复杂的时候,我们可以借助 Stateless 简化我们的代码

enum trigger { Toggle }
enum State { On, Off }
var CurrentState = State.Off;
StateMachine<State, trigger> _machine = new StateMachine<State, trigger>(() => CurrentState, s => CurrentState = s);    
_machine.Configure(State.On)
    .Permit(trigger.Toggle, State.Off);
_machine.Configure(State.Off)
.PermitIf(trigger.Toggle, State.On, () => IsLightNeeded(), "Toggle allowed")
.PermitReentryIf(trigger.Toggle, () => !IsLightNeeded(), "Toggle not allowed");
_machine.Fire(trigger.Toggle);