洪流读书会

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

2020-12-30  本文已影响0人  洪智

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

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

那怎么回答更好呢?

表驱动法

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

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

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

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

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

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

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

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

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

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

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

扩展阅读

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


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

别走!点赞收藏哦!

好,你可以走了。

上一篇下一篇

猜你喜欢

热点阅读