目录

前言

18.1 表驱动法使用总则

18.1.1 使用表驱动法的两个问题

18.2 直接访问表

18.2.1 示例:一个月中的天数

18.2.2 示例:保险利率

18.2.3 例子:灵活的消息格式

18.3 索引访问表

18.4 阶梯访问表

18.5 表查询的其他示例


《Code_Complete_2》持续更新中......_@来杯咖啡的博客-CSDN博客这本书有意设计成使你既可以从头到尾阅读,也可以按主题阅读。1. 如果你想从头到尾阅读,那么你可以直接从第2章“用隐喻来更充分地理解软件开发”开始钻研。2. 如果你想学习特定的编程技巧,那么你可以从第6章“可以工作的类”开始,然后根据交叉引用的提示去寻找你感兴趣的主题。3. 如果你不确定哪种阅读方式更适合你,那么你可以从第3章3.2节“辦明你所从事的软件的类型”开始。.....................https://blog.csdn.net/qq_43783527/article/details/126275083

前言

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

  • 事实上,凡是能通过逻辑语句来选择的事物,都可以通过查表来选择
  • 对简单的情况而言,使用逻辑语句更为容易和直白。但随着逻辑链的越来越复杂,查表法也就愈发显得更具吸引力。

18.1 表驱动法使用总则

在适当的环境下,采用表驱动法,所生成的代码会比复杂的逻辑代码更简单、更容易修改,而且效率更高。假设你希望把字符划分成字母、标点符号和数字三类,那么你也许会用到下面这种复杂的逻辑链:

另一方面,如果用一个查询表(lookup table),就可以把每一个字符的类型保存在一个用字符编码访问的数组里。那么上述的复杂代码片段就可以替换为:

 这段代码假设 charTypeTable 数组己经提前创建好了。这时你把程序中的信息存放在数据里而不是逻辑里——也就是说,放在表中而不是if检测中。

18.1.1 使用表驱动法的两个问题

在使用表驱动法的时候,必须要解决两个问题:

1、首先,你必须要回答怎样从表中查询条目的问题。你可以用一些数据来直接访问表。比如说,如果你希望把数据按月进行分类,那么创建一个月份表是非常直截了当的。你可以用一个下标从1到12的数组实现它。
        另一些数据可能很难直接用于查表。例如,假设你希望按照社会安全号码做数据分类,那么除非你可以承受在表里面存放 999-99-9999 条记录,否则就不能用社会安全号码直接查表。你会被迫采用一种更为复杂的方法。下面是从表里面查询记录的方法列表:

  • 直接访问(Direct access)
  • 索引访问 (Indexed access)
  • 阶梯访问(Stair-step access)

本章后面部分将就这其中的每一种访问方法展开详细讨论。

2、在使用表驱动法的时候,需要解决的第二个问题是,你应该在表里面存些什么

  1. 有的时候,表查询出来的结果是数据。如果你遇到的是这种情况,那么就可以把这些数据保存到表里面。
  2. 在另外一些情况下,表查询出来的结果是动作(action)。在这种情况下,你可以保存一个描述该动作的代码,或者,在有些语言里,你可以保存对实现该动作的子程序的引用。

无论是哪一种情况,表都会变得更为复杂。

18.2 直接访问表

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

18.2.1 示例:一个月中的天数

假设你需要计算每个月中的天数(为了说明起见,此处不考虑闰年)。笨做法就是写一个大的if语句:

 

如果把闰年也考虑进来,那么那条长长的 if语句将会变得更为复杂了。
        计算每月的天数是一个很适合用直接访问表描述的例子,因为你可以用month 变量去表里面查询记录。一般来说,你可以用原本控制着很多 if语句的数据去直接访问表。

18.2.2 示例:保险利率

假设你在写一个计算医疗保险费率的程序,这些费率是随着年龄、性别、婚姻状况以及吸烟与否的不同情况而变化的。如果你不得不用逻辑控制结构来表示不同费密的话,那么可能会写出下面的代码。

这是简化的逻辑结构,它应该已经能让你对事情的复杂度有足够的了解了。它还没有显示已婚的女士、所有的男土或者18至65 岁之间的人士。你可以想象:如果要把整个费率表编写出来该有多复杂。

你也许会说,“是的,可为什么你要为每一个年龄都做一次判断呢?为什么不把这些费率放进用年龄作下标的数组里?”好问题,而一种显而易见的改进就是把在每一年龄的费率存在一个独立数组里。

然而,更好的做法是把这些费率存入所有因素索引的数组里,而不仅仅是按年龄索引。你可以在 Visual Basic 中这样声明数组:

在声明了这个数组以后,你还需要找一种把数据存进去的方法。你可以使用赋值语句、从磁盘文件中读入数据、计算出这些数据、或者执行任何合适的操作。一旦备好了这些数据,在需要计算费率时,你就可以直接获取结果了。前面那段复杂的逻辑就可以用类似于下面这样简单的语句取而代之:

