表驱动法在项目中的应用

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

在编码过程中,有一类场景往往是根据不同的输入或者条件,调用不同的函数。比如在通信设计领域,往往会有不同的消息到达,而不同的消息需要对应不同的处理函数。这样一来,如果我们采用常见的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;
}

如果要新增一个接口,则只需在对应的表中加入函数符号和实现该函数接口即可,极大地提高了代码可维护性,实际项目中这也是最常见和常用的技巧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值