• 从各处收集的switch语句


      1 重构之重复代码:
      2 
      3     1.(重复代码是)语义一致的逻辑
      4         反例:语义一致的逻辑产生了多个实体
      5         缺点:如果你为语义一致的逻辑产生了多个实体,那么当需要修改这个逻辑时,你必须保证同时修改所有的实体,并确保它们是一致的。否则,程序就会产生bug。无疑,这么做会额外增加很多的不必要的工作量。
      6     
      7         原则:语义一致的逻辑之应该只产生唯一实体,在需要的地方进行调用。
      8     
      9 反面案例:
     10     jdbc操作数据库时,在每个访问方法中写driverClass, url, username, password。
     11     
     12     2.(重复代码是)非语义一致的逻辑。
     13         当你的程序中存在多个实体,表示的是非语义一致的逻辑,当修改其中一个不需要维护另一个,因为它们本身就没有语义一致的要求。
     14         
     15 重构之switch语句:
     16 
     17 程序中出现switch语句,就是不好的设计吗?
     18 
     19 一个需要重构的switch语句的案例
     20     Movie类
     21     priceCode域
     22     getCharge(int daysRent):
     23     存在switch语句:
     24         根据priceCode域的值的不同计算租片费用。
     25         其中每个分支中的逻辑的共同点:
     26             输入是租期,输出是费用。
     27     
     28 方案:
     29     使用状态模式或策略模式对该switch语句进行重构。
     30     
     31 商城案例:根据会员不同的等级,给与不同的折扣,会员等级是变化点
     32     会员等级,折扣计算。
     33 影片案例:根据影片类型,计算积分和费用(租用时间),影片类型是变化点
     34     影片类型,计算积分,计算费用。
     35 
     36 
     37 静态的方法:    
     38     charge getCharge(movieType, daysRent){
     39         switch(movieType)
     40             case x1: xx
     41             case x2: xx
     42             case x3: xx
     43     }
     44     
     45     points getPoints(movieType, daysRent){
     46         switch(movieType)
     47             case x1: xx
     48             case x2: xx
     49             case x3: xx
     50     }
     51     类型作为条件,影响方法的行为。
     52     
     53 满减
     54     amount getAmount(amount, customerType){
     55         amount > x1
     56             xxx
     57         amount > x2
     58             xxx
     59         amount > x3
     60             xxx
     61             
     62         switch(customerType)
     63             case x1: xx
     64             case x2: xx
     65             case x3: xx
     66     }
     67     金额作为条件,影响方法的行为。
     68     会员类型作为条件,影响方法的行为。
     69     
     70 满减+打折(大话设计模式中案例)
     71 
     72     amount getAmount(code, amount){
     73         switch(code)
     74             case 打折x1: xx
     75             case 打折x2: xx
     76             case 满减x1: xx
     77             case 满减x2: xx
     78     }
     79 
     80     amount getAmount(amount){
     81         switch(code)
     82             case 打折x1: cashRebate(折扣)
     83             case 打折x2: cashRebate(折扣)
     84             case 满减x1: cashReturn(满, 减)
     85             case 满减x2: cashReturn(满, 减)
     86     }
     87     cashRebate(折扣);
     88     cashReturn(满, 减);//考虑,满减可能有多对,这时可以用一个数组来表示。
     89     
     90     //可能的过度设计,使用策略模式
     91     CashSuper, CashRebate, CashReturn acceptCash()    
     92     
     93 Rental中保存daysRent信息,Movie中保存type信息
     94 
     95 程序中有个元素,该元素有限个值,程序中受该元素的值影响的行为。
     96 元素是影片类型,并且该影片类型作为条件影响程序的行为是计算费用和计算积分。
     97     
     98     
     99     
    100     
    101     例如,如下场景,switch case分支语句过多:
    102  
    103     /**
    104      * 获取地市编码对应的地市名称
    105      *
    106      * @param cityId 地市编码
    107      * @return String 地市名称
    108      */
    109     public static String getCityName(int cityId) {
    110         switch (cityId) {
    111             //苏州
    112             case GlobalDefine.DATUM_CITY_ID_SZ: {
    113                 return "sz";
    114             }
    115             //淮安
    116             case GlobalDefine.DATUM_CITY_ID_HA: {
    117                 return "hz";
    118             }
    119             //宿迁
    120             case GlobalDefine.DATUM_CITY_ID_SQ: {
    121                 return "sq";
    122             }
    123             //南京
    124             case GlobalDefine.DATUM_CITY_ID_NJ: {
    125                 return "nj";
    126             }
    127             //连云港
    128             case GlobalDefine.DATUM_CITY_ID_LYG: {
    129                 return "lyg";
    130             }
    131             //徐州
    132             case GlobalDefine.DATUM_CITY_ID_XZ: {
    133                 return "xz";
    134             }
    135             //常州
    136             case GlobalDefine.DATUM_CITY_ID_CZ: {
    137                 return "cz";
    138             }
    139             //镇江
    140             case GlobalDefine.DATUM_CITY_ID_ZJ: {
    141                 return "zj";
    142             }
    143             //无锡
    144             case GlobalDefine.DATUM_CITY_ID_WX: {
    145                 return "wx";
    146             }
    147             //南通
    148             case GlobalDefine.DATUM_CITY_ID_NT: {
    149                 return "nt";
    150             }
    151             //泰州
    152             case GlobalDefine.DATUM_CITY_ID_TZ: {
    153                 return "tz";
    154             }
    155             //盐城
    156             case GlobalDefine.DATUM_CITY_ID_YC: {
    157                 return "yc";
    158             }
    159             //扬州
    160             case GlobalDefine.DATUM_CITY_ID_YZ: {
    161                 return "yz";
    162             }
    163             //所有地市
    164             case GlobalDefine.DATUM_CITY_ALL: {
    165                 return "all";
    166             }
    167             default:
    168                 return "";
    169         }
    170         
    171         
    172         
    173      使用HashMap来解决switch case 分支语句过多的情况
    174  
    175     /**
    176      * 获取地市编码对应的地市名称
    177      *
    178      * @param cityId 地市编码
    179      * @return String 地市名称
    180      */
    181     public static String getCityName(int cityId) {
    182  
    183         Map<Short, String> cityMap = new HashMap<Short, String>();
    184         //苏州
    185         cityMap.put(GlobalDefine.DATUM_CITY_ID_SZ, "sz");
    186  
    187         //淮安
    188         cityMap.put(GlobalDefine.DATUM_CITY_ID_HA, "ha");
    189  
    190         //宿迁
    191         cityMap.put(GlobalDefine.DATUM_CITY_ID_SQ, "sq");
    192  
    193         //南京
    194         cityMap.put(GlobalDefine.DATUM_CITY_ID_NJ, "nj");
    195  
    196         //连云港
    197         cityMap.put(GlobalDefine.DATUM_CITY_ID_LYG, "lyg");
    198  
    199         //徐州
    200         cityMap.put(GlobalDefine.DATUM_CITY_ID_XZ, "xz");
    201  
    202         //常州
    203         cityMap.put(GlobalDefine.DATUM_CITY_ID_CZ, "cz");
    204  
    205         //镇江
    206         cityMap.put(GlobalDefine.DATUM_CITY_ID_ZJ, "zj");
    207  
    208         //无锡
    209         cityMap.put(GlobalDefine.DATUM_CITY_ID_WX, "wx");
    210  
    211         //南通
    212         cityMap.put(GlobalDefine.DATUM_CITY_ID_NT, "nt");
    213  
    214         //泰州
    215         cityMap.put(GlobalDefine.DATUM_CITY_ID_TZ, "tz");
    216  
    217         //盐城
    218         cityMap.put(GlobalDefine.DATUM_CITY_ID_YC, "yc");
    219  
    220         //扬州
    221         cityMap.put(GlobalDefine.DATUM_CITY_ID_YZ, "yz");
    222  
    223         //所有地市
    224         cityMap.put(GlobalDefine.DATUM_CITY_ALL, "all");
    225  
    226         if (cityMap.containsKey((short) cityId)) {
    227             return cityMap.get((short) cityId);
    228         } else {
    229             return "cityId is error and not find this cityName by cityId";
    230         }
    231     
    232     
    233     public static int getServiceCode(String str){
    234          int code = 0;
    235          if(str.equals("Age")){
    236              code = 1;
    237          }else if(str.equals("Address")){
    238              code = 2;
    239          }else  if(str.equals("Name")){
    240              code = 3;
    241          }else if(str.equals("No")){
    242              code = 4;
    243          }
    244          return  code;
    245      }
    246     
    247     public static void initialMap(){
    248          map.put("Age",1);
    249          map.put("Address",2);
    250          map.put("Name",3);
    251          map.put("No",4);
    252      }
    253 
    254     
    收集的switch语句
  • 相关阅读:
    UML 类与类之间的关系
    HTTP协议基础
    LDAP介绍
    UML 类与类之间的关系
    我的桌面
    RoR的OO与敏捷[1][88250原创]
    Ubuntu7.10纯仿Leopard[00原创]
    37个我爱Ruby的理由
    在Ubuntu 7.10上安装Rails[00整理]
    RoR的OO与敏捷[1][88250原创]
  • 原文地址:https://www.cnblogs.com/mozq/p/10900960.html
Copyright © 2020-2023  润新知