美文网首页洪流读书会
如何解决大量的if语句或switch case语句?

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

作者: 洪智 | 来源:发表于2020-12-30 14:22 被阅读0次

    洪流学堂,让你快人几步。
    本篇内容来自洪流读书会解读书籍《代码大全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语句?

        本文链接:https://www.haomeiwen.com/subject/dfrvgktx.html