我在找一些一般性的

  1. 优化
  2. 正确性
  3. 可扩展性

建议我的当前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,

  1. 流行的"记录"从栈(并呼吁其退出功能...没有定义)。
  2. 推动"播放"栈(并呼吁的输入功能)。
  3. 推动"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可能会受到影响。

其余的你的描述-这样的东西'复盖块-不会有多大感到人们没有接到你的实现。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top