之前翻《code complete》(中文:代码大全)的时候,看到讲解表驱动法的地方,当时觉得很好懂。
于是在工作中,经常思考怎么把表驱动法运用到实际的代码编写中。经过一段时间的探索,才终于有点豁然开朗的感觉。
当前的项目以Mongodb作为数据载体,熟悉Mongodb的同学都知道这种nosql类型的数据库插数据非常自由,只要符合json格式,都可以被插入到表当中。这也是mongodb作为非关系型数据库 的一大特点。
数据库中有一张表test,数据模型大概是这样:
{
"name": "name",
"type": "a" # 这个type的可选值为"a",“b”
"a_value": [1, 2] # 如果上面的type是a,这个字段名为a_value, 如果type是b,则这个key名就是b_value
}
基于上面的数据模型,数据库中可能的两条数据是这样:
{
"name": "test1",
"type": "weekly"
"weekday": [1, 2]
}
{
"name": "test2",
"type": "monthly"
"monthday": [1, 2]
}
虽说这样设计一个key是可变的数据模型,并不是良好的做法。但是基于这种现状,我们就可以在代码里用表驱动法去处理数据。比如当前有个需求是这样:
根据上面两条数据,得出相应的日期
那么我们在代码里处理这两条数据时,首先要看数据的type是weekly还是monthly,然后才能确定要读取的数据是weekday还是monthday,然后才能将数据正确地读取到。对不?
一般的思路就是去写个if语句:
if type == 'weekly':
value = data['weekday']
elif type == 'monthly':
value = data['monthday']
如果用表驱动法,写出来的代码就是这样的:
data_type = {"weekly": "weekday", "monthly": "monthday"}
value = data[data_type[data["type"]]]
当然,上面的例子非常简单。表驱动法的思想就是,设计一个“表”去存储数据,将那些因为数据造成的冗余的if语句简化。
看书的时候觉得懂了,其实不然。只有真正能够用书里的知识去处理实际问题的时候,才是懂的开始。
最后赞一下《代码大全》这本好书,写的非常易懂,但是要学会,还需要自己去感悟其中的真义。