表驱动法是一种编程模式(scheme)–从表里面查找信息而不使用逻辑语句(if和case),事实上,凡是能通过逻辑语句来选择的事物,都可以通过查表来选择。
表驱动法使用总则
在适当的环境下,采用表驱动法,所生成的代码会比复杂的逻辑代码更简单、更容易修改,而且效率更高。
使用表驱动法的两个问题
- 必须要回答的是怎样从表中查询条目的问题?(从表里查询记录的方法:直接访问、索引访问、阶梯访问)
- 你应该在表里存些什么?(数据或者动作)
直接访问表
- 计算每个月中的天数,把每个月的天数存在一张表里
- 计算保险费率,费率随着年龄、性别、婚姻以及吸烟与否的不同情况而变化。使用逻辑控制结构,代码变得很复杂与繁琐
更好的做法是把这些费率存入所有因素索引的数组里
灵活的消息格式
在基于逻辑的方法中,其消息阅读子程序包含一个循环,用来读入消息、解释其ID,以及根据该ID调用20个子程序中的某一个。
采用面向对象的方法,那么问题的逻辑可言被隐藏在对象继承结构里,但是基本结构还是同样复杂。
采用表驱动法:
采用此方法,比前面两种都更经济,其中消息的阅读子程序由一个循环组成,该循环复杂读入每一个消息头,对其ID解码,在Message数组中查询其消息描述,然后每次调用同一个子程序来解释该消息。
构造键值对
构造键值对的方法:
- 复制信息从而能够直接使用键值
- 转换键值以使其能够直接使用:用一个函数将age转换成另一个数值
- 把键值转换提取成独立的子程序:如果必须构造一些数据来让它们像表键值一样使用,那么就把数据到键值的转换操作提取成独立的子程序。
索引访问表
当使用索引的时候,先用一个基本类型从一张索引表中查出一个键值,然后再利用这一键值查出感兴趣的主数据。
阶梯访问表
阶梯结构的基本想法是,表中的记录对于不同的数据范围有效,而不是对不同的数据点有效。
举例,等级区间:
小结
表提供了一种复杂的逻辑和继承结构的替换方案。如果你发现自己对某个应用程序的逻辑或者继承树关系感到困惑,那么问问自己是否通过一个差选表来加以简化
使用表的一项关键决策时决定如果去访问表。你可以采取直接访问、索引访问或者阶梯访问。
使用表达另一项关键决策时决定应该把什么内容放入表中。