天天看点

《代码大全》学习笔记——第十八章,表驱动法

第十八章,表驱动法

前言

表驱动法是一种编程模型( 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、  使用表的另一项关键决策时把什么内容放在表中。

把表驱动法写成一个基础库。

继续阅读