如何解决大量的if语句或switch case语句?

洪流学堂,让你快人几步。
本篇内容来自洪流读书会解读书籍《代码大全2》。

很多面试官喜欢问这样的问题,如何解决大量的if语句或switch case语句?如果你仅仅在优化的层面回答,可能不能让面试官满意。

那怎么回答更好呢?

表驱动法

在这种情况下可以使用表驱动法

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

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

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

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

使用表驱动法必须要解决的两个问题

1、你必须要回答怎样从表中查询条目的问题

你可以用一些数据来直接访问表。比如说,如果你希望把数据按月进行分类,那么创建一个月份表是非常直截了当的。你可以用一个下标从1到12的数组实现它。

另一些数据可能很难直接用于查表。例如,假设你希望按照社会安全号码做数据分类,那么除非你可以承受在表里面存放99-99999条记录,否则就不能用社会安全号码直接查表。你会被迫采用一种更为复杂的方法。下面是从表里面查询记录的方法列表

  • 直接访问(Direct access)。比如保险费率表,游戏中常用的数据表等等。可以直接通过一个值,比如说保险费率表中的年龄,找到对应的数据。
  • 索引访问(Indexed access)。有的时候,只用一个简单的数学运算还无法把age这样的数据转换成为表键值。这类情况中的一部分可以通过使用索引访问的方法加以解决。当你使用索引的时候,先用一个基本类型的数据从一张索引表中 查出一个键值,然后再用这一键值查出你感兴趣的主数据。比如游戏中需要根据玩家的职业、等级等来确定获得的奖励,就可以通过索引转换的方式。
  • 阶梯访问(Stair-step access)。还有另外一种访问表的方法,那就是阶梯访问。这种访问方法不像索引结构那样直接,但是它要比索引访问方法节省空间。阶梯结构的基本想法是,表中的记录对于不同的数据范围有效,而不是对不同的数据点有效。最常见的就是评分系统,可能需要根据不同的得分范围来获得最终的得分。

2、你应该在表里面存些什么

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

扩展阅读

【扩展学习】洪流学堂公众号回复读书会可以阅读本系列所有文章


我是大智,你的技术探路者,下次见!

别走!点赞收藏哦!

好,你可以走了。

你可能感兴趣的:(如何解决大量的if语句或switch case语句?)