当前位置:首页 > 公众号精选 > 嵌入式微处理器
[导读]1、聊一聊 今天为大家介绍数据驱动编程技巧,能够帮助大家在平时写出高质量的代码。 2、什么是数据驱动编程     作者一直觉得"没有设计思想的代码是没有灵魂的",所以在这么多年的程序设计中一般首先设计程序架构然后再进行编码,之前作者为大家介绍了一下<【


1、聊一聊


今天为大家介绍数据驱动编程技巧,能够帮助大家在平时写出高质量的代码。


2、什么是数据驱动编程

    作者一直觉得"没有设计思想的代码是没有灵魂的",所以在这么多年的程序设计中一般首先设计程序架构然后再进行编码,之前作者为大家介绍了一下<【杀手锏】用“万能C编程”来引出"面向对象">,应该有很多之前没有接触过这方面内容的小伙伴从中受益,同时也希望作者能够带来更多类似的文章,所以就有了该新作。


1

通过MP3来看看数据驱动编程

    


    这里拿MP3播放器作为一个例子为大家引出数据驱动思想,使用MP3播放器进行音乐播放需要有MP3格式的文件,并且不同的歌曲都会遵循该格式的文件依次存放。

    那么对应的MP3播放器会按照MP3音乐文件进行对应的解析,这样对于不同的音乐文件都是统一的解析方式,并不需要换另外一种解析方式,以后我们想播放其他的音乐仅仅只需要添加对应的音乐文件即可,而并不需要再更新对应的音乐播放器。

    同时当我们需要切歌、定义播放模式等等,仅仅只需要对播放文件索引进行逻辑处理即可,该实例就为我们展示了数据驱动思想的特点: 认为数据易变,而逻辑相对比较固定,这样便把数据和逻辑分离,降低代码逻辑的重复,增强代码的聚合度。

2

数据驱动实现框架图

    在之前的文章中作者在介绍结构体的时候说到了一个妙处不知道大家还是否记得?<【典藏】大佬们都在用的结构体进阶小技巧>,在该文中说到结构体可以囊括所有数据,并且几乎所有的事物进行抽象以后都可以归为数据,所以采用数据驱动开发也将是行之有效的思路。


分析一下:
  • 左边是所有的数据,包括用户的输入,所采集的数据、还有各种处理数据的方法都是数据,获得所有的数据以后,正常思路是直接编码进行数据解析,最终实现项目需求。

  • 然而对于数据驱动开发,并不是立马进行数据解析,而是首先进行数据库设计,这里作者所谓的数据库并不是mysql什么的,而是一种数据结构,表明数据与数据的关系等,类似于前面提到的MP3格式文件。

  • 设计好数据库以后,需要构造数据库解析的方式,该解析方式的目标是实现项目功能目标的全部或者是一部分,也就类似于前面提到的MP3播放器。


3、实现合集

    对于数据驱动编程最大的难点在抽象出数据库和数据解析(有点类似于一个文本解析器),这两部分的设计的灵活度就决定了程序的扩展性和紧凑性。

    目前比较简单的就是用数组等作为数据库,数据解析基本上是查表,所以也有很多小伙伴直接称为表驱动编程,然而对于数据驱动编程远远可以设计得比表驱动复杂,所以这也是在开发中选择数据驱动方法编码的一个决定因素。

   下面作者还是以比较基础的实例跟大家分析分析:


1

状态机的实现
参考demo:
 1#include <stdio.h>
2#include <stdlib.h>
3
4//构造数据  
5#define STATUE1    (0
6#define STATUE2    (1
7#define STATUE3    (2
8#define MAX_STATUE (3
9
10int Statue1Process(int param);
11int Statue2Process(int param);
12int Statue3Process(int param);
13/***************************************
14 * Fuciton:数据驱动编程实例  
15 * Author :(公众号:最后一个bug) 
16 ***************************************/

