表驱动法编程模式

表驱动法,让你体验什么才是代码的精髓,高灵活度,高效率,更简单,体验代码的魅力!(适合新手入门)

大大赞扬一番,现在我们一起体验代码之优雅。

先来看看代码,你有写过类似下面的这些代码吗?

片段:

1             if (('a' >= inputChar && inputChar <= 'z')||('A'>=inputChar&&inputChar<='Z'))
2             {
3                 .....
4             }
5             else if ((inputChar == ' ') || (inputChar == ',') || (inputChar == ';') || (inputChar == ':') || (inputChar == '?'))
6             { 
7                 ....
8             }

冗长的逻辑判断,如果你是在维护代码,这些是不是让你很难忍受?你不得不花大量时间去阅读前作者的代码。

好,现在有一个问题:

  假设你在写一个计算医疗保险费率的程序,这些费率随着年龄、性别、婚姻状况、以及吸烟与否的不同情况而变化的。你写出的代码会不会是这样?

例:

 1 if (gender == Gender.Female)
 2             {
 3                 if (maritalStatus == MaritalStatus.Single)//是否单身
 4                 {
 5                     if (smokingStatus == SmokingStatus.NonSmoking)
 6                     {
 7                         if (age < 18)
 8                         {
 9                             rate = 200.00;
10                         }
11                         else if (age < 19)
12                         {
13                             rate = 250.00;
14                         }
15                         ...
16                         else if (age < 65) { 
17                             rate = 450.00
18                         }
19                     }
20                     else
21                     {
22                         if (age < 18)
23                         {
24                             rate = 250.00;
25                         }
26                         else if (age < 19)
27                         {
28                             rate = 300.00;
29                         }
30                         ...
31                         else if (age < 65) { 
32                             rate = 575.00
33                         }
34                     }//完成单身smokingStatus
35                 }
36                 else if(maritalStatus == MaritalStatus.Married)
37                 {
38                      if (smokingStatus == SmokingStatus.NonSmoking)
39                      {
40                          ...
41                      }
42                      else
43                      {
44                          ...
45                      }//完成已婚smokingStatus
46                 }
47             }
48             ....
49         }

很简单是不是?   很繁琐有木有?你能想象,把这个题目做完需要多大的代码量。
好,现在看看表驱动法的解决这类逻辑控制结构。

首先,我们需要做的是把这些费率存入所有元素索引的数组里面,用简单形象的描述就是,你需要定义一个类型,像这样:

 1 //定义吸烟状态
 2 
 3 enum SmokingStatus
 4 {
 5     Smoking_Firs = 0,
 6     Smoking = 0,
 7     NonSmoking=1,
 8     Smoking_Last = 1
 9 }
10 
11 //定义已婚状态
12 
13 enum MaritalStatus
14 { 
15     Marital_First = 0,
16     Single = 0,
17     Maritied = 1,
18     Marital_Last=1
19 
20 }

对,它仅仅是一个枚举类型,上述只定义了两个类型, 我们还需要定义一个性别类型,在此就不再重复。

现在数据类型已经定义好了,现在差的就是数据了,数据可以从数据库查出,也可从文件读出,那就要看你怎么选择了,

下面定义一个方法:

1 //返回费率
2 
3 private Double Rate(SmokingStatus smoking, MaritalStatus maital, Gender gender, Age age)
4         { 
5             Double rate;
6             //...
7             return rate;
8         }

我们现在需要做的,假如保险人的信息是这样的:18岁,单身,吸烟,女。

就像这样,优雅的代码展示:

1 //返回相应的费率 
2 
3 double rate = Rate(SmokingStatus.Smoking, MaritalStatus.Single, Gender.Female, 18);

一看这句,是不是觉得,很简单?你能理解他的意思,仅仅从字面上,对,就是这么简单。

除去了繁琐的判断,我们要做的只是要加费率的相应数据,其他的通过Rate处理搞定,什么?费率怎么加?既然是表驱动法,就想想表是什么样的吧?

这仅仅是表驱动法的一种。欢迎各位指正,一起学习 一起提高!

分享是一种美德~ 再见~~~

 

 

 

 

 

 

posted @ 2012-11-13 09:32    阅读(2800)  评论(3编辑  收藏  举报