如何解决大量的if语句或switch case语句?
Posted 大智_洪流学堂
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何解决大量的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)。在这种情况下,你可以保存一个描述该动作的代码,或者,在有些语言里,你可以保存对实现该动作的子程序的引用。无论是哪一种情况,表都会变得更为复杂。
扩展阅读
【扩展学习】在洪流学堂公众号回复
读书会
可以阅读本系列所有文章
我是大智(vx:zhz11235),你的技术探路者,下次见!
别走!点赞,收藏哦!
好,你可以走了。
以上是关于如何解决大量的if语句或switch case语句?的主要内容,如果未能解决你的问题,请参考以下文章