表驱动法简易教程

来源:互联网 发布:淘宝客服电话人工按几? 编辑:程序博客网 时间: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章。

参考 《代码大全》