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

  • 相关阅读:
    HDU 1114 Piggy-Bank
    HDU 2955 Robberies
    NTOJ 290 动物统计(加强版)
    POJ 3624 Charm Bracelet
    HDU 2602 Bone Collector
    POJ 1523 SPF(无向图割顶)
    HDU 5311 Hidden String
    HDU 1421 搬寝室
    HDU 1058 Humble Numbers
    POJ 3259 Wormholes(spfa判负环)
  • 原文地址:https://www.cnblogs.com/Lmeng/p/3479118.html
Copyright © 2011-2022 走看看