在编码过程中,有一类场景往往是根据不同的输入或者条件,调用不同的函数。比如在通信设计领域,往往会有不同的消息到达,而不同的消息需要对应不同的处理函数。这样一来,如果我们采用常见的if....else或者switch......case等条件结构,分支会非常多,而且逻辑结果很混乱。那么此时把条件和对应的操作函数放入到一张表中,则可以简化代码,也便于后期维护拓展。当然最好的还是用状态机实现的,这个后面再单独讲解。下面我们以数字加减乘除求模四则运算来演示这一过程。本例中只用一个静态表,实际应用中,可以是事件类型与对应动作各一张表,索引号一一对应即可。
//============================================================================
// Name : CTest.cpp
// Author : @CodingGeek
// Version : 1.0
// Copyright : Your copyright notice
// Description : 表驱动法代码研究
//============================================================================
#include <iostream>
#include <string.h>
using namespace std;
typedef int(*T_Func)(int, int);
typedef struct
{
const char *computeType;
const char *des;
T_Func pFunc;
} T_ComputeType;
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b)
{
return a - b;
}
int multi(int a, int b)
{
return a * b;
}
int divide(int a, int b)
{
return a / b;
}
int mod(int a, int b)
{
return a % b;
}
T_ComputeType g_computeTbl[] =
{
{"add", "add two numbers", add},
{"sub", "sub two numbers", sub},
{"mul", "mul two numbers", multi},
{"div", "div two numbers", divide},
{"mod", "mod two numbers", mod},
{NULL, NULL, NULL}
};
int compute(const char *pComputeType, int a, int b)
{
int i = 0;
while (g_computeTbl[i].computeType != NULL)
{
if (strcmp(g_computeTbl[i].computeType, pComputeType) == 0)
{
return g_computeTbl[i].pFunc(a, b);
}
i++;
}
return 0;
}
int main()
{
cout << compute("sub", 23, 4) << endl;
return 0;
}
如果要新增一个接口,则只需在对应的表中加入函数符号和实现该函数接口即可,极大地提高了代码可维护性,实际项目中这也是最常见和常用的技巧!

本文介绍了如何使用表驱动法解决编程中复杂的条件分支问题,以通信领域为例,说明了不同消息与处理函数的关系,并通过数字四则运算的案例演示了表驱动法的应用,强调了这种方法对于代码维护性和拓展性的提升。
180

被折叠的 条评论
为什么被折叠?



