编程模式-表驱动编程

刚开始编程时,往往会碰到一些根据不同条件执行不同功能的情况,通常都是采用if-else或者switch-case的方式,如果有很多的情况需要区分,则会有很多的 else if 或者case的代码处理,整个功能实现完成后,一看代码可能会有很多的else if 或者 case,为了避免这种情况,本编介绍一种开发方法–表驱动方法。

表驱动方法是一种使你可以在表中查找信息,而不必用逻辑语句(if 或 case)来把他们找出来的方法。事实上,任何信息都可以通过表来挑选。在简单的情况下,逻辑语句往往更简单而且更直接。但随着逻辑链的复杂,表就变得越来越富于吸引力了。表驱动编程的意义在于 逻辑与数据的分离。
可以简单的理解的就是用同样的方式处理不同的数据,表驱动方法具有以下特点:

  • 可读性强,数据处理流程一目了然。
  • 便于维护,只需要增、删数据索引和方法就可以实现功能。
  • 精简代码,降低圈复杂度。减少 if-else、switch-case 使用。
  • 在一定程度上可以提升程序运行速度。

首先,看一个简单的例子,没有采用表驱动方法的代码,根据输入的数字得到字符串。

void GetTimeString(int weak, char *pszTime)
{
    if (weak == 1)
    {
        sprintf(pszTime, "星期一");
    }
    else if (weak == 2)
    {
        sprintf(pszTime, "星期二");
    }
    else if (weak == 3)
    {
        sprintf(pszTime, "星期三");
    }
    else if (weak == 4)
    {
        sprintf(pszTime, "星期四");
    }
    else if (weak == 5)
    {
        sprintf(pszTime, "星期五");
    }
    else if (weak == 6)
    {
        sprintf(pszTime, "星期六");
    }
    else if (weak == 7)
    {
        sprintf(pszTime, "星期日");
    }
    else
    {
        sprintf(pszTime, "未知");
    }
}

采用表驱动方法后,代码得到精简,可读性增强(if-else过多会导致屏幕不够一眼看的),且在一定程度上提高了程序运行速度(若是 7 则不需要多次if判断)

void GetTimeString(int weak, char *pszTime)
{
    const char *arrpszTime[7] = {"星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"};

    if (weak >= 1 && weak <= 7) { sprintf(psztime, "%s", arrpsztime[weak - 1]); } else "未知"); }< code></=>

学会了简单的表驱动编程后,但是在实际开发中还是不知道在什么情况下使用,那么什么情况下适合表驱动开发呢?

1、常见的有驱动开发,比如采用了多个相同的驱动芯片,但是引脚等不同,可能有些人调试完其中一个驱动后,会拷贝一份再修改引脚等,这样无疑是浪费了 Flash 空间,此时采用表驱动方式将引脚等作为数据,驱动作为逻辑,只采用一份驱动代码,可以无限扩展多个驱动芯片。
2、EEPROM 数据处理,通常包括地址、数据值、最大值、最小值和默认值等,他们的方式处理是一样的,可以将需要保存的数据做成一个数组表,通过相同的函数处理这些数据。
3、按键、菜单、LED等等模块都可以采用表驱动的方式处理,比如按键将引脚、按下电平、当前状态等作为数据,菜单将每个选项和函数指针等作为数据。
4、其他等等经过思考后能够转成数据的情况。

代码参考:

Original: https://www.cnblogs.com/const-zpc/p/16364415.html
Author: 大橙子疯
Title: 编程模式-表驱动编程

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/581940/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • node-java的使用及源码分析

    上篇文章简单提了下node调用java的方法但也只属于基本提了下怎么输出helloworld的层度,这次将提供一些案例和源码分析让我们更好地了解如何使用node-java库。 前置…

    Linux 2023年6月14日
    0103
  • 内存分配-slab分配器

    1 slab综述 1.1 slab分配器产生的背景 类似 task_struct mm_struct 等结构被内核中被频繁分配和释放,同时创建和销毁这些结构会产生一定的开销(ove…

    Linux 2023年6月7日
    085
  • 数字图像处理

    1. 图像的基本概念 连续图像:二维坐标系上连续变化的图像,图像的像点无限稠密。 离散图像:用数字序列表示的图像,像素是组成图像的基本单位。 1.1 图像数字化采样 图像经过采样与…

    Linux 2023年6月14日
    090
  • Wireshark 使用教程

    Wireshark是非常流行的网络封包分析软件,可以截取各种网络数据包,并显示数据包详细信息。常用于开发测试过程各种问题定位。本文主要内容包括: 1、Wireshark软件下载和安…

    Linux 2023年6月8日
    089
  • Redis安装(CentOS 8.5 64位)

    Redis安装 1. 准备工作 1.1 下载安装包 官网下载地址:https://redis.io/ 1.2 传输文件到服务器 使用ssh工具连接到服务器,把下载好的文件上传到服务…

    Linux 2023年6月14日
    096
  • 面试复盘(1)

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月7日
    0104
  • Pytorch 中 tensor的维度拼接

    torch.stack() 和 torch.cat() 都可以按照指定的维度进行拼接,但是两者也有区别,torch.satck() 是 增加新的维度进行堆叠,即其维度拼接后会增加一…

    Linux 2023年6月7日
    0105
  • ansible -自动运维工具

    Ansible-自动运维工具 1.简介 Ansible是一个基于Python开发的配置管理和应用部署工具,现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点,Pubbe…

    Linux 2023年6月13日
    0110
  • 操作系统实战45讲笔记-01 程序的运行过程:从代码到机器运行

    计算机硬件是无法直接运行C 语言文本程序代码的,需要 C 语言编译器,把这个代码编译成具体硬件平台的二进制代码。再由具体操作系统建立进程,把这个二进制文件装进其进程的内存空间中,才…

    Linux 2023年6月7日
    091
  • Ubuntu18.04安装/卸载NVIDIA显卡驱动

    1 显卡驱动下载 官网:NVIDIA 搜索适合本机的驱动 获取最新版本驱动 立即下载 文件 上面,显卡驱动程序下载已完成。 [En] Above, the video card d…

    Linux 2023年5月27日
    0233
  • centos系统和Ubuntu系统命令区别以及常见操作

    一.前言 二.系统环境 三.命令区别 3.1 使用习惯和命令区别 3.2 服务管理的区别 3.3 软件包信息区别 四.Ubuntu系统常见操作 4.1 Ubuntu系统apt和ap…

    Linux 2023年6月7日
    0230
  • OpenStack cinder对接NFS后端存储

    配置NFS服务 安装NFS服务 查询是否安装 [root@nfs ~]# rpm -qa |grep nfs nfs-utils-1.3.0-0.8.el7.x86_64 如没有安…

    Linux 2023年6月8日
    0138
  • 一道诡异的考试题

    题目: 给定$a$张黑牌,$b$白牌,甲,乙两人按以下顺序抽牌: 甲抽一张,乙抽一张,然后弃去一张,然后重复以上过程。 先抽到黑牌者胜,求甲和乙获胜的概率$mod 10045358…

    Linux 2023年6月6日
    088
  • BootstrapTreeView 实现懒加载和点击事件。

    BootstrapTreeView的js下载位置:https://github.com/patternfly/patternfly-bootstrap-treeview。(注意不是…

    Linux 2023年6月7日
    0109
  • 【Linux进程间通信】共享内存的使用

    背景 最近需要开发一个测试程序,接受Tester端的测试指令,执行一条条外设的测试用例,执行完成后将测试数据的结果上报,上报方式未定,考虑到耦合和配套问题,决定采用共享内存机制,设…

    Linux 2023年6月13日
    0102
  • lab 1

    int father[2],son[2]; int son[2]; if (fork() == 0) { int n; char buf[1]; close(0); dup(fat…

    Linux 2023年6月7日
    075
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球