大家好,我是阿桃,一个想成为被点赞关注的程序员。
工控行业、物联网行业、机器人行业软件开发可联系我,联系方式QQ:845699561
前言
在工作中我们不难会看到一些逻辑复杂函数,这里面有着大量的if-else或者switch-case,这样的代码不容易理解以及可读性低,每次添加新逻辑时都需要修改调用函数中if-else逻辑,这就影响到该函数的稳定性。
那么对于这样的代码,我们如何将其写得优雅,这就是我们要介绍的表驱动法了,表驱动法在我工作实战编程中是用的比较多的方法了,因为太多人喜欢if-else来写复杂的逻辑,光是if-else洋洋洒洒的写了上百行。
表驱动法使用示例
最早知道这个编程方法还是在《代码大全》第十八章中读到的,它其实可以用在很多地方。
在实战编程中表驱动常用到的还是在一些命令以及相应命令函数处理上,如果用条件判断来编写,就是像下面这种代码:
if('A' == cmd)
{
A();
}
else if('B' == cmd)
{
B();
}
else if('C' == cmd)
{
C();
}
....
当逻辑不负杂的情况下用if-else是简洁明了的,但当它复杂起来时它的局限性就出来了,可读性不高,并且新增命令都需要增加一个if-else,这对于调用逻辑来讲是不可靠的。
如果用表驱动的方式来写,代码就像如下:
//定义相应的命令以及命令处理函数
typedef int(*CMD_FUN) ();
typedef struct{
char type;
CMD_FUN fun;
}cmd_st;
cmd_st cmd[] = {{'A', A()},
{'B', B()}
{'C', C()}
...};
//查命令表执行相应命令处理函数
for(int i = 0; i < sizeof(cmd)/sizeof(cmd[0]; i++)
{
if(cmd_type == cmd[i].type)
{
cmd[I].fun();
}
}
这样每次新增命令以及处理函数只需要在cmd表中添加相应的命令以及具体处理函数,逻辑调度不需要改变,并且逻辑调度部分简洁明了。
文章每周持续更新,原创虽短,确不容易,欢迎大家点赞关注,一起交流技术一起提升成长。