第十八章,表驱动法
前言
表驱动法是一种编程模型( scheme )——从表中查找信息而不是使用逻辑语句( if 或 else )。
对于表驱动法一定要慎用。如果逻辑很复杂,导致逻辑判断链很长,使用表驱动法有助于降低复杂度。否则,表驱动法只会增加复杂度。
18.1 表驱动法使用总则
使用表驱动法的两个问题:
1、 如何从表中查询条目。三种方法:直接访问( Directory access )表,索引访问( Index access )表,阶梯访问( Stair-step access )表。
2、 表中要保存什么。可能是数据,函数指针,对象实例等。
18.2 直接访问表
灵活的消息格式:
这里介绍了一个通用的表驱动法。核心的思想仍然是通过抽象,隔离变化,使变化的影响降低到最低,使代码对变化是友好的。
构造查询键值:
1、 复制信息从而能够直接使用键值。
2、 转换键值以使其能够直接使用。对键值进行转换,得到直接的索引值。这里可以在增加一个新的查询表。
3、 把键值转换提取层单独的子程序。
18.3 索引访问表
18.4 阶梯访问表
基本思想:表中的记录对于不同的数据范围有效,而不是对不同的数据点有效。
注意细节:
1、 留心端点。
2、 考虑用二分查找代替顺序查找。
3、 考虑用索引访问代替阶梯访问。索引访问速度快,占内存。阶梯访问速度慢,省内存。
4、 把阶梯中的查询操作提取成单独的子程序。
18.5 表查询的其他示例
CHECKLIST: Table-Driven Methods核对表:表驱动法1、 你考虑过把表驱动法作为复杂逻辑的替代方案吗? 2、 你考虑过把表驱动法作为复杂继承结构的替代方案吗? 3、 你考虑过把数据存储在程序外部,以便在不用修改代码的情况下,更改这些数据吗? 4、 如果无法用一种简单的数组索引去访问表,那么你把计算访问键值的功能提取成单独的子程序,而不是在代码中重复的计算键值了吗? |
本章要点
1、 表提供了一种复杂的逻辑和继承结构的替代方案。如果你发现自己对某个程序的逻辑和继承关系感到困惑时,那么问问自己它是否可以通过一个查询表来简化。
2、 使用表的一项关键决策时如何去访问表。你可以采取直接访问,索引访问,或者阶梯访问。
3、 使用表的另一项关键决策时把什么内容放在表中。
把表驱动法写成一个基础库。