【现代程序设计】加分作业2-《代码大全》第18章表驱动法阅读报告

摘要:笔者对《代码大全》第18章 表驱动法进行了仔细地学习和理解,并将阅读报告记录在此文中。第18章 表驱动法:将复杂的逻辑判断转换为查表,从而简化代码的编写与维护。另外,本章中的一个示例说明了,面向对象设计并不只要因为它是“面向对象”,就一定会好于其他的设计。

引言

表驱动法是一种编程模式——从表里面查找信息而不使用逻辑语句(if和case)。凡是能通过逻辑语句来选择的事物,都可以通过查表来选择的事物,都可以通过查表来选择。对简单情况而言,使用逻辑语句来选择的事物更加容易和直白。但是随着逻辑链越来越复杂,查表法就愈发显得更具吸引力。

 

表驱动法使用总则

适当环境下,采用表驱动法,生成的代码会比复杂逻辑代码更简单和更容易修改,同时效率更高。对字符进行分类的操作,如果使用逻辑,代码将会显得多而复杂,而使用刚查询表,只需从建好的表中查询就可得到。

在使用表驱动法之前,要解决两个问题。

一是怎样从表中查询,或者说如何访问。这里可采用如下几种方法:

1、直接访问

2、索引访问

3、阶梯访问

以上这三种方法将在下面展开讨论。

第二个问题是在表里应该存储什么。保存数据还是动作代码,或者引用。

 

直接访问表

意即无需绕过复杂的圈子就能在表里找到自己想要的信息。

示例 确定每个月的天数

假设要计算每个月的天数(你考虑闰年),比较笨的方法是写一个if语句。另一种更简单更容易的方法就是把这些数据存到表里,int Month[12]={31,28,31,30,31,30,31,31,30,31,30,31}。于是直接用下标访问即得所要数据。

 

示例 保险费率

根据不同年龄,性别,婚姻状况等情况计算保险费率,若采用逻辑控制结构,代码将冗长而不清晰。而实质上更好的做法是把这些情况都放进各自的一个表里,通过查询的方式计算出来。

 

以上几个例子,包括类似与以上例子的应用场景,如果采用逻辑控制的方法,可以想象,这将写出十分难看、不清晰、冗长的代码,即使是面向对象的方法,逻辑被封装在结构中,但是实际上的代码还是那样复杂。而表驱动法得显得清晰直观,又易于编写与修改。

 

构造查询键值

以上示例,可以将数据作为键值直接访问表。当然你也总是希望能直接得到访问表的键值,但是有时候这样做并不成功。例如每个年龄段有一种费率,便不能直接用年龄作为表的键值。因为这些表只为一些年龄保存了费率。有几种方法可以构造键值:

1、复制信息从而能够直接使用键值。为每个年龄复制一份费率。这种方式结构简单,操作简单。但是信息冗余,浪费空间,且表中错误可能性增加。

2、转换键值以使其能够直接使用。

3、把键值转换提取成独立的子程序。避免不同位置执行了不同转换,也是操作修改起来更容易。

 

索引访问表

有时候只用一个简答的数学运算还不能把数据转换为表键值,那也许可以采用索引访问的方法解决。使用索引时,先用一个基本类型的数据从一张索引表中查出一个键值,然后再用这个键值查出主数据。

优点在于:空间小,操作更方便和廉价,可维护性高。

 

阶梯访问表

不像访问索引结构那样直接,但比索引方法节省空间。实质上就是给数据划分区间,在区间内做索引。灵活而容易修改。但是需要注意一些细节:

1、留心端点。确认考虑到每个阶梯区间的上界。

2、考虑用二分查找取代顺序查找

3、考虑用索引访问取代阶梯技术。阶梯操作可能比较耗时

4、把阶梯表查询操作提取成单独的子程序

 

阅读感想和总结

在仔细地看了第18章之后,我发现这个“表驱动法”,听起来高端,但实质上我们平时最可能用上的就有直接访问表。当然只是一个初级的应用,但是确实感觉到书里所说的表驱动法的优势和吸引力。看完这章,在学到书面上的知识之外,我还深深感觉到:代码是一门艺术。每个细节都可以做得更好!事实上,当我第一次看到书前面部分对整本书的介绍时,我感到这本书不愧是经典。如果真的学完了,那代码的编写水平定当上一个台阶,甚至一个境界。这本书值得看,我也应该抽出时间好好学习它。

 

转载于:https://www.cnblogs.com/Lmeng/p/3479118.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值