我使用嵌入式的东西,我有一些管理硬件的软件模块。这个模块有状态,状态转换很复杂:根据事件,模块可以从一个状态A
到另一个状态,B
或者可能到C
. 但是,当它退出某个状态时,它应该对硬件执行一些操作,以使其也保持在正确的状态。
对于相当简单的模块,我只有几个这样的功能:
enum state_e {
MY_STATE__A,
MY_STATE__B,
};
static enum state_e _cur_state;
void state_on_off(enum state_e state, bool on)
{
switch (state){
case MY_STATE__A:
if (on){
//-- entering the state A
prepare_hardware_1(for_state_a);
prepare_hardware_2(for_state_a);
} else {
//-- exiting the state A
finalize_hardware_2(for_state_a);
finalize_hardware_1(for_state_a);
}
break;
case MY_STATE__B:
if (on){
//-- entering the state B
prepare_hardware_1(for_state_b);
prepare_hardware_2(for_state_b);
} else {
//-- exiting the state B
finalize_hardware_2(for_state_b);
finalize_hardware_1(for_state_b);
}
break;
}
}
void state_set(enum state_e new_state)
{
state_on_off(_cur_state, false);
_cur_state = new_state;
state_on_off(_cur_state, true);
}
显然,我们需要为函数中的所有状态保留所有必要的操作_state_on_off()
,当我们需要移动到另一个状态时,我们只需调用_state_set(new_state)
并且状态转换会顺利进行,而与方向无关:执行所有需要的操作。
但它只适用于简单的情况。如果我们在状态MY_STATE__B
和之间有一些共同点MY_STATE__C
,那么当状态从来回改变时MY_STATE__B
,MY_STATE__C
我们应该只执行缩短的析构/构造?但是当我们进入其他状态(比如 to MY_STATE__A
)时,我们应该执行完全销毁。
想到的是子状态。所以我们有一个状态MY_STATE__BC
和子状态,比如MY_BC_SUBSTATE__B
and MY_BC_SUBSTATE__C
;当然我们有它自己的功能,比如_state_bc_on_off()
. 即使这已经是一种痛苦,但想象一下更复杂的事情:它变得可怕。
那么,此类事情的最佳实践是什么?