从各处收集的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语句

原文地址:https://www.cnblogs.com/mozq/p/10900960.html

时间: 2024-10-11 13:02:10

从各处收集的switch语句的相关文章

助教:C语言问题收集--scanf()的一些常见问题;switch语句;for循环的执行顺序

scanf函数中的"格式控制"后面应当是变量地址,而不应是变量名. 输入数据时不能规定精度. scanf("%7.2f",&a).这是不合法的.但是,scanf("%3d%3d",&a,&b)这样写可以. 如果在"格式控制"字符串中除了格式说明以外还有其他字符,则在输入数据时在对应位置应输入与这些字符相同的字符. scanf("%d,%d,%d",&a,&b,&

选择结构if语句和switch语句的区别

1.选择结构if语句格式及其使用 A:if语句的格式: if(比较表达式1) { 语句体1; }else if(比较表达式2) { 语句体2; }else if(比较表达式3) { 语句体3; } ... else { 语句体n+1; } B:执行流程: 首先计算比较表达式1看其返回值是true还是false, 如果是true,就执行语句体1,if语句结束. 如果是false,接着计算比较表达式2看其返回值是true还是false, 如果是true,就执行语句体2,if语句结束. 如果是fals

蓝鸥Unity开发基础——Switch语句学习笔记

一.Switch语法 属于多分支语句,通过判断表达式的值,来决定执行哪个分支 Break用于结束某个case,然后执行switch之外的语句 Switch-开关:case-情况开关决定发生的情况 二.Switch基本语法 Switch(表达式){ Case 值1: 语句1 Break: Case 值2: 语句2 Break: -- Case 值n: 语句n Break: Default: 语句 Break: } 三.注意事项 整个defaul语句都可以舍掉,default语句最多只能由一个 Sw

Swift语言中的switch语句的妙用

Swift中的switch语句的类另用法: // 强大的switch语句 var a:Int = 100 switch a { case a where a < 0: println("Negative") case a where a == 0: println("Zero") case a where a > 0: println("Positive") default: println("Unknow") }

switch语句

格式: switch语句 Switch(条件表达式){ case 常量1: 语句1; break; case 常量2: 语句2; break; ... case 常量n: 语句n; break; default: 语句: break; //最后这个break可以省略 } switch条件表达式类型,与case常量类型必须一致 switch条件表达式的类型限byte.short.int.string.enum 示例: class SwitchDemo { public static void ma

java语法基础-程序流程控制-选择结构-switch语句

switch(表达式)  //被选择的表达式的值的数据类型只能是byte short int char { case 取值1: 执行语句: break: case 取值2: 执行语句: break: -... default: 执行语句: break:} switch语句特点: 1.switch语句选择的类型只有四种:byte,short,int , char. 2.备选答案没有顺序.但是执行必然从第一个case执行. 3.只有所有的case不匹配,才会执行default. 4.结束特点:遇到b

黑马程序员---C基础3【变量的易错】【程序结构】【if语句】【Switch语句】

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- [变量的易错] 1.变量为什么要初始化为0 int  sum,a=3: sum = sum+a 如果未初始化则会成为一个不确定的变量,结果也会不确定,容易出错. 2.不同类型的变量之间的转换 切记int  a=1,b=0:b=1-1.5:其中b为一个整型所有结果是保留整数部分的0,而不是-0.5,又因为0没有正负之分,所有保存结果为b=0: 3.关于Xcode的一个快速注释的插件 快捷键://

利用switch语句计算特定的年份的月份共有几天。

//利用switch语句计算特定的年份的月份共有几天. let year =2015 let month =2 //先判断闰年中二月份的情况 ifmonth ==2 { if (year %400 ==0||year %4 ==0 &&year %100 !=0) //闰年的二月份29天,非闰年的二月份是28天 { print("29天") }else { print("28天") } } else { //考虑其他两种情况 switchmonth

Java switch 语句使用 String 参数

原文同步至 http://www.waylau.com/java-switch-use-string/ 当我尝试在 switch 语句使用 String 参数时(注意ctrType为字符串) switch (ctrType) { case "01" : exceptionType = "读FC参数数据"; break; case "03" : exceptionType = "读FC保存的当前表计数据"; break; def