我最近读过有关boost::statechart库(有限状态机)的内容,我很喜欢这个概念.
C#有类似的机制吗?或者可以使用特定的设计模式实现?
使用yield关键字来实现这里所示的简单状态机是否可行.对我来说,看起来C#编译器为您完成了艰苦的工作,因为它在内部实现了状态机以使yield语句有效.
你可以在编译器已经完成的工作之上捎带并让它为你实现大部分状态机吗?
有没有人这样做,技术上可行吗?
bbv.Common.StateMachineclass是我见过的最好的状态机代码.但它缺少一件事:获得当前状态.
这是一个订单跟踪系统:
fsm = new ActiveStateMachine<States, Events>();
fsm.In(States.OrderCreated)
.On(Events.Submitted)
.Goto(States.WaitingForApproval);
fsm.In(States.WaitingForApproval)
.On(Events.Reject)
.Goto(States.Rejected);
fsm.In(States.WaitingForApproval)
.On(Events.Approve)
.Goto(States.BeingProcessed);
fsm.In(States.BeingProcessed)
.On(Events.ProcessFinished)
.Goto(States.SentByMail);
fsm.In(States.SentByMail)
.On(Events.Deliver)
.Goto(States.Delivered);
fsm.Initialize(States.OrderCreated);
fsm.Start();
fsm.Fire(Events.Submitted);
// Save this state to database
Run Code Online (Sandbox Code Playgroud)
你可以很容易地看到它的工作原理.
但我想在数据库中保存订单状态.所以我将能够显示订单的状态.
我需要一个
fsm.GetCurrentState()
//show this state in the a table
Run Code Online (Sandbox Code Playgroud)
方法.实际上有一种方法:我可以ExecuteOnEntry在每个州的条目上使用和更改本地值.但ExecuteOnEntry为每个州写作都会很麻烦,因为我会重复自己!
必须有一种微妙的方式来做到这一点.
在此示例中,海报已覆盖get哈希码方法.我知道这样做是为了为返回的对象提供更好的哈希值,减少冲突次数,从而减少调用所需的次数Equals().
我想知道的是,这个算法是如何计算的:
return 17 + 31 * CurrentState.GetHashCode() + 31 * Command.GetHashCode();
Run Code Online (Sandbox Code Playgroud)
是否有特殊原因选择了相关数字?我可以简单地选择自己的数字投入吗?
所以,我试图找出,如何确定我的变量是否正在增加它的价值,或者减少它.我知道我可以使用一个变量来存储旧值,但在这种情况下它不是一个选项.
int variable = 0;
variable = 1;
if(variable has increased) {
//Do Magic stuff
}
Run Code Online (Sandbox Code Playgroud)
基本上,我会怎么想这样做.我不知道是否有可能这样,没有旧值的容器,但我认为可能有一个C#函数,可以解决这个问题,可能是一个内存地址?
我还没有得到任何线索,这种方法或技术也被称之为,所以对此也很了解.