Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2122609
  • 博文数量: 374
  • 博客积分: 7276
  • 博客等级: 少将
  • 技术积分: 5668
  • 用 户 组: 普通用户
  • 注册时间: 2011-10-06 16:35
文章分类

全部博文(374)

文章存档

2013年(23)

2012年(153)

2011年(198)

分类: LINUX

2011-11-19 12:44:44

0. 一个原则,多种好处

      编写到表里的数据,比嵌入到代码中的数据更易于维护。表驱动法的核心思想,就是帮助编程人员将融入到程序结构中的那些数据提取出来。这里的“那些数据”是指逻辑判断数据。这样做的好处是,代码逻辑更清晰,更易于维护。

 

1. 什么是“表驱动法”

      表驱动法是一种设计模式。所谓设计模式就是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。

 

2. 为什么叫这个名字

      表驱动法是使用数据作为驱动程序进行逻辑判断的一种方法,因为数据一般都是用表结构组织的,所以称作“表驱动法”。

 

3. 两个核心问题:如何查询 + 表中存放什么数据

      这两个问题是相辅相成的,“如何查询”决定了“表中存放什么数据”。所以“如何查询”才是最主要的问题。常用的查询方法有三种:直接访问,索引访问,阶梯访问。

 

4. 直接访问:

      什么时候用它:能直接看到判断条件与判断结果对应关系的时候。

      1)简单一点的例子(根据index直接获得判断数据):判断一个月应该有多少天

            1> 非表驱动方法----传统的逻辑判断的笨法

  1. if (month == 1)  
  2.   days = 31;  
  3. else if ((month == 2) && (leapyear == true))  
  4.   days = 29;  
  5. else if ((month == 2) && (leapyear == false))  
  6.   days = 28;  
  7. else if (month == 3)  
  8.   days = 31;  
  9. else if (month == 4)  
  10.   days = 30;  
  11. else if (month == 5)  
  12.   days = 31;  
  13. else if (month == 6)  
  14.   days = 30;  
  15. else if (month == 7)  
  16.   days = 31;  
  17. else if (month == 8)  
  18.   days = 31;  
  19. else if (month == 9)  
  20.   days = 30;  
  21. else if (month == 10)  
  22.   days = 31;  
  23. else if (month == 11)  
  24.   days = 30;  
  25. else if (month == 12)  
  26.   days = 31;  
  27. else  
  28.   cout << "Wrong input!" << endl;  

            2> 表驱动方法----先进得让你产生一种错觉:if语句是多余的,但你要明白这仅仅是错觉...

  1. // 下面的数组就是代替逻辑语句的数据表,也就是表驱动的数据基础  
  2. int days_of_month[12] = {31, 28+int(leapyear), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};  
  3. // 下面的语句是对数据表的应用,代替逻辑判断获得结果  
  4. days = days_of_month[month];  

            表驱动方法的结果就是使程序代码“结构更清晰,更易于维护”。

 

      2)复杂一点的例子,越复杂越能体现先进方法的优越性(先对问题进行抽象,建立数学模型,然后根据index直接或间接地获得判断数据):解析并打印消息。

      问题说明:我们的任务是打印一些二进制格式的消息文件,每一个文件有上百条消息;所有的消息分为约20种类型,每种类型的消息都有自己的数据格式(这里可 以类比struct结构体);每种类型的消息都是6种数据类型的排列组合。(详细内容见《代码大全2:第十八章》)

 

5. 索引访问

      什么时候用它:需要将“判断条件”与“判断结果”的实际对应关系,变得复杂的情况我们使用索引表作为中间表对应判断结果。如下所示:判断条 件<---->|条件索引:结果索引|<---->判断结果。很多时候,出于时间复杂度和空间复杂度的考虑,我们需要把对应关系 做得复杂一些,这方面最好的例子就是“操作系统中的虚拟内存”。(详细内容见《代码大全2》:第十八章)

 

6. 阶梯访问

      什么时候用它:无法构造index(最典型的例子就是当键值不是整数的时候);数据呈现出较为明显的分段形态。(详细内容见《代码大全2:第十八章》)

阅读(1555) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~