我對如何實作我的狀态機感到有點困惑.
我已經知道它是分層的,因為一些州共享相同的行動.
我通過這些參數确定我需要做什麼:
>類(值為:基數,派生,特定)
> OpCode
>參數1 – 可選
>參數2 – 可選
我的層次結構由Class決定,OpCode表示操作.
Derived可以使用Base的OpCodes和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);
}
這将變得難以維持.
還有另一種方法将狀态映射到超類嗎?
編輯:
進一步的計算讓我覺得我可能會使用大部分(如果不是全部)操作碼,但我不會使用所有可用的類.
另一個澄清:
某些OpCode可能通過多個派生類和基類共享.
例如:
>我有一個名為Any的類
這是一個基類.它有
操作碼:STATE_ON,STATE_OFF,STATE_SET.
>我有另一個叫做的課
MyGroup是一個Derived類.它有OpCodes:
STATE_FLIP,STATE_FLOP.
>第三類是具體的
類稱為ThingInMyGroup
有OpCode:
STATE_FLIP_FLOP_AND_FLOOP.
是以,從伺服器發送包含Any類的消息,在所有用戶端中接收并處理.
從伺服器發送帶有MyGroup類的消息,在所有用戶端中收到并僅在屬于MyGroup的用戶端上處理,任何對Any類有效的OpCode對MyGroup類都有效.
從伺服器發送帶有ThingInMyGroup類的消息,在所有用戶端中收到并僅在屬于MyGroup的用戶端上處理并且是ThingInMyGroup *,任何對Any類和MyGroup類有效的** OpCode對ThingInMyGroup類都有效.
收到消息後,用戶端将相應地ACK / NACK.
我不喜歡使用switch case或const數組,因為當它們變大時它們将變得不可維護.
我需要一個靈活的設計,讓我:
>指定可用的OpCode
每個班級.
>為每個Class指定一個超類,并通過該規範允許我調用目前OpCode表示的函數指針.