重构之重复代码:

     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语句的更多相关文章

  1. switch语句的妙用

    switch语句的普通用法很简单,如下: var a = 3; switch (a) { case 1: console.log(a); break; case 2: case 3: console. ...

  2. 106运用SWITCH语句打印星期几的单词

    package com.chongrui.test;/*运用SWITCH语句打印星期几的单词 * */ public class TypeConvertion { public static void ...

  3. 通过goto语句学习if...else、switch语句并简单优化

    goto语句在C语言中实现的就是无条件跳转,第二章一上来就介绍goto语句就是要通过goto语句来更加清楚直观的了解控制结构. 我理解的goto语句其实跟switch语句有相似之处,都是进行跳转.不同 ...

  4. Java中简单的操作(if语句、常用操作符、switch语句、变量赋值等)

    ---------------------if语句介绍--------------------------------------------------- class IfDemo { public ...

  5. Switch语句的case穿透

    Switch语句的case穿透 一 switch语句几点说明: 1. case后面只能是常量,不能是变量,而且,多个case后面的值不能出现相同的. 2.case后面表达式可以接受: 基本数据类型,b ...

  6. ECMA中的switch语句

    switch借鉴自其他语言,但也有自己的特色. 1.可以在switch语句中使用任何数据类型(数值.字符串.对象等),很多其他语言中只能使用数值. 2.每个case的值不一定是常量,可以是变量或者表达 ...

  7. switch语句下的变量声明和定义

    switch语句下的变量声明和定义的问题: switch...case...语句中存在声明和定义会出现一些问题.这个由switch语法特性决定的, switch中每个case都是平等的层次,区别于一般 ...

  8. 透过IL看C#:switch语句(转)

    透过IL看C# switch语句(上) 摘要: switch语句是 C#中常用的跳转语句,可以根据一个参数的不同取值执行不同的代码.本文介绍了当向 switch语句中传入不同类型的参数时,编译器为其生 ...

  9. switch语句

    应用条件语句可以很方便地使程序实现分支,但是出现分支比较多的时候,虽然可以用嵌套的if语句来解决,但是程序结构会显得复杂,甚至凌乱.为方便实现多情况选择,C++提供了一种switch开关语句.   一 ...

随机推荐

  1. Windows Server 2008 MS Office 操作 检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件失败,原因是出现以下错误: 80070005 拒绝访问。 (异常来自 HRESULT:0x80070005 (E_ACCESSDENIED))。

    Make sure that you have Office runtime installed on the server. If you are using Windows Server 2008 ...

  2. netstat参数记录

    可以使用man netstat查看TCP的各种状态信息描述  ESTABLISHED       socket已经建立连接  CLOSED            socket没有被使用,无连接  CL ...

  3. Hadoop- Hadoop环境搭建

    Windows下Hadoop的安装 准备工具:64位的JDK,Hadoop安装包(我使用的是2.6.1) JDK下载地址 官网: http://www.oracle.com/technetwork/j ...

  4. (转)HLS协议,html5视频直播一站式扫盲

    本文来自于腾讯bugly开发者社区,原文地址:http://bugly.qq.com/bbs/forum.php?mod=viewthread&tid=1277 视频直播这么火,再不学就 ou ...

  5. pod lib lint 报错 Unable to find a specification for `AMap2DMap` depended upon by `DingtalkPod

    执行 pod验证 报错如下 ➜  DingtalkPod git:(2.0.0) ✗ pod lib lint --sources='https://github.com/AloneMonkey/Mo ...

  6. APIO2018爆零记

    Day1 集合 7点和yyc他们在学校简单的集合了一下 在大通道看到了整个年级来上操 嘲讽了一番就大摇大摆的走出了校门 校门口看无迟到周的权益部长lzj同学满眼的羡慕 2333 然后到了裕龙酒店登记入 ...

  7. Django 发送email配置详解及各种错误类型

    跟随Django Book的内容发送邮件不成功,总结一下需要配置好settings.py文件,还要注意一些细节. 1.在settings文件最后添加以下内容,缺一不可! EMAIL_HOST= 'sm ...

  8. 6 git 生成SSH公钥/私钥 查看公钥

    如果没有公钥的话就生成公钥私钥:  $ ssh-keygen 然后连续回车(一次是位置,两次密码)

  9. jQuery中attr()与prop()区别介绍

    .attr() : 获取匹配的元素集合中的第一个元素的属性的值 或 设置每一个匹配元素的一个或多个属性. •.attr( attributeName ) •.attr( attributeName ) ...

  10. DAL 层引用 System.Net.Http ,引发的一阵心慌

    快下班的时候 代码data 数据层编译失败,引起整个解决方案全部失败:其他同事虽然vs 版本不同,但是都能编译通过:考虑到今天更改过vs 的设置,把今天更改的设置全部都恢复,结果还是不行.最后直接恢复 ...