17 //构造数据库
18typedef int (*PStatueMachineProcess)(int param);
19PStatueMachineProcess MachineProcess[MAX_STATUE] =
20{
21    Statue1Process,
22    Statue2Process,
23    Statue3Process  
24};
25
26//构造数据 
27int Statue1Process(int param)
28{
29    printf("Statue1Process\n");
30    return STATUE2;
31}
32
33int Statue2Process(int param)
34{
35    printf("Statue2Process\n");
36    return STATUE3;
37}
38
39int Statue3Process(int param)
40{
41    printf("Statue3Process\n");
42    return STATUE1;
43}
44
45
46int main(int argc, char *argv[]) {
47
48    int statue = STATUE1;
49    int count = 0;
50
51    //数据库解析和逻辑引导 
52    while(1)
53    {
54        statue = (MachineProcess[statue])(0);
55        count++;
56        if(count > 10)break;
57    }
58
59    printf("公众号:最后一个bug\n");
60
61    return 0;
62}
分析一下:
  •  这样实现状态机应该比if-else方便多了,上面的代码对于有一定编程经验的小伙伴而言,似乎仅仅只是用了一个函数指针数据就搞定了,如果我们再认真解读一下,其实在该过程中仅仅就是状态数据发生了变化,其他均是绑定一套连贯处理,这里的状态数据作为了数组的标识,所以在此也说明数据驱动的特点:仅仅只对数据敏感。

  •  从上面的处理可以发现该方式可以减少switch和if-else的使用。


2

消息处理机制
参考demo:
 1typedef enum
2{
3    OBJ_TYPE_1,
4    OBJ_TYPE_2,
5    OBJ_TYPE_3,
6}ENUM_OBJ_TYPE;
7
8typedef enum
9{
10    SIG_TYPE_1,
11    SIG_TYPE_2,
12    SIG_TYPE_3,
13}ENUM_SIG_TYPE;
14
15typedef int (*MessageProcess)(int param);
16
17typedef struct  _tag_MessagePack 
18{
19    ENUM_OBJ_TYPE       ObjType;    //对象类型  
20    ENUM_SIG_TYPE    SignalType;    //消息类型
21    MessageProcess   MessageProc;   //消息处理 
22}sMessagePack ;
23
24int obj1_Sig1_proc(int param)
25{
26
27
28.....
29 /***************************************
30 * Fuciton: 构造数据库 
31 * Author :(公众号:最后一个bug) 
32 ***************************************/

33sMessagePack stMessagePack[]= 
34{
35    {OBJ_TYPE_1, SIG_TYPE_1, obj1_Sig1_proc}
36    {OBJ_TYPE_1, SIG_TYPE_2, obj1_Sig2_proc}
37    {OBJ_TYPE_2, SIG_TYPE_1, obj2_Sig1_proc}
38    {OBJ_TYPE_2, SIG_TYPE_2, obj2_Sig2_proc}
39    {OBJ_TYPE_3, SIG_TYPE_1, obj3_Sig1_proc}
40    {OBJ_TYPE_3, SIG_TYPE_2, obj3_Sig2_proc}
41};
42
43/***************************************
44 * Fuciton:消息循环处理 
45 * Author :(公众号:最后一个bug) 
46 ***************************************/

47MessageProcess MessageLoop(ENUM_OBJ_TYPE objType, ENUM_SIG_TYPE signalType)
48{
49    int i = 0;
50    for (i = 0; i < (sizeof(stMessagePack)/sizeof(sMessagePack)); i ++)
51    {
52        if ((stMessagePack[i].ObjType == objType) && (stMessagePack[i].SignalType == signalType))
53        {
54            return stMessagePack[i].MessageProc;
55        }
56    }
57    return NULL;
58
分析一下:
  • 上面代码仅仅只是给大家简单的体验一下数据驱动编程方法,对于效率等等作者没有过多的考虑,其性能与所设计的数据结构有关系。所以这样的处理也避免了很多小伙伴进行硬编码的习惯。


4、最后小结

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

    

免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

嵌入式ARM

扫描二维码,关注更多精彩内容

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