【发布时间】:2014-12-29 19:19:35
【问题描述】:
我对如何实现我的状态机有点困惑。
我已经知道它是分层的,因为某些州共享相同的操作。
我通过这些参数确定我需要做什么:
- 类(值为:Base、Derived、Specific)
- 操作码
- 参数 1 - 可选
- 参数 2 - 可选
我的层次结构是由Class决定的,OpCode代表动作。
Derived可以使用的OpCodes Base 和 Specific 可以使用 Base 和 Derived 的 OpCodes。
天真的实现如下:
void (*const state_table [MAX_CLASSES][MAX_OPCODES]) (state *) {
{base_state1, base_state2, NULL, NULL},
{base_state1, base_state2, derived_state1, NULL},
{base_state1,base_state2, derived_state1, specific_state3},
};
void dispatch(state *s)
{
if (state_table[s->Class][s->OpCode] != NULL)
state_table[s->Class][s->OpCode](s);
}
这将很快变得无法维护。
还有其他方法可以将状态映射到超类吗?
编辑:
进一步的计算使我认为我可能会使用大部分(如果不是全部)OpCodes,但我不会使用所有可用的Classes。
另一个澄清:
一些 OpCodes 可能通过多个派生和基 类 共享。
例如:
- 我有一个名为 Any 的 Class 这是一个 Base 类。它有 操作码:STATE_ON、STATE_OFF、STATE_SET。
我有另一个 Class 叫 MyGroup 是一个 Derived 类。它有 OpCodes: STATE_FLIP、STATE_FLOP。
第三个类是一个具体 名为 ThingInMyGroup 的类 具有操作码: STATE_FLIP_FLOP_AND_FLOOP。
因此,从服务器发送具有 Any 类的消息,在所有客户端中接收并处理。
类 MyGroup 的消息从服务器发送,在所有客户端中接收并仅在属于 MyGroup 的客户端上处理,任何 OpCodes 对 Any 类有效的 > 对 MyGroup 类有效。
类 ThingInMyGroup 的消息从服务器发送,在所有客户端中接收并仅在属于 MyGroup 且属于 ThingInMyGroup* 的客户端上处理,对 Any 类和 MyGroup 类有效的任何 **OpCodes 对 ThingInMyGroup 类有效。
在收到消息后,客户端将相应地 ACK/NACK。
我不喜欢使用 switch case 或 const 数组,因为当它们变大时,它们将变得无法维护。
我需要一个灵活的设计,让我:
- 指定哪些操作码可用 每个类。
- 为每个 Class 指定一个超类,并通过该规范允许我调用由当前 OpCode 表示的函数指针。
【问题讨论】:
标签: c state-machine hsm