表驱动法,让你体验什么才是代码的精髓,高灵活度,高效率,更简单,体验代码的魅力!(适合新手入门)
大大赞扬一番,现在我们一起体验代码之优雅。
先来看看代码,你有写过类似下面的这些代码吗?
片段:
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处理搞定,什么?费率怎么加?既然是表驱动法,就想想表是什么样的吧?
这仅仅是表驱动法的一种。欢迎各位指正,一起学习 一起提高!
分享是一种美德~ 再见~~~