第十八章 表驱动法

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

表驱动法使用总则

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

使用表驱动法的两个问题

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

直接访问表

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

索引访问表

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

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

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

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

访问阶梯表

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

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

核对表:表驱动法

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

要点

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

原文地址:https://www.cnblogs.com/liam-ji/p/11544419.html

时间: 2024-10-12 18:14:14

第十八章 表驱动法的相关文章

Gradle 1.12 翻译——第十八章. 日志

有关其他已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或访问:http://gradledoc.qiniudn.com/1.12/userguide/userguide.html 本文原创,转载请注明出处:http://blog.csdn.net/maosidiaoxian/article/details/41241915 关于我对Gradle的翻译,以Github上的项目及http://gradledoc.qin

Gradle 1.12用户指南翻译——第三十八章. Eclipse 插件

本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://github.com/msdx/gradledoc 本文翻译所在分支: https://github.com/msdx/gradledoc/tree/1.12. 直接浏览双语版的文档请访问: http://gradledoc.qiniudn.com/1.12/userg

MiS603开发板 第十八章 模拟视频输入及测试

作者:MiS603开发团队 日期:20150911 公司:南京米联电子科技有限公司 论坛:www.osrc.cn 网址:www.milinker.com 网店:http://osrc.taobao.com EAT博客:http://blog.chinaaet.com/whilebreak 博客园:http://www.cnblogs.com/milinker/ MiS603开发板 第十八章 模拟视频输入及测试 18.1模拟视频概述 大自然的信号都是模拟的,视频信号也不例外.视频信号是指电视信号.

Gradle 1.12用户指南翻译——第二十八章. Jetty 插件

其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://github.com/msdx/gradledoc/tree/1.12. 直接浏览双语版的文档请访问: http://gradledoc.qiniudn.com/1.12/userguide/userguide.html. 另外,Android 手机用户可通过我写的一个程序浏览文档,带缓存功能的,目前

【转】 数据驱动编程之表驱动法

http://blog.csdn.net/chgaowei/article/details/6966857 本文示例代码采用的是c语言.之前介绍过数据驱动编程<什么是数据驱动编程>.里面介绍了一个简单的数据驱动手法.今天更进一步,介绍一个稍微复杂,更加实用的一点手法——表驱动法.关于表驱动法,在<unix编程艺术>中有提到,更详细的描述可以看一下<代码大全>,有一章专门进行描述(大概是第八章). 简单的表驱动:<什么是数据驱动编程>中有一个代码示例.它其实也

第十八章 Linux集群架构

18.1 集群介绍集群概述根据功能划分为两大类:高可用和负载均衡.1)高可用集群通常为两台服务器,一台工作,另外一台作为冗余,当提供服务的机器宕机,冗余将接替继续提供服务实现高可用的开源软件有:heartbeat.keepalived.后者好用,前者好久未更新了.2)负载均衡集群,需要有一台服务器作为分发器,它负责把用户的请求分发给后端的服务器处理,在这个集群里,除了分发器外,就是给用户提供服务的服务器了,这些服务器数量至少为2.实现负载均衡的开源软件有LVS.keepalived.haprox

第四十八章

第四十八章1 人生的“减法”,你会做吗? 为学者日益,为道者日损 把事情当做学问来研究的人,欲望越来越多,追求道的人,欲望越来越少. 做“减法”是我们需要的人生智慧. 各位亲爱的朋友,我们今天接着来聊<道德经>.今天来到了新的一章,四十八章,各位一定要好好学第四十八章,因为四十八章里的话特别的有用.特别的深刻. 我们先来学头两句,老子说,“为学者日益,为道者日损”,就这两句话,里边道理非常深,我给大家先解释一遍,“为学者日益”就是把事情当做学问来研究的,这些人做事越做越多,学的越学越多,也就是

《Linux内核设计与实现》读书笔记 第十八章 调试

第十八章调试 18.1 准备开始          需要准备的东西: l  一个bug:大部分bug通常都不是行为可靠而且定义明确的 l  一个藏匿bug的内核版本:找出bug首先出现的版本 l  相关内核代码的知识和运气 最好能让bug重现,有一些bug存在而且有人没办法让他重现,因为内核与用户程序和硬件间的交互很微妙. 18.2内核中的bug 可以有无数种原因产生,表象也变化多端.代码中的错误往往引发一系列连锁反应,目击者才看到bug. 18.3通过打印来调试 内核提供了打印函数printk

关于表驱动法的思考

目前在学习软件构造课程中表驱动法的内容,了解后觉得它在处理涉及多个if-else问题时十分有用,下面提供一些简单的我对表驱动法的理解以及其在java中应用的小例子. 表驱动法,顾名思义,是用查表方式来获取数据,涉及到了表的结构.表是一种在很多语言中常见的数据结构,比如在java中我们使用map键值对集合的形式来定义表.关于java中map的用法如下: 创建: Type map = new HashMap(); 删除: map.clear(); 添加键值对: map.set(key,value);