表驱动编程简介

表驱动编程

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

                                                                                                                                                            ——摘自《代码大全2》Table-DrivenMethods 表驱动法

 

        就如《代码大全》里所说的那样,在适当的环境下,表驱动法确实拥有较大的优势,使用表驱动法所产生的代码逻辑更简单、更容易修改、效率更高,所以也更具扩展性。

       在使用表驱动法的时候,必须解决两个问题。首先,你必须要回答怎样从表中查询条目的问题。你可以用一些数据来直接访问表。比如说,如果你希望把数据按照月份进行分类,纳闷创建一个月份表是非常直截了当的。你可以用一个小标心从1到12的数组实现它。其他的一些数据可能很难直接用于查表,例如,以IP地址为数据分类,那么表的下标为0~,否则,不能包含所有的IP地址。我们可以使用更为复杂的方法来索引,例如使用哈希算法求得一个相对较小的索引值,一般我们采用的查询条目的方法为:

l  直接访问

l  索引访问

l  阶梯访问

        在使用表驱动的时候,需要解决的第二个问题是,我们应该在表里存些什么。可能表查询的结果就是数据。而有的情况表查询的结果是动作(action),我们可以直接存放实现该动作的应用,对于C/C++语言来说其为函数指针。

        我们知道数据库可以为看作多个复杂的表的集合,既然这样,那我们也可以基于数据库实现表驱动法,我们可以将复杂的逻辑操作转换为数据表项,然后将该”逻辑数据表”存储到数据库中,例如,对于智能家居的安防设备处理,设备的报警触发我们可以将触发条件固化到程序里面,那样大概就是if … then else if …then的形式,对于简单的设备或则设备条件变化不大的情况下,我们可以使用方式,但是我们经常研发出新的安全设备,而且安全设备的报警触发条件是可以配置的,那么按照上面的逻辑我们就必须修改原有的代码,这样就会带来较大代价。这是表驱动法就显得比较好了,只要我们好好设计设备报警配置表,按照设备类型把设备的触发条件、触发阈值以及触发之后的联动处理都考虑进去,剩下的逻辑就只剩下根据设备类型,查找数据库然后做出相应的处理就行了。

你可能感兴趣的:(Thinking,algorithm)