关于表驱动
首次接触表驱动,还是在毕业不久之后。当时某部门经理给我们讲解重构,即《重构:改善既有代码的设计》一书中简化条件表达式部分,关于if语句的处理,将其替换为多态形式,例如说工厂模式。但是即使替换为工厂,switch或者if的判断依旧不能去除,那么有什么办法解决这个问题呢?
当时我还在研究STL源码,想到了traits编程技术,可以在编译期解决if的判断问题(虽然有这个想法,但是一直没有实现成功)。各路大牛提出了不同的见解,大家基本上都同意一条:使用“表”来解决。当时见识尚浅,不懂具体说的是什么意思,直到我知道了“表驱动”。
“表驱动”来自于《代码大全》,此书在我的定义里,为一本软件工程类的书。表驱动作为单独一章出现,并且在序言中推荐为初级程序员首读章节,可见其重要性。
首先,为什么要有表驱动呢?表驱动的目的是避免逻辑语句(if和case),而使用表来查找判断信息。那么为什么要这么做呢?《代码大全》第5.2章节提到,软件的首要技术使命:管理复杂度。复杂度可以靠圈复杂度(一个函数可执行路径的数目)来判断,具体要涉及到图论等等方方面面,不再展开说明。那么表驱动的使用就可以大幅度的降低复杂度。
其次,表驱动是什么?任何可以用逻辑语句来选择的事物,都可以通过查表来选择。例如说:情况1,选择事物1;情况2,选择事物2等等,存储在表中就是如下格式:
情况 |
事物 |
1 |
1 |
2 |
2 |
… |
… |
那么,凡是用if和case来选择事物的语句,都可以替换为以下形式:
Table[选择的情况i];
这样就可以直接通过首地址+偏移量直接获取对应的内容,取消了判断逻辑。假设要选择第n个事物,那么就是首地址+n,直接得到了第n个事物。如果用正常的判断逻辑,那么可能需要判断n次才可以得到第n个事物。
其他具体内容,大家可以自己去百度一下~
工厂模式