从各处收集的switch语句
重构之重复代码:
1.(重复代码是)语义一致的逻辑
反例:语义一致的逻辑产生了多个实体
缺点:如果你为语义一致的逻辑产生了多个实体,那么当需要修改这个逻辑时,你必须保证同时修改所有的实体,并确保它们是一致的。否则,程序就会产生bug。无疑,这么做会额外增加很多的不必要的工作量。
原则:语义一致的逻辑之应该只产生唯一实体,在需要的地方进行调用。
反面案例:
jdbc操作数据库时,在每个访问方法中写driverClass, url, username, password。
2.(重复代码是)非语义一致的逻辑。
当你的程序中存在多个实体,表示的是非语义一致的逻辑,当修改其中一个不需要维护另一个,因为它们本身就没有语义一致的要求。
重构之switch语句:
程序中出现switch语句,就是不好的设计吗?
一个需要重构的switch语句的案例
Movie类
priceCode域
getCharge(int daysRent):
存在switch语句:
根据priceCode域的值的不同计算租片费用。
其中每个分支中的逻辑的共同点:
输入是租期,输出是费用。
方案:
使用状态模式或策略模式对该switch语句进行重构。
商城案例:根据会员不同的等级,给与不同的折扣,会员等级是变化点
会员等级,折扣计算。
影片案例:根据影片类型,计算积分和费用(租用时间),影片类型是变化点
影片类型,计算积分,计算费用。
静态的方法:
charge getCharge(movieType, daysRent){
switch(movieType)
case x1: xx
case x2: xx
case x3: xx
}
points getPoints(movieType, daysRent){
switch(movieType)
case x1: xx
case x2: xx
case x3: xx
}
类型作为条件,影响方法的行为。
满减
amount getAmount(amount, customerType){
amount > x1
xxx
amount > x2
xxx
amount > x3
xxx
switch(customerType)
case x1: xx
case x2: xx
case x3: xx
}
金额作为条件,影响方法的行为。
会员类型作为条件,影响方法的行为。
满减+打折(大话设计模式中案例)
amount getAmount(code, amount){
switch(code)
case 打折x1: xx
case 打折x2: xx
case 满减x1: xx
case 满减x2: xx
}
amount getAmount(amount){
switch(code)
case 打折x1: cashRebate(折扣)
case 打折x2: cashRebate(折扣)
case 满减x1: cashReturn(满, 减)
case 满减x2: cashReturn(满, 减)
}
cashRebate(折扣);
cashReturn(满, 减);//考虑,满减可能有多对,这时可以用一个数组来表示。
//可能的过度设计,使用策略模式
CashSuper, CashRebate, CashReturn acceptCash()
Rental中保存daysRent信息,Movie中保存type信息
程序中有个元素,该元素有限个值,程序中受该元素的值影响的行为。
元素是影片类型,并且该影片类型作为条件影响程序的行为是计算费用和计算积分。
例如,如下场景,switch case分支语句过多:
/**
* 获取地市编码对应的地市名称
*
* @param cityId 地市编码
* @return String 地市名称
*/
public static String getCityName(int cityId) {
switch (cityId) {
//苏州
case GlobalDefine.DATUM_CITY_ID_SZ: {
return "sz";
}
//淮安
case GlobalDefine.DATUM_CITY_ID_HA: {
return "hz";
}
//宿迁
case GlobalDefine.DATUM_CITY_ID_SQ: {
return "sq";
}
//南京
case GlobalDefine.DATUM_CITY_ID_NJ: {
return "nj";
}
//连云港
case GlobalDefine.DATUM_CITY_ID_LYG: {
return "lyg";
}
//徐州
case GlobalDefine.DATUM_CITY_ID_XZ: {
return "xz";
}
//常州
case GlobalDefine.DATUM_CITY_ID_CZ: {
return "cz";
}
//镇江
case GlobalDefine.DATUM_CITY_ID_ZJ: {
return "zj";
}
//无锡
case GlobalDefine.DATUM_CITY_ID_WX: {
return "wx";
}
//南通
case GlobalDefine.DATUM_CITY_ID_NT: {
return "nt";
}
//泰州
case GlobalDefine.DATUM_CITY_ID_TZ: {
return "tz";
}
//盐城
case GlobalDefine.DATUM_CITY_ID_YC: {
return "yc";
}
//扬州
case GlobalDefine.DATUM_CITY_ID_YZ: {
return "yz";
}
//所有地市
case GlobalDefine.DATUM_CITY_ALL: {
return "all";
}
default:
return "";
}
使用HashMap来解决switch case 分支语句过多的情况
/**
* 获取地市编码对应的地市名称
*
* @param cityId 地市编码
* @return String 地市名称
*/
public static String getCityName(int cityId) {
Map<Short, String> cityMap = new HashMap<Short, String>();
//苏州
cityMap.put(GlobalDefine.DATUM_CITY_ID_SZ, "sz");
//淮安
cityMap.put(GlobalDefine.DATUM_CITY_ID_HA, "ha");
//宿迁
cityMap.put(GlobalDefine.DATUM_CITY_ID_SQ, "sq");
//南京
cityMap.put(GlobalDefine.DATUM_CITY_ID_NJ, "nj");
//连云港
cityMap.put(GlobalDefine.DATUM_CITY_ID_LYG, "lyg");
//徐州
cityMap.put(GlobalDefine.DATUM_CITY_ID_XZ, "xz");
//常州
cityMap.put(GlobalDefine.DATUM_CITY_ID_CZ, "cz");
//镇江
cityMap.put(GlobalDefine.DATUM_CITY_ID_ZJ, "zj");
//无锡
cityMap.put(GlobalDefine.DATUM_CITY_ID_WX, "wx");
//南通
cityMap.put(GlobalDefine.DATUM_CITY_ID_NT, "nt");
//泰州
cityMap.put(GlobalDefine.DATUM_CITY_ID_TZ, "tz");
//盐城
cityMap.put(GlobalDefine.DATUM_CITY_ID_YC, "yc");
//扬州
cityMap.put(GlobalDefine.DATUM_CITY_ID_YZ, "yz");
//所有地市
cityMap.put(GlobalDefine.DATUM_CITY_ALL, "all");
if (cityMap.containsKey((short) cityId)) {
return cityMap.get((short) cityId);
} else {
return "cityId is error and not find this cityName by cityId";
}
public static int getServiceCode(String str){
int code = 0;
if(str.equals("Age")){
code = 1;
}else if(str.equals("Address")){
code = 2;
}else if(str.equals("Name")){
code = 3;
}else if(str.equals("No")){
code = 4;
}
return code;
}
public static void initialMap(){
map.put("Age",1);
map.put("Address",2);
map.put("Name",3);
map.put("No",4);
}
收集的switch语句
从各处收集的switch语句的更多相关文章
- switch语句的妙用
switch语句的普通用法很简单,如下: var a = 3; switch (a) { case 1: console.log(a); break; case 2: case 3: console. ...
- 106运用SWITCH语句打印星期几的单词
package com.chongrui.test;/*运用SWITCH语句打印星期几的单词 * */ public class TypeConvertion { public static void ...
- 通过goto语句学习if...else、switch语句并简单优化
goto语句在C语言中实现的就是无条件跳转,第二章一上来就介绍goto语句就是要通过goto语句来更加清楚直观的了解控制结构. 我理解的goto语句其实跟switch语句有相似之处,都是进行跳转.不同 ...
- Java中简单的操作(if语句、常用操作符、switch语句、变量赋值等)
---------------------if语句介绍--------------------------------------------------- class IfDemo { public ...
- Switch语句的case穿透
Switch语句的case穿透 一 switch语句几点说明: 1. case后面只能是常量,不能是变量,而且,多个case后面的值不能出现相同的. 2.case后面表达式可以接受: 基本数据类型,b ...
- ECMA中的switch语句
switch借鉴自其他语言,但也有自己的特色. 1.可以在switch语句中使用任何数据类型(数值.字符串.对象等),很多其他语言中只能使用数值. 2.每个case的值不一定是常量,可以是变量或者表达 ...
- switch语句下的变量声明和定义
switch语句下的变量声明和定义的问题: switch...case...语句中存在声明和定义会出现一些问题.这个由switch语法特性决定的, switch中每个case都是平等的层次,区别于一般 ...
- 透过IL看C#:switch语句(转)
透过IL看C# switch语句(上) 摘要: switch语句是 C#中常用的跳转语句,可以根据一个参数的不同取值执行不同的代码.本文介绍了当向 switch语句中传入不同类型的参数时,编译器为其生 ...
- switch语句
应用条件语句可以很方便地使程序实现分支,但是出现分支比较多的时候,虽然可以用嵌套的if语句来解决,但是程序结构会显得复杂,甚至凌乱.为方便实现多情况选择,C++提供了一种switch开关语句. 一 ...
随机推荐
- HDU4529 郑厂长系列故事——N骑士问题 —— 状压DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4529 郑厂长系列故事——N骑士问题 Time Limit: 6000/3000 MS (Java/Ot ...
- dotnet core on Linux 环境搭建及入门demo
首先感谢张善友大大提供的腾讯云实验室链接(https://www.qcloud.com/developer/labs/list). 以下是整个搭建过程及简单demo实例 1.搭建 .NET Core ...
- 51nod 1225
题目 题解:看数据范围就估计是根号算法.考虑我们要求的式子: $ \sum\limits_{i = 1}^n {n - \left\lfloor {\frac{n}{i}} \right\rfloor ...
- legend2---开发日志15(功能需求明确,设计好类和结构的好处是)
legend2---开发日志15(功能需求明确,设计好类和结构的好处是) 一.总结 一句话总结: 极快简化编程,节约大量时间 1.多个类型的物品,比如商店和寻宝的丹药,装备,特性书,英雄石等等 应该怎 ...
- hls协议(最清晰的讲解)
今天来介绍一下HLS协议,这个协议是由苹果公司提出并推广开来的.来一段维基百科的定义. HTTP Live Streaming(缩写是HLS)是一个由苹果公司提出的基于HTTP的流媒体网络传输协议.是 ...
- UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)
py文件直接在cmd窗口用python命令执行时正常:代码逐句在ipython中也正常:但是, 在wingIDE中运行报错“UnicodeEncodeError: 'ascii' codec can' ...
- MySQL上周新增激活用户在上周下单情况_20161107周一
上周新增激活用户在上周下单情况 1.上周激活用户明细 #上周激活用户明细 SELECT a.城市,a.用户ID,a.用户名称,b.用户地址,b.联系电话,a.订单日期,c.年周,c.上周一,a.订单I ...
- 结合Mysql和kettle邮件发送日常报表_20161001
十一假期 参加婚礼 稍晚点发博 整体流程步骤是: 写SQL-导出到excel设定excel模板调整格式-设置kettle转换--设置kettle邮件作业--完成 第一.写SQL 保持最近12个周的数据 ...
- codevs 2144 砝码称重2
传送门 2144 砝码称重 2 时间限制: 1 s 空间限制: 16000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 有n个砝码,现在要称一个质量为m ...
- js跨域请求方式 ---- JSONP原理解析
这篇文章主要介绍了js跨域请求的5中解决方式的相关资料,需要的朋友可以参考下 跨域请求数据解决方案主要有如下解决方法: 1 2 3 4 5 JSONP方式 表单POST方式 服务器代理 H ...