表驱动法----代码大全2,第18章学习笔记
2011-04-10 20:11
218 查看
0. 一个原则,多种好处
编写到表里的数据,比嵌入到代码中的数据更易于维护。表驱动法的核心思想,就是帮助编程人员将融入到程序结构中的那些数据提取出来。这里的“那些数据”是指逻辑判断数据。这样做的好处是,代码逻辑更清晰,更易于维护。
1. 什么是“表驱动法”
表驱动法是一种设计模式。所谓设计模式就是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。
2. 为什么叫这个名字
表驱动法是使用数据作为驱动程序进行逻辑判断的一种方法,因为数据一般都是用表结构组织的,所以称作“表驱动法”。
3. 两个核心问题:如何查询 + 表中存放什么数据
这两个问题是相辅相成的,“如何查询”决定了“表中存放什么数据”。所以“如何查询”才是最主要的问题。常用的查询方法有三种:直接访问,索引访问,阶梯访问。
4. 直接访问:
什么时候用它:能直接看到判断条件与判断结果对应关系的时候。
1)简单一点的例子(根据index直接获得判断数据):判断一个月应该有多少天
1> 非表驱动方法----传统的逻辑判断的笨法
2> 表驱动方法----先进得让你产生一种错觉:if语句是多余的,但你要明白这仅仅是错觉...
表驱动方法的结果就是使程序代码“结构更清晰,更易于维护”。
2)复杂一点的例子,越复杂越能体现先进方法的优越性(先对问题进行抽象,建立数学模型,然后根据index直接或间接地获得判断数据):解析并打印消息。
问题说明:我们的任务是打印一些二进制格式的消息文件,每一个文件有上百条消息;所有的消息分为约20种类型,每种类型的消息都有自己的数据格式(这里可以类比struct结构体);每种类型的消息都是6种数据类型的排列组合。(详细内容见《代码大全2:第十八章》)
5. 索引访问
什么时候用它:需要将“判断条件”与“判断结果”的实际对应关系,变得复杂的情况我们使用索引表作为中间表对应判断结果。如下所示:判断条件<---->|条件索引:结果索引|<---->判断结果。很多时候,出于时间复杂度和空间复杂度的考虑,我们需要把对应关系做得复杂一些,这方面最好的例子就是“操作系统中的虚拟内存”。(详细内容见《代码大全2》:第十八章)
6. 阶梯访问
什么时候用它:无法构造index(最典型的例子就是当键值不是整数的时候);数据呈现出较为明显的分段形态。(详细内容见《代码大全2:第十八章》)
编写到表里的数据,比嵌入到代码中的数据更易于维护。表驱动法的核心思想,就是帮助编程人员将融入到程序结构中的那些数据提取出来。这里的“那些数据”是指逻辑判断数据。这样做的好处是,代码逻辑更清晰,更易于维护。
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:第十八章》)
相关文章推荐
- MySQL入门很简单-学习笔记 - 第18章 性能优化
- MySQL入门很简单-学习笔记 - 第18章 性能优化
- scala编程第18章学习笔记——有状态的对象
- java JDK8 学习笔记——第18章 自定义泛型、枚举与注释
- Linux 学习笔记 -- 第四部分 Linux 使用着管理 -- 第18章 认识系统服务
- .C++ primer第二次阅读学习笔记(第18章:特殊工具与技术:优化内存分配)
- C++ primer第二次阅读学习笔记(第18章:特殊工具与技术:运行时类型识别、extern。。。)
- Jersey 2.22.2 官方文档第18章学习笔记
- 《SQL查询凡人入门》学习笔记之一
- ITCAST视频-Spring学习笔记(使用Spring的注解方式实现AOP入门)
- uboot第一阶段学习笔记(arm920t/start.S)
- JSTL学习笔记3-----URL相关标签的使用
- php学习笔记(五)函数
- 韩顺平_php从入门到精通_视频教程_第18讲_浮动_学习笔记_源代码图解_PPT文档整理
- 黑马程序员--wpf学习笔记六----数据操作相关
- NetworkX学习笔记-3-Python中输出Gephi文件格式的方法
- MSP430F5438 I2C学习笔记——AT24C02
- JAVA学习笔记(8)
- ASP.NET MVC 学习笔记(一)
- Android开发学习笔记(五):关于R.java消失或无法更新的问题