[设计]三种常用的表驱动设计方法(参考C代码)

1.聊天。

农历新年快到了。

我在家里忙于各种准备工作,今天坐下来写文章真是一件幸运的事。

好吧,今天,我将与您分享三种表驱动设计方法,所有这些方法都非常微妙,值得收集和仔细研究。

2.正文第1部分表驱动的含义对于表驱动的方法,在先前的文章中应该经常提到错误。

常规的方法是定义一个表,该表通常是一个结构数组,并且该结构包含查询数据和数据对应的处理方法,在使用表数据的过程中,然后查找对应的处理方法来实现不同的处理程序。

从功能的角度来看,表驱动方法非常熟悉切换案例查询控制过程,但是表驱动方法的优点在于数据和处理分离,合适的表结构,当工程师扩展时该功能只需要添加相应的表项就足够了,通常不需要更改表处理部分。

如果仅使用switch-case,大量的case分支将显着增加程序的复杂性,这对于查找,排除故障和维护非常不方便。

但是,当前表驱动设计中的大多数人认为,只有固定的结构数组方法。

实际上,有两种表项也很常用。

以下错误将一一介绍给您。

2三种表驱动设计1静态结构数组类型构造这种表项组织是每个人都知道的表驱动方法的第一件事,也是上面介绍最多的一种。

其他两种表驱动方法只是该方法的基础。

更加灵活地组织表条目。

表驱动的设计主要有两个方面:1)对象数据设计; 2)对象数据设计。

2)对象关系设计。

以下是菜单表驱动的简单示例,也是最常用的菜单表驱动。

#include& nbsp;#include& nbsp; typedef& nbsp; struct& nbsp;& nbsp; _tag_Menu& nbsp; stMenu;& nbsp; struct& nbsp;& nbsp; _tag_Menu {无效(* MenuPrepare)(无效); int(* MenuMessage)(无效); void(* MenuBack)(void); //下面省略了相关的接口数据区域}; stMenu& nbsp; sMenu []& nbsp; =& nbsp; {& nbsp;& nbsp;& nbsp;& nbsp; {" Main& UI”,MainUIPrepare,MainUIMessage,MainUIBack}, & nbsp;& nbsp; {nbsp; UI1”,SecUI1Prepare,SecUI1Message,SecUI1Back},& ; nbsp;& nbsp; {“ Sec& nbsp; UI2”,SecUI2Prepare,SecUI2Message,SecUI2Back}, """" {nbsp;""""""""""""""""""""""""""" ,ThdUI2Prepare,ThdUI2Message,ThdUI2Back}}。

int curr = 0; int NextMenu& nbsp; = 0; int main(int argc,char * argv []){while(1)& nbsp; {& nbsp;& nbsp;& nbsp;& nbsp;& nbsp; NextMenu& nbsp; =& nbsp ; sMenu [currMenu] .MenuMessage(); //接口消息处理if(NextMenu& nbsp;!=& nbsp; currMenu)//需要进行接口切换{& nbsp;& nbsp;& nbsp;& nbsp;& nbsp;& nbsp; & nbsp; sMenu [currMenu] .MenuBack(); //逐步退出并保存sMenu [NextMenu] .MenuPrepare(); //为新界面的初始化做准备currMenu& nbsp; =& nbsp;& nbsp; NextMenu; //更新接口索引}& nbsp;}返回0;}如果以后需要添加新的菜单接口,则只需修改驱动程序表的输入部分,而过程控制部分则基本不变。

但是,在这种表设计中,每个删除操作都需要移至全局静态结构数据表,以便此处不直接修改公共部分。

2链表构造。

上面的数组是一个连续的静态区域。

但是,为了更好地增加表构造的灵活性,这里我们使用链表和其他非连续数据结构来组织表项。

新模块只需要在初始化过程中添加一个链表结构即可。

链接列表中的每个项目都类似于先前的数组项目,并且可以通过在用于相应处理的过程中遍历链接列表来获得相应的接口。

当然,链表只是组织方法之一,其他更快的遍历数据结构也适用。

3链接的构造读过Linux或uboot源代码的朋友应该知道这种方法。

此方法也是对数组表的改进。

数组表可以看作是程序员人为地组织条目。

因此,为了最大程度地减少人为干预,您只需要根据