编程原则:表驱动法

背景

表驱动法,最早接触这个概念是看《代码大全》,之前也在不自觉的应用,本文对这一个概念再做简短的总结。

表驱动法

说明这个概念之前最好先给出不使用这个概念的代码,常见的需要使用表驱动的场景有如下三种情况:

场景1:不同条件不同数据

if (key = "Key A")
{
   处理 Key A 相关的数据
}
else if (key = "Key B")
{
   处理 Key B 相关的数据
}

场景2:不同条件不同行为

if (key = "Key A")
{
   执行 Key A 相关的行为
}
else if (key = "Key B")
{
   执行 Key B 相关的行为
}

场景3:不同条件依次执行

执行 Key A 相关的行为
执行 Key B 相关的行为

有了上面三种场景,再理解表驱动法就比较直观了,直接看表驱动的代码:

表 = {
     "Key A": { "数据项": "数据", "行为项": "行为" },
     "Key B": { "数据项": "数据", "行为项": "行为" }
};

注:很多语言都支持将“行为”作为一等公民,如:C和C++的函数指针、C#的委托、JS的函数等。

有这样一个表以后,替换上面的三种代码就非常直接了,这里不再赘述。

思考

使用OO替换表驱动法

对于某些不支持OO的语言,表驱动法非常有用,对于支持OO的语言,如果表中的数据项和行为项总数如果超过了3个,建议引入简单的继承体系,将数据项和行为项目提取为新类型体系的成员,然后将表修改为工厂。

表的Key能否为“行为”

当然可以,只是在从表中获取行时,使用这个“行为”决定是否返回行。

如何用表驱动法模拟23个设计模式?

完全有可能的,有兴趣的朋友可以模拟一下管道过滤器模式(这个是架构模式)。

时间: 2024-10-26 13:49:12

编程原则:表驱动法的相关文章

编程学习——表驱动法

近来阅读<代码大全>中“表驱动法”这一章节,发现其编程的思想在C语言实际编程很有指导作用,就想着将“表驱动法”应用于实际项目中. 任务需求:函数在进行业务处理之前,需要对外部输入的数据类型(dataType),数据索引(dataIndex),数据长度(dataLen)进行正确性检查 如果按照if-else结构进行判断的话,代码可能如下所示: enum DATA_TYPE{APPLE=0,PEAR=1,BANANA=2}; enum DATA_LEN{APPLE_LEN=20,PEAR_LEN=

【转】 数据驱动编程之表驱动法

http://blog.csdn.net/chgaowei/article/details/6966857 本文示例代码采用的是c语言.之前介绍过数据驱动编程<什么是数据驱动编程>.里面介绍了一个简单的数据驱动手法.今天更进一步,介绍一个稍微复杂,更加实用的一点手法——表驱动法.关于表驱动法,在<unix编程艺术>中有提到,更详细的描述可以看一下<代码大全>,有一章专门进行描述(大概是第八章). 简单的表驱动:<什么是数据驱动编程>中有一个代码示例.它其实也

大话设计模式C++版——表驱动法改造简单工厂

上回<大话设计模式C++版--简单工厂模式>中指出了简单工厂模式的缺陷,即违背了开发-封闭原则,其主要原因是由于switch的判断结构的使用,使修改或添加新的对象时需要改动简单工厂类的代码,如何改造switch结构,表驱动法就可以粉墨登场了. 表驱动法的介绍见<数据驱动编程之表驱动法>. 1.面向接口编程,先改造抽象接口类IOperation class IOperation { public: IOperation() : m_nNuml(0), m_nNumr(0) {} vi

表驱动法 -《代码大全》读书笔记

表驱动法是一种编程模式,从表里面查找信息而不是使用逻辑语句(if-else-switch),当是很简单的情况时,用逻辑语句很简单,但如果逻辑很复杂,再使用逻辑语句就很麻烦了. 比如查找一年中每个月份的天数,如果用表驱动法,完全不需要写一堆if-else-语句,直接把每个月份的天数存到一个数组里就行了,取值的时候直接下标访问,最多针对二月判断一下闰年.这么算的话,平时用的的HashMap,SparseArray也可以算是表驱动 表里可以存数据,也可以存指令,或函数指针等都可以. 示例 看一个例子,

表驱动法 - 巧妙利用数组返回中文星期

Date对象有个getDay方法,它根据本地时间,返回一个具体日期中一周的第几天.返回值从0~6,分别对应周日~周六 getDay 0 1 2 3 4 5 6 星期几 周日 周一 周二 周三 周四 周五 周六 用到日期相关的需求时需要将getDay返回的值转成星期几,即“这一天”是星期几?比如日历组件中选择日历后返回 “2014-12-22 周一”. 这是一段依然在线上运行的代码 /* * 根据Date对象返回星期几 * @param {Date} date * @return {String}

表驱动法

表驱动法:是一种编程模式 将选择条件if else 查表换成直接查表 switch(month){ case  1,3,5 ,7 ,8, 10 ,12:day=30:break: case 2:day=28:break: default:day=30:break: } 换成: day[mouthLen]={31 28 31 30 31 30 31 ,,,} 表驱动法

第18章 表驱动法(1)

这本书讲什么? code complete 是编码完成的意思,是一个软件项目开发过程中的重要里程碑(milestone).软件项目进行到这里,表名已经完成了所有的编码工作,即将开始系统测试.这本书讲的正是为了达到“编码完成”这一重要里程碑所必须的软件构建技术,确切的说,就是如何编写高质量的代码.作者认为,应该首先为人编写代码,其次才是为机器编写.代码主要是供人阅读的.遍布全书的提高代码质量的实实在在的技术和诀窍,是本书最有价值得部分. 表驱动法是一种编程模式(scheme)——从表里面查找信息而

第十八章 表驱动法

表驱动法是一种编程模式--从表里面查找信息而不使用逻辑语句(if和case). 表驱动法使用总则 在适当的环境下,采用表驱动法,所生成的代码会比复杂的逻辑代码更简单.更容易修改,而且效率更高. 使用表驱动法的两个问题 使用表驱动法必须先解决两个问题.首先,你必须要回答怎样从表中查询条目的问题.其次是考虑在表中存些什么. 直接访问表 和所有的查询表一样,直接访问表代替了更为复杂的逻辑控制结构.之所以说它们是"直接访问"的,是因为你 无须绕很多复杂的圈子就能够在表里面找到你想要的信息. 索

关于表驱动法的思考

目前在学习软件构造课程中表驱动法的内容,了解后觉得它在处理涉及多个if-else问题时十分有用,下面提供一些简单的我对表驱动法的理解以及其在java中应用的小例子. 表驱动法,顾名思义,是用查表方式来获取数据,涉及到了表的结构.表是一种在很多语言中常见的数据结构,比如在java中我们使用map键值对集合的形式来定义表.关于java中map的用法如下: 创建: Type map = new HashMap(); 删除: map.clear(); 添加键值对: map.set(key,value);