0. 一个原则,多种好处
编写到表里的数据,比嵌入到代码中的数据更易于维护。表驱动法的核心思想,就是帮助编程人员将融入到程序结构中的那些数据提取出来。这里的“那些数据”是指逻辑判断数据。这样做的好处是,代码逻辑更清晰,更易于维护。
1. 什么是“表驱动法”
表驱动法是一种设计模式。所谓设计模式就是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。
2. 为什么叫这个名字
表驱动法是使用数据作为驱动程序进行逻辑判断的一种方法,因为数据一般都是用表结构组织的,所以称作“表驱动法”。
3. 两个核心问题:如何查询 + 表中存放什么数据
这两个问题是相辅相成的,“如何查询”决定了“表中存放什么数据”。所以“如何查询”才是最主要的问题。常用的查询方法有三种:直接访问,索引访问,阶梯访问。
4. 直接访问:
什么时候用它:能直接看到判断条件与判断结果对应关系的时候。
1)简单一点的例子(根据index直接获得判断数据):判断一个月应该有多少天
1> 非表驱动方法----传统的逻辑判断的笨法
2> 表驱动方法----先进得让你产生一种错觉:if语句是多余的,但你要明白这仅仅是错觉...
表驱动方法的结果就是使程序代码“结构更清晰,更易于维护”。
2)复杂一点的例子,越复杂越能体现先进方法的优越性(先对问题进行抽象,建立数学模型,然后根据index直接或间接地获得判断数据):解析并打印消息。
问题说明:我们的任务是打印一些二进制格式的消息文件,每一个文件有上百条消息;所有的消息分为约20种类型,每种类型的消息都有自己的数据格式(这里可以类比struct结构体);每种类型的消息都是6种数据类型的排列组合。(详细内容见《代码大全2:第十八章》)
5. 索引访问
什么时候用它:需要将“判断条件”与“判断结果”的实际对应关系,变得复杂的情况我们使用索引表作为中间表对应判断结果。如下所示:判断条件<---->|条件索引:结果索引|<---->判断结果。很多时候,出于时间复杂度和空间复杂度的考虑,我们需要把对应关系做得复杂一些,这方面最好的例子就是“操作系统中的虚拟内存”。(详细内容见《代码大全2》:第十八章)
6. 阶梯访问
什么时候用它:无法构造index(最典型的例子就是当键值不是整数的时候);数据呈现出较为明显的分段形态。(详细内容见《代码大全2:第十八章》)