题
我在找一些一般性的
- 优化
- 正确性
- 可扩展性
建议我的当前C++的分级国家机执行情况。
样本
variable isMicOn = false
variable areSpeakersOn = false
variable stream = false
state recording
{
//override block for state recording
isMicOn = true //here, only isMicOn is true
//end override block for state recording
}
state playback
{
//override block for state playback
areSpeakersOn = true //here, only areSpeakersOn = true
//end override block for state playback
state alsoStreamToRemoteIp
{
//override block for state alsoStreamToRemoteIp
stream = true //here, both areSpeakersOn = true and stream = true
//end override block for state alsoStreamToRemoteIp
}
}
goToState(recording)
goToState(playback)
goToState(playback.alsoStreamToRemoteIp)
执行情况
目前,能实现为树形结构,其中每个国家可以有一个可变数的国家为儿童。
每个国家包含一个可变数的"替代"地块(std::地图),复盖基本的价值观。在根国家,国家机器都有一组变量(功能、属性...)初始化为某些缺省值。每次我们输入一个儿童的状态下,一个列表中的"替代"变量的定义和价值,应该替代变量和价值观相同的名称在父状态。更新原始为清晰。
引用的变量
在运行时,目前的国家都存储在一个堆栈。
每次一个变量引用一下堆栈步执行寻找最高的复盖的,或在没有复盖的缺省值。
开关国
每次一个单一的国家框架是切换到,国家被推到一堆。
每次一国交换来的,我跟踪树descension,我需要从当前状态的根状态。然后我做的一棵树descension从目标国家的根状态,直到我看到目前的跟踪相匹配的以前的跟踪。我宣布一个交叉路口,在那里2痕迹,满足。然后,要切换到的目标状态,我下降,从源,爆裂状态的框架,从栈直到我到达交叉口点。然后我登上目标的节点和推动国家框架栈。
因此,对于代码样本上
执行跟踪对状态开关
- 来源国=记录
目标国=alsoStreamToRemoteIp
descension从源=记录->根(跟踪=[根])
descension从目标=alsoStreamToRemoteIp->播放->根(跟踪=[播放,根])
交叉在根。
从记录来alsoStreamToRemoteIp,
- 流行的"记录"从栈(并呼吁其退出功能...没有定义)。
- 推动"播放"栈(并呼吁的输入功能)。
- 推动"alsoStreamToRemoteIp"栈(并呼吁的输入功能)。
解决方案
两件事情:
1:对于大多数情况下只是代表国家的程序作为一种模式,并与它直接或通过视模式。
2:如果你真的需要一个密克罗尼西亚联邦,即你想随意做了一堆的操作你的模型,只有其中有些允许在某些时候。然后,....
仍然保持程序的状态模型中的(或多个模型取决于解和复杂性),代表国家和过渡等。
class State:
def __init__(self):
self.neighbors = {}
这里的邻居包含一词典的 {Action: State}
, ,因此,你可以做的东西喜欢
someAction.execute() # Actions manipulate the model (use classes or lambdas)
currentState = currentState.neighbors[someAction]
甚至冷却器,具有无限循环中随机选择一个行动从邻居,执行它,并且移动状态无限期的。这是一个伟大的方法来测试你的节目。
其他提示
我不确定我是否遵循的所有详细信息在这里。然而,看来你是描述一个密克罗尼西亚联邦(有限状态机)执行有多个国家机器。有时,当一特定事件(E1)发生在一个特定的国家(S1)FSM F1,需要进入一个新的FSM(称它F2)简化处理总体).
如果是这种情况,那么当E1发生在S1,需要援引一项行动程序,需要在该事件阅读和实现F2FSM。当调用的,开始处理在开始状态的F2,并处理有关子的事件。当它达到其结束状态,解释为F2完成。它可能会返回一些信息,以F1的操作惯例悬而F2跑了,下一个国家在F1可能会受到影响。
其余的你的描述-这样的东西'复盖块-不会有多大感到人们没有接到你的实现。