zoukankan      html  css  js  c++  java
  • 表驱动法之保险费率

    书上的例子:

    写一个计算医疗保险费率的程序,费率跟年龄、性别、婚姻状况以及吸烟与否有关。第一反应可能就是一大堆的if-else语句,如下:

    #define FEMALE 1
    
    #define MALE    0
    
    #define MARRIED 1
    
    #define UNMARRIED 0
    
    #define SMOKING  1
    
    #define NOSMOKING 0
    
     
    
    if(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]; //是不是很牛逼的样子~~ }

      

    如果你看到这里,恭喜你,内功又深入了一成~~

    代码大全说,其实程序的控制逻辑人是不擅长的,但是我们擅长数据,

    所以我们就尽情的利用表驱动法,把逻辑放入数据中吧~~~

  • 相关阅读:
    页面反向映射之文件页面
    页面反向映射之匿名页面
    cp so文件导致进程SIGBUS或者SEGV原因分析
    由systemtap直接修改内核代码段想到的
    epoll的内核实现
    从一些现象看printf的缓冲机制
    Linux由浅入深学习 (转)
    每天一个Linux命令 (转)
    Redis与数据库同步问题
    PHP使用文件流下载文件方法(附:解决下载文件内容乱码问题)
  • 原文地址:https://www.cnblogs.com/273809717/p/3689315.html
Copyright © 2011-2022 走看看