摘要
大量的 if - else 会使得代码臃肿,不够简洁,阅读困难。查表法的改写可以改善这一点。
记录一个 if - else 的表驱动法改写,方便以后使用
if - else 代码
int function_event(int flag, int expect)
{
if (1 == flag) {
to_function_1(expect);
} else if (2 == flag) {
to_function_2(expect);
} else {
printf("The flag is error!\n");
}
return 0;
}
表驱动法改写
typedef void (*fn_event_handler) (int expect);
typedef struct {
int flag;
fn_event_handler handler;
} event_command_node;
static const event_command_node g_event_command_table[] = {
{1, to_function_1},
{2, to_function_2},
};
fn_event_handler get_handler(int flag)
{
int index = 0;
fn_event_handler target_handler = NULL;
while (1) {
if (g_event_command_table[index].flag == 0 ||
g_event_command_table[index].handler == NULL) {
break;
}
if (g_event_command_table[index].flag == flag) {
target_handler = g_event_command_table[index].handler;
break;
}
index++;
}
return target_handler;
}
int to_function_expect(int expect, int flag)
{
fn_event_handler event_handler;
event_handler = get_handler(flag);
if (event_handler == NULL) {
printf("get_handler error!\n");
return -1;
}
(*event_handler)(expect);
return 0;
}