表驱动法

Posted liam-ji

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了表驱动法相关的知识,希望对你有一定的参考价值。

表驱动法是一种编程模式——从表里面查找信息而不使用逻辑语句(ifcase)。

表驱动法使用总则

在适当的环境下,采用表驱动法,所生成的代码会比复杂的逻辑代码更简单、更容易修改,而且效率更高。

使用表驱动法的两个问题

使用表驱动法必须先解决两个问题。首先,你必须要回答怎样从表中查询条目的问题。其次是考虑在表中存些什么。

直接访问表

和所有的查询表一样,直接访问表代替了更为复杂的逻辑控制结构。之所以说它们是“直接访问”的,是因为你 无须绕很多复杂的圈子就能够在表里面找到你想要的信息。

索引访问表

有时候,只用一个简单的数学运算还无法将数据转换成表键值。这类情况中的一部分可以通过使用索引访问的方法加以解决。

当你使用索引的时候,先用一个基本类型的数据从一张索引表中查出一个键值,然后再用这一键值查出你感兴趣的主数据。

索引访问技术有两个主要优点:

  1. 首先,如果主查询表中的每一条记录都很大,那么创建一个浪费了很多空间的索引数组所用的空间,就要比创建一个浪费了很多空间的主查询表所用的空间小得多;
  2. 其次,即使你用了索引以后没有节省内存空间,操作位于索引中的记录有时也要比操作位于主表中的记录更方便更廉价;
  3. 索引访问技术的最后一个优点是表查询技术在可维护性上所具有的普遍优点。

访问阶梯表

使用阶梯技术时需要注意的细节:

  • 留心端点;
  • 考虑使用二分查找代替顺序查找;
  • 考虑用素银访问来取代阶梯技术;
  • 把阶梯表查询操作提取成单独的子程序。

核对表:表驱动法

  • [ ] 你考虑过把表驱动法作为复杂逻辑的替换方案吗?
  • [ ] 你考虑过把表驱动法作为复杂集成结构的替换方案吗?
  • [ ] 你考虑过把表数据存储在外部并在运行期间读入,以便在不修改代码的情况下就可以改变这些数据吗?
  • [ ] 如果无法用一种简单的数组索引去访问表,那么你把计算访问键值的功能提取成单独的子程序,而不是在代码中重复地计算键值吗?

要点

  • 表提供了一种复杂的逻辑和集成结构的替换方案;
  • 使用表的一项关键决策是决定如何去访问表;
  • 使用表的另一项关键决策是决定应该把什么内容放入表中。

以上是关于表驱动法的主要内容,如果未能解决你的问题,请参考以下文章

表驱动法——直接访问表示例1

C++的表驱动法

回调函数和表驱动法编程

回调函数和表驱动法编程

数据驱动编程与表驱动法(多if-else结构精简)

数据驱动编程与表驱动法(多if-else结构精简)