嵌入式编程技法之“数据驱动编程“

对于数据驱动编程最大的难点在抽象出数据库和数据解析(有点类似于一个文本解析器),这两部分的设计的灵活度就决定了程序的扩展性和紧凑性。
目前比较简单的就是用数组等作为数据库,数据解析基本上是查表,所以也有很多小伙伴直接称为表驱动编程,然而对于数据驱动编程远远可以设计得比表驱动复杂,所以这也是在开发中选择数据驱动方法编码的一个决定因素。
下面作者还是以比较基础的实例跟大家分析分析:

1.状态机的实现

参考demo:

#include <stdio.h>
 #include <stdlib.h>

 //构造数据
 #define STATUE1    (0)
 #define STATUE2    (1)
 #define STATUE3    (2)
 #define MAX_STATUE (3)

int Statue1Process(int param);
int Statue2Process(int param);
int Statue3Process(int param);
/***************************************
14 * Fuciton:数据驱动编程实例
15 * Author :(公众号:最后一个bug)
16 ***************************************/
 //构造数据库
typedef int (*PStatueMachineProcess)(int param);
PStatueMachineProcess MachineProcess[MAX_STATUE] =
{
    Statue1Process,
    Statue2Process,
    Statue3Process
};

int Statue1Process(int param)
{
    printf("Statue1Process\n");
    return STATUE2;
}

int Statue2Process(int param)
{
    printf("Statue2Process\n");
    return STATUE3;
}

int Statue3Process(int param)
{
    printf("Statue3Process\n");
    return STATUE1;
}


int main(int argc, char *argv[]) {

    int statue = STATUE1;
    int count = 0;

    //数据库解析和逻辑引导
    while(1)
    {
        statue = (MachineProcess[statue])(1);
        count++;
        if(count > 10)break;
    }

    printf("公众号:最后一个bug\n");

    return 0;
}

分析一下:
这样实现状态机应该比if-else方便多了,上面的代码对于有一定编程经验的小伙伴而言,似乎仅仅只是用了一个函数指针数据就搞定了,如果我们再认真解读一下,其实在该过程中仅仅就是状态数据发生了变化,其他均是绑定一套连贯处理,这里的状态数据作为了数组的标识,所以在此也说明数据驱动的特点:仅仅只对数据敏感。

从上面的处理可以发现该方式可以减少switch和if-else的使用。
2消息处理机制
参考demo:
在这里插入图片描述
在这里插入图片描述
分析一下:
上面代码仅仅只是给大家简单的体验一下数据驱动编程方法,对于效率等等作者没有过多的考虑,其性能与所设计的数据结构有关系。所以这样的处理也避免了很多小伙伴进行硬编码的习惯。

4、最后小结

最后对于数据驱动编程并不是万能的,可能对于有些设计反而起到副作用,一般用于实现逻辑相对比较清晰的处理,不过对于简化条件语句还是非常好用的,所以对于这些编程思路,需要根据具体情况进行选择,同时也要对目标项目有较强的理解能力。

原文链接https://mp.weixin.qq.com/s/NDb6YklksT4JkYRo_N7wKg

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值