表驱法

← 返回软件架构|←小项目架构

作者:无际单片机 链接:https://www.zhihu.com/question/455454057/answer/124127323438 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

第一步:建表

定义状态和事件的枚举,再搞个状态转移表:

// 状态和事件
typedef enum { IDLE, RUNNING, ERROR } State;
typedef enum { START, STOP, ERROR_EVENT } Event;
 
// 表结构
typedef struct {
    State current;  // 当前状态
    Event event;    // 触发事件
    State next;     // 下一状态
    void (*action)(void); // 执行的操作
} Transition;
 
// 状态转移表
Transition transitions[] = {
    {IDLE, START, RUNNING, start_running},
    {RUNNING, STOP, IDLE, stop_running},
    {RUNNING, ERROR_EVENT, ERROR, handle_error},
    // 加新状态?在这加一行
};

第二步:查表+执行

写个函数,根据当前状态和事件查表,更新状态并干活:

void process_event(Event event) {
    int size = sizeof(transitions) / sizeof(Transition);
    for (int i = 0; i < size; i++) {
        if (transitions[i].current == current_state && transitions[i].event == event) {
            current_state = transitions[i].next;
            if (transitions[i].action) transitions[i].action();
            return;
        }
    }
    invalid_transition(); // 没找到就报个错
}