表驱动法简易教程
来源:互联网 发布:淘宝客服电话人工按几? 编辑:程序博客网 时间:2024/06/13 23:20
定义
表驱动法是一种编程模式,它的本质是,从表里查询信息来代替逻辑语句。
从一个简单例子开始
假如有这么一个需求:根据月份来获得这个月的天数。用最原始的逻辑方法是这样的
if (mouth == 1) { return 31;} else if (mouth == 2) { return 28;}else if (mouth == 3) { return 31;}...else if (mouth == 12) { return 31;} else { return 0;}
这样的代码很笨拙,篇幅很长。
如果使用表驱动法就优雅多了(简单,容易修改)。具体做法是,将这些数据存在一张表里,这个表可以是本地文件,也可以是硬编码中的数组。以数组为例:
array daysPerMonth = [31,28,31,30,31,30,31,31,30,31,30,31];days = daysPerMonth[month - 1];
表驱动法的优势
从上面的例子可以看出,这种场景下,表驱动法明显比逻辑实现要‘好’。这个‘好’可以具体为以下:
- 按时发生更加易读和直白;
- 用数据代替逻辑,容易维护;
- 可以把表中的数据存放在文件中,运行时读取,减少代码体量。数据变更时只需要修改文件;
- 降低复杂度。
构造查询键值
上面的例子只是一个很简单的使用场景,直截了当地建立一个表,然后用月份作为下表来访问,这叫‘直接访问表’。
如果在一些情况下无法将数值直接作为索引访问表,那么你可以用一张表来把这些数值转换为可以作为索引的数值,再来访问。
举个栗子:
假如,20岁一下称为青年,20~50岁之间称为中年,50岁以上称为老年。这个时候就不能用年龄直接作为索引。那么久需要自己去转换一次。这个转换根据不同的场景转换方法也不尽相同,很简单,不做解释。
所谓的‘索引访问表’和‘阶梯访问表’,都是构造查询键值的方法。
一个项目中的例子
聊天软件中都有emoji表情功能。在屏幕上显示的都是一张张表情图片,在程序中,每张图片都会对应一组数据,这些数据有的用在数据传输,有的用于存储图片名称,例如:
item1: { emoji_id:001, emoji_name:'[大笑]', emoji_image:'e001.png',}item2: { emoji_id:002, emoji_name:'[抠鼻]', emoji_image:'e002.png',}...item70: { emoji_id:070, emoji_name:'[便便]', emoji_image:'e070.png',}
(实际项目中这些数据存储在plist文件中)
收到别人发来消息中,有‘/002/’字符串,那么相应的位置就要显示抠鼻的表情。
最原始的实现方法,是一个大循环,逐个对比emoji_id是否等于002,如果相等,则返回emoji_image。这样做很耗时。
如果用表驱动法就很简单,把’/002/’转换为查询的键值,直接就可以访问到item2的数据,然后取出emoji_image。新增表情数据的话,也不需要更改代码。
结束
本文简单概要地解释了 表驱动法 的概念和使用方法,并举了两个例子。实际上表驱动法使用的场景很多,可以解决很多复杂的逻辑问题。这就要根据具体业务灵活使用。需要更深更透彻地了解表驱动法,请参考《代码大全》书中的18章。
参考 《代码大全》
- 表驱动法简易教程
- 简易教程
- 简易管理器(驱动方式)
- ERP简易教程
- ERP简易教程
- XML简易教程之一
- Reporting Service 简易教程
- Atlabs简易教程
- Java Bean简易教程
- Ruby程序设计简易教程
- XML schema 简易教程
- IDA简易教程
- WINDBG Script简易教程
- 转载:IDA简易教程
- IDA 简易教程
- 绘声绘影简易教程
- xsl语言简易教程
- JavaMail简易教程
- 110. Balanced Binary Tree
- 百练_2723:不吉利日期
- Java学习笔记:初识Java
- 百练_2729:求12以内n的阶乘
- Codeforces 520E/521C Pluses everywhere
- 表驱动法简易教程
- note 1
- struts2 中redirectAction如何传递参数!(转)
- hdu4763 Theme Section(kmp)
- Android程序Crash时的异常上报
- CCNA第六天(NAT)
- http长连接总结
- 四个方面讲解MPK(安规电容)与CBB电容的区别
- MySQL 5.7的半同步复制