您的位置:首页 > 编程语言

表驱动法----代码大全2,第18章学习笔记

2011-04-10 20:11 218 查看
0. 一个原则,多种好处

编写到表里的数据,比嵌入到代码中的数据更易于维护。表驱动法的核心思想,就是帮助编程人员将融入到程序结构中的那些数据提取出来。这里的“那些数据”是指逻辑判断数据。这样做的好处是,代码逻辑更清晰,更易于维护。

1. 什么是“表驱动法”

表驱动法是一种设计模式。所谓设计模式就是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。

2. 为什么叫这个名字

表驱动法是使用数据作为驱动程序进行逻辑判断的一种方法,因为数据一般都是用表结构组织的,所以称作“表驱动法”。

3. 两个核心问题:如何查询 + 表中存放什么数据

这两个问题是相辅相成的,“如何查询”决定了“表中存放什么数据”。所以“如何查询”才是最主要的问题。常用的查询方法有三种:直接访问,索引访问,阶梯访问。

4. 直接访问:

什么时候用它:能直接看到判断条件与判断结果对应关系的时候。

1)简单一点的例子(根据index直接获得判断数据):判断一个月应该有多少天

1> 非表驱动方法----传统的逻辑判断的笨法

if (month == 1)
days = 31;
else if ((month == 2) && (leapyear == true))
days = 29;
else if ((month == 2) && (leapyear == false))
days = 28;
else if (month == 3)
days = 31;
else if (month == 4)
days = 30;
else if (month == 5)
days = 31;
else if (month == 6)
days = 30;
else if (month == 7)
days = 31;
else if (month == 8)
days = 31;
else if (month == 9)
days = 30;
else if (month == 10)
days = 31;
else if (month == 11)
days = 30;
else if (month == 12)
days = 31;
else
cout << "Wrong input!" << endl;

2> 表驱动方法----先进得让你产生一种错觉:if语句是多余的,但你要明白这仅仅是错觉...

// 下面的数组就是代替逻辑语句的数据表,也就是表驱动的数据基础
int days_of_month[12] = {31, 28+int(leapyear), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
// 下面的语句是对数据表的应用,代替逻辑判断获得结果
days = days_of_month[month];

表驱动方法的结果就是使程序代码“结构更清晰,更易于维护”。

2)复杂一点的例子,越复杂越能体现先进方法的优越性(先对问题进行抽象,建立数学模型,然后根据index直接或间接地获得判断数据):解析并打印消息。

问题说明:我们的任务是打印一些二进制格式的消息文件,每一个文件有上百条消息;所有的消息分为约20种类型,每种类型的消息都有自己的数据格式(这里可以类比struct结构体);每种类型的消息都是6种数据类型的排列组合。(详细内容见《代码大全2:第十八章》)

5. 索引访问

什么时候用它:需要将“判断条件”与“判断结果”的实际对应关系,变得复杂的情况我们使用索引表作为中间表对应判断结果。如下所示:判断条件<---->|条件索引:结果索引|<---->判断结果。很多时候,出于时间复杂度和空间复杂度的考虑,我们需要把对应关系做得复杂一些,这方面最好的例子就是“操作系统中的虚拟内存”。(详细内容见《代码大全2》:第十八章)

6. 阶梯访问

什么时候用它:无法构造index(最典型的例子就是当键值不是整数的时候);数据呈现出较为明显的分段形态。(详细内容见《代码大全2:第十八章》)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: