表驱动法简易教程
2017-07-23 23:34
309 查看
定义
表驱动法是一种编程模式,它的本质是,从表里查询信息来代替逻辑语句。从一个简单例子开始
假如有这么一个需求:根据月份来获得这个月的天数。用最原始的逻辑方法是这样的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章。参考 《代码大全》
相关文章推荐
- 文科妹学 GitHub 简易教程
- Android实战简易教程<五十一>(ListView实现子控件的动态显示和隐藏、checkbox全选和反选)
- Android实战简易教程<三十六>(监听短信-实现短信验证码自动填入)
- ibatis简易教程
- Android简易实战教程--第五话《开发一键锁屏应用》
- Android实战简易教程-第九枪(BitmapFactory.Options对资源图片进行缩放)
- Jenkins使用简易教程
- Android实战简易教程-第十枪(画廊组件Gallery实用研究)
- Webpack简易入门教程
- git 简易教程
- Android简易实战教程--第四十三话《上拉加载与下拉刷新》
- 【教程】CoreAVC+Haali安装及设置简易教程(KMPlayer)(2)
- 简易图解N合1集成安装光盘制作教程二
- Tomcat-简易使用教程
- JavaMail简易教程
- Android实战简易教程-第十八枪(ViewPager组件详解)
- Android简易实战教程--第五十二话《满屏拖动的控件2》
- bouml的简易教程(中文)
- Git简易教程,快速上手-Mac版
- MyBatis,Spring整合简易教程