首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何获得无状态框架的优势?

如何获得无状态框架的优势?
EN

Stack Overflow用户
提问于 2018-03-30 08:04:48
回答 2查看 0关注 0票数 0

我想在我的代码中使用http://code.google.com/p/stateless将功能从其依赖关系中分离出来。我没有找到任何用法的高级示例,所以这个问题是关于无状态框架最佳实践的。

我有以下配置(这只是例子,只有一个功能状态):

代码语言:javascript
复制
var stateMachine = new StateMachine(State.Stopped);

stateMachine.Configure(State.Stopped)
    .Permit(Trigger.Failed, State.Error)
    .Permit(Trigger.Succeed, State.GenerateMachineData);

stateMachine.Configure(State.GenerateMachineData)
    .Permit(Trigger.Failed, State.Error)
    .Permit(Trigger.Succeed, State.Finished);

public enum State
{
    Stopped,
    GenerateMachineData,
    Finished,
    Error
}

public enum Trigger
{
    Succeed,
    Failed
}

然后在哪里调用实际功能。我有以下想法,但他们每个人都有优点和缺点:

1)在OnEntry()中设置功能以及下一次火灾:

代码语言:javascript
复制
stateMachine.Configure(State.GenerateMachineData)
.OnEntry(() => { 
    try {
       Generate(); 
       stateMachine.Fire(Trigger.Succeed);
    } catch {
       stateMachine.Fire(Trigger.Error);
    } 
})
.Permit(Trigger.Failed, State.Error)
.Permit(Trigger.Succeed, State.Finished);

所以如果我只是调用

代码语言:javascript
复制
stateMachine.Fire(Trigger.Succeed);

它会在State.Finished或State.Error中结束

2)有状态机和功能分开如下:

代码语言:javascript
复制
void DoTheStuff() {
    switch (stateMachine.State)
    {
         State.Stopped:
              stateMachine.Fire(State.Succeed);
              break;
         State.GenerateMachineData:
              Generate();
              stateMachine.Fire(State.Succeed);
              break;
         default:
              throw new Exception();
    }
}


void Main()
{
    while (stateMachine.State != State.Succeed && stateMachine.State != State.Error)
    {
        DoTheStuff();
    }
}



3)其他解决方案? 任何答案我都会很高兴

EN

回答 2

Stack Overflow用户

发布于 2018-03-30 16:59:08

我喜欢BugTracker示例

所以你的机器可能会是这样的:

代码语言:txt
复制
class Generator
{
    private readonly StateMachine state;

    public Generator()
    {
        state = new StateMachine(State.Stopped);

        // your definition of states ...

        state.Configure(State.GenerateMachineData)
        .OnEntry(() => { Generate(); })
        .Permit(Trigger.Failed, State.Error)
        .Permit(Trigger.Succeed, State.Finished);

        // ...
    }

    public void Succeed()
    {
        state.Fire(Trigger.Succeed);
    }

    public void Fail()
    {
        state.Fire(Trigger.Fail);
    }

    public void Generate()
    {
        // ...         
    }
}

在这种情况下,测试不应该是问题。

票数 0
EN

Stack Overflow用户

发布于 2018-03-30 17:27:47

Nicholas Blumhardt写了关于无状态框架的好文章

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100007880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档