表驱动法之保险费率
書上的例子:
寫一個計算醫療保險費率的程序,費率跟年齡、性別、婚姻狀況以及吸煙與否有關。第一反應可能就是一大堆的if-else語句,如下:
#define FEMALE 1#define MALE 0#define MARRIED 1#define UNMARRIED 0#define SMOKING 1#define NOSMOKING 0if(gender ==FEMALE ){if(maritalStatus ==MARRIED ){if(smokingStatus ==SMOKING ){if(age<18){rate=250;}else if(age==18){rate=300};else if(age==19){rate=350};...else if(age>65){rate=500}}else{...}}}else...
天啊,是不是一大堆的if-else,感覺快搞暈的節奏,
即使第一回寫的時候還沒暈,估計下一次來看的時候,直接傻掉,
如果這里邏輯出了什么問題,還一邊大罵傻屌~~~
所以今天引出我們的主角-表驅動法,所謂表驅動法是什么,大家參考百度或者代碼大全~~
?
其實為了讓下次看懂,而且利于維護,一般來說我們就想一個函數實現就可以了,
就像
GetRate(female,unmarried,nosmoking,age_21);
所以下面我們來實現吧,丟掉那些討厭的if-else:
數據部分:即保險的費率
影響保險費率除了年齡因素外還有3個因素,而年齡因素是主因素,所以我們可以定義把每個年齡的費率存在一個獨立的數組里面,
但是由于還有3個因素,所以我們需要如下幾個數組:
enum { MALE_UNMARRIED_NOSMOKING =0, MALE_UNMARRIED_SMOKING, MALE_MARRIED_NOSMOKING, MALE_MARRIED_SMOKING, FEMALE_UNMARRIED_NOSMOKING, FEMALE_UNMARRIED_SMOKING, FEMALE_MARRIED_NOSMOKING, FEMALE_MARRIED_SMOKING, MAX_RATE_NUMBER };typedef float male_unmarried_nosmongking,male_married_nosmongking; typedef float male_unmarried_smongking,male_married_smongking;typedef float female_unmarried_nosmongking,female_married_nosmongking; typedef float female_unmarried_smongking,female_married_smongking;//數據,可以從文件讀取,或者網絡等等,這里為了方便隨便賦值 male_unmarried_nosmongking MUN[48] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,}; male_unmarried_smongking MUS[48] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,}; male_married_nosmongking MMN[48] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,}; male_married_smongking MMS[48] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,};female_unmarried_nosmongking FUN[48] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,}; female_unmarried_smongking FUS[48] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,}; female_married_nosmongking FMN[48] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,}; female_married_smongking FMS[48] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,};
好,這下有了8個數組來存儲我們的數據,可是總感覺還是不方便,所以再來封裝下:
?
typedef struct { float* rate; }Rate;Rate RateTable[MAX_RATE_NUMBER] = {(float*)MUN, (float*)MUS, (float*)MMN, (float*)MMS, (float*)FUN, (float*)FUS, (float*)FMN, (float*)FMS };
這些看上去清爽多了吧~~
終于到了主函數實現的時候了,
int GetRate(int gender,int maritalStatus,int smokingStatus,int age){//1,年齡因素,為了利于在數組中快速找到對應的費率,需要利用數組天然的下標優勢,//<17的費率,數組下標0;18數組下標1;...大于65數組下標為65-17//是不是又看到了討厭的IF-ELSE,不過沒關系,這里先不管它,畢竟判斷少,大家都看得懂int ageFactor = 0; if (age<18) {ageFactor = 0; } else if (age>65) {ageFactor = 65-17; } else {ageFactor = age-17; }//2,其他因素//注意到在RateTable數組中存儲是有規律的,所以我們的其他因素也利用數組的天然因素。。。。int otherFacotors = gender*4+maritalStatus*2+smokingStatus;//0,1,2,3,4,5,6,7,8//高潮來了哦,不要以為是一大堆的if-else語句哦。。。//其實就一句話~~ return RateTable[otherFacotors].rate[ageFactor]; //是不是很牛逼的樣子~~ }
?
如果你看到這里,恭喜你,內功又深入了一成~~
代碼大全說,其實程序的控制邏輯人是不擅長的,但是我們擅長數據,
所以我們就盡情的利用表驅動法,把邏輯放入數據中吧~~~
?
轉載于:https://www.cnblogs.com/273809717/p/3689315.html
總結
- 上一篇: libevent和基于libevent的
- 下一篇: 程序员的自我修养(2)——计算机网络(转