第18章 表驱动法(1)

  这本书讲什么?

code complete 是编码完成的意思,是一个软件项目开发过程中的重要里程碑(milestone)。软件项目进行到这里,表名已经完成了所有的编码工作,即将开始系统测试。
这本书讲的正是为了达到“编码完成”这一重要里程碑所必须的软件构建技术,确切的说,就是如何编写高质量的代码。作者认为,应该首先为人编写代码,其次才是为机器编写。代码主要是供人阅读的。遍布全书的提高代码质量的实实在在的技术和诀窍,是本书最有价值得部分。

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

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


使用表驱动法存在的两个问题
  Two Issues in Using Table-Driven Methods。
  在使用表驱动法的时候,必须要解决两个问题。首先,你必须回答怎样从表中查询条目的问题。
  直接访问(Direct Access)
  索引访问(Indexed Access)
  阶梯访问(Stair-Step Access)
  第二个问题是:你应该在表里存些什么?

直接访问

  如:获取一个月的天数.

  不使用表驱动法:就要使用if、else语句去判断是哪一个月,多少天。

  使用表查询法:

    int [12]days = {....}

    取数据,days[month - 1]

索引访问

   索引访问技术主要有两个邮件:首先,如果查询表中的每一条记录都很大,那么创建一个浪费了很多空间的索引数组所用的空间,就要比创建一个浪费了很多空间的主查询表所用的空间小得多。

  第二项优点是:即使你用了索引以后没有节省内存空间,操作位于索引中的记录有时也要比操作位于主表中的记录更方便廉价。比方说,你有一张含有员工姓名、雇佣日期和薪水的表,你可以生成一个索引来按照员工姓名访问该表,生成另一个索引表按照雇佣时间来访问该表,以及生成第三个索引按照薪水来访问该表。

  索引访问技术的最后一个优点就是表查询技术在可维护性上所具有的普遍优点。更容易维护。

阶梯访问列表

  举例来讲就是一个等级区间。

  >= 90%  A

  < 90%    B

  < 75%    C

  < 65%    D

  < 50%    F

  与其他驱动法相比,这种方法的有点在于它很适合处理那些无规则的数据。等级评定的例子很简单,因为尽管等级的划分是无规则的,但用的数字却都是“四舍五入过的(round)”,即都是以5或者0结束的。阶梯方法处理起未经舍入的数据也同样不错。你可以把阶梯方法用于数据呈现如下概率分布的统计任务:

  

  

   下面是在使用阶梯技术的时候需要注意的一些细节:

  留心断点

    确认你已经考虑到每一个阶梯区间的上界。

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

    替换为准二分查找,说它是“准”二分查找的原因是,大多数二分查找的主要目的都是找到一个数值。而在这个例子中,你要做的不是找出一个数值,而是要为某一个数值找出正确的分类来。

  考虑用索引访问来取代阶梯技术

    阶梯方法的查找可能会比较耗时,如果执行速度很重要,你也许会愿意用索引访问来取代阶梯法,即以牺牲存储空间来换取速度。

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

    在你创建了一个转换函数,能把像StudentCode这样的数值转换成表的键值时,请把它提取成单独的子程序。

posted on 2014-08-18 15:23  BestNow  阅读(332)  评论(0编辑  收藏  举报

导航