18.2.3 例子:灵活的消息格式

可以考虑去书中看一下详细的例子以及讲解,此处略。

18.3 索引访问表

18.4 阶梯访问表

18.5 表查询的其他示例

《代码大全2》第18章 表驱动法相关推荐

  1. 读书笔记_代码大全_第14章_组织直线型代码_第15章_使用条件语句

    组织直线型代码 + 使用条件语句 希望我的读书笔试能带你翻过18页的书 http://www.cnblogs.com/jerry19880126/ <代码大全>第14章和第15章的内容比较 ...

  2. 读书笔记_代码大全2第七章_高质量的子程序

    创建子程序的正当理由 降低复杂度 把嵌套的部分提取出来形成一个独立的子程序,可以降低外围子程序的复杂度. 引入中间,易懂的抽象 避免代码重复 支持子类化 可覆盖的子程序保持简单,那在实现派生类时也会减 ...

  3. 链表线性表及其操作c语言代码大全,用链表实现线性表的各种操作(C语言)

    #include # include # include //定义节点结构体 typedef struct Node { int data;//数据域 struct Node * pNext;//指针 ...

  4. 读书笔记_代码大全2第十一章_选择好的变量名

    选择好的变量名的注意事项 名字要准确的描述出该变量所代表的事物(eg:好的变量名:currentDate,todayDate坏的变量名:cd,date) 以问题为导向 平均长度在10-16和8-20个 ...

  5. 代码大全(Code Complete)-- 目录和关键点

    读后感 <代码大全>是一本指导"代码构建"的书,指导我们如何写出优秀的代码,如何成为优秀的程序员. 这样一本900多页的大部头书,当我们基于既往的编程经验,在读每一个部 ...

  6. 【转】读《代码大全2》

    第1部分 打好基础 译序   应该首先为人编写代码,其次才是为机器   第1章 欢迎进入软件构建的世界   提高关键的质量和开发者的生产效率都是很重要的   构建活动会占到整个软件开发时间的30%~8 ...

  7. 《代码大全2》读书笔记

    第7章 高质量的子程序 7.1 创建子程序的正当理由 降低/隔离复杂度,隐藏实现细节,引入中间的.易懂的抽象 避免代码重复,支持子类化 提高可移植性,限制变化所带来的影响 简化复杂的逻辑判断,改善性能 ...

  8. 《代码大全》到底讲什么?

        <代码大全 (中文版)第二版>到底讲什么?她讲的是哪种编程语言?C.C++.Java.C# 还是 Visual Basic?列出的代码全吗?我能从中直接copy&paste ...

  9. 《代码大全2》读书笔记 Week 1

    <代码大全2>第一.二.三章 隐喻思维在西方是一个热门的话题,隐喻的认知功能在各个学科正受到越来越多的重视,依照我的理解,其实就是以众所周知或者理解主体熟悉的事物为符号去将新事物.新概念具 ...

最新文章

  1. 软件测试体系划分与职业素养
  2. Python基础教程(十一):多线程、XML解析
  3. stm32 led屏控制卡_室内LED显示屏如何安装?
  4. CF1338D:Nested Rubber Bands(树形dp)
  5. Scala.js:将Scala编译为JavaScript的编译器
  6. 时序数据库influxdb+grafana
  7. 【问题解决方案】CentOS7替换yum的问题:使用yum makecache出现File contains no section headers
  8. android 双系统 一加5,[一加2][双ROM]一加手机2安装双系统教程
  9. [转载]Qt之获取本机网络信息_vortex_新浪博客
  10. 有关 delphi7读取 excel 报错EoleException with message '未找到提供程序,该程序可能未能正确安装' 解决方式
  11. medsem-中介效应:基于结构方程模型SEM的中介效应分析
  12. #《神奇动物:邓布利多之谜》
  13. Simple Usage of Sort in Golang
  14. QQ服务器维护一般多久,QQ扩列升级要多久?QQ扩列升级维护到什么时候结束
  15. 怎样将微信热门文章采集到自己的公众号中?
  16. abs、fabs、fabsf函数的用法区别
  17. 系统稳定性指标计算器
  18. mysql数据库 菜鸟_数据库-MySQL入门
  19. 计算机网络技术班级16字口号,校运会班级口号16字押韵有气势
  20. 小波变换 wavelet 2

热门文章

  1. logging buffer
  2. kube-flannel版本从v0.12.0升级到v0.15.1
  3. Linux 搜索文件和文件夹的 4 种简单方法
  4. 高校小姐姐拍了拍你,你有一台天猫精灵待领取
  5. 仿抖音-视频及直播点赞效果
  6. 浏览器的 5 种 Observer,你用过几种?
  7. 关于H5页面在ios上打开,页面空白的问题
  8. NetWorking(网络)
  9. 多个极兔快递单号的物流信息要怎么同时查询
  10. 医学SCI论文关键词的选取方法