2022.11月代码大全阅读笔记2
第十八章阅读笔记
表驱动法是一种编程模式(scheme)---从表里面查找信息而不使用逻辑语句(if和 case)。
事实上,凡是能通过逻辑语句来选择的事物,都可以通过查表来选择。
对简单的情况而言,使用逻辑语句更为容易和直白。但随着逻辑链的越来越复杂,查表法也就愈发显得更具吸引力。
18.1 表驱动法使用总则
在适当的环境下,采用表驱动法,所生成的代码会比复杂的逻辑代码更简单、更容易修改,而且效率更高。另一方面,如果用一个查询表(lookup table),就可以把每一个字符的类型保存在一个用字符编码访问的数组里。
18.1.1 使用表驱动法的两个问题
在使用表驱动法的时候,必须要解决两个问题:
1、首先,你必须要回答怎样从表中查询条目的问题。你可以用一些数据来直接访问表。比如说,如果你希望把数据按月进行分类,那么创建一个月份表是非常直截了当的。你可以用一个下标从1到12的数组实现它。
另一些数据可能很难直接用于查表。例如,假设你希望按照社会安全号码做数据分类,那么除非你可以承受在表里面存放 999-99-9999 条记录,否则就不能用社会安全号码直接查表。你会被迫采用一种更为复杂的方法。下面是从表里面查询记录的方法列表:
直接访问(Direct access)
索引访问 (Indexed access)
阶梯访问(Stair-step access)
本章后面部分将就这其中的每一种访问方法展开详细讨论。
2、在使用表驱动法的时候,需要解决的第二个问题是,你应该在表里面存些什么。有的时候,表查询出来的结果是数据。如果你遇到的是这种情况,那么就可以把这些数据保存到表里面。
在另外一些情况下,表查询出来的结果是动作(action)。在这种情况下,你可以保存一个描述该动作的代码,或者,在有些语言里,你可以保存对实现该动作的子程序的引用。
无论是哪一种情况,表都会变得更为复杂。
表提供了一种复杂的逻辑和继承结构的替换方案。如果你发现自己对某个应用程序的逻辑或者继承树关系感到困惑,那么问问自己它是否可以通过一个查询表来加以优化
使用表的两大关键决策:1、如何访问表;2、表中存放什么
18.2 直接访问表
通过数组这样的直接访问方式访问表项。如:用数组获取12个月各有几天,或用多重数组获取各种情况下医保的保费。
用于表示太过复杂以至于无法用代码计算(如保费),或者完全没什么内在逻辑的数据(如各个月各有几天(反正我觉得没逻辑))。
书中给出了一个非常强大的例子。有一个信息流,有20种可能的信息,各自有对应的id;如果通过if-else判断代码会非常恐怖,就算用类封装起来内部也还是有恐怖的if-else语句。然而如果通过查表可以轻松解决,而且将各种信息体现为数据而非硬编码,更加易于维护。