精华内容
下载资源
问答
  • 在项目中遇到了使用switch语句判断条件,但问题是条件比较多,大概有几十个条件,满屏幕的case判断,是否有更优雅的写法替代switch语句呢?  假设有这样的一个场景:商场经常会根据情况采取不同的打折方案,如果...
  • 运用策略模式替换switch case

    千次阅读 2018-11-26 22:39:27
    一个接口需要根据前段传入的资产类型(assetType),调用不同的业务类中的资产明细方法(dealList),最初的做法就是最常见的switch case或者if/else调用不同的service。相信每个程序员看到代码中大段的判断逻辑代码...

    一、业务场景

    一个接口需要根据前段传入的资产类型(assetType),调用不同的业务类中的资产明细方法(dealList),最初的做法就是最常见的switch case或者if/else调用不同的service。相信每个程序员看到代码中大段的判断逻辑代码都会很头疼,刚好之前看过《重构既有代码》这本Java届的经典书,里面就明确指出switch case违反开闭原则,可以用策略模式改写。

    二、实现逻辑

    1.定义统一资产接口,每种资产实现此接口,代码如下:

    public interface AssetService {
        Integer assetType();
    
        DealListResponse queryDealList(Integer assetId, Integer status, Integer sinceId, Integer count);
    }
    

    2.资产service实现接口,并重写assetType()和queryDealList()方法,代码如下:

    @Service
    public class CashService implements AssetService {
        @Autowired
        private CashDetailService cashDetailService;
    
        @Override
        public Integer assetType() {
            return AssetType.CASH.getId();
        }
    	 @Override
        public DealListResponse queryDealList(Integer assetId, Integer status, Integer sinceId, Integer count) {
    		   
    	 }
        
    

    3.统一分发路由类,根据assetType调用对应的service,代码如下:

    @Service
    public class AssetServiceRoute {
        @Resource
        private AssetService[] assetServices;
    
    
        public AssetService route(Integer assetType) {
            for (AssetService assetService : assetServices) {
                if (Objects.equals(assetType, assetService.assetType())) {
                    return assetService;
                }
            }
            throw new BusinessRuntimeException(GiveErrorCode.CHECK_PARAM_FAILED);
        }
    
    }
    

    4.调用,代码如下;

     public DealListResponse dealList(Integer assetType, Integer assetId, Integer status, Integer sinceId, Integer count) {
            AssetService assetService = assetServiceRoute.route(assetType);
            if (assetService == null) {
                throw new BusinessRuntimeException(GiveErrorCode.INVALID_PARAMS);
            }
            return assetService.queryDealList(assetId, status, sinceId, count);
        }
    

    三、代码分析

    意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。
    主要解决:在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护(违反开闭原则)。
    何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。
    如何解决:将这些算法封装成一个一个的类,任意地替换。
    关键代码:实现同一个接口。

    展开全文
  • 重构一:用多态替换switch语句

    千次阅读 2018-12-16 15:49:20
    编程中我们尽量少用switch语句,使用switch语句会出现大量重复代码,我们可以采用java的多态特性,使用state模式来替换switch语句,具体方式如下:  举个例子,假设一个电影租赁的程序,包括客户(Customer)、租赁...

        编程中我们尽量少用switch语句,使用switch语句会出现大量重复代码,我们可以采用java的多态特性,使用state模式来替换switch语句,具体方式如下:

       举个例子,假设一个电影租赁的程序,包括客户(Customer)、租赁(Rental)、电影(Movie)三个类,

    在Movie类中,有一个获取电影租金的方法getChartge,它需要根据电影的类型和租期来计算电影租金,方法中我们采用了switch语句来进行电影类型判断和租金方法计算。

    很显然,case分支中包括大量计算租金的代码,还有可能出现重复,将来电影类型扩充和修改需要越多复杂的switch语句,这样不利于程序的扩展和维护,这时候我们可以运用state模式添加一个中间层类Price来代表电影的类型,每一种类型对应一个Price的子类,具体关系见下图:

    同时我们在Price类中添加一个抽象的函数getPriceCode获取类型代码,在子类中实现,

    做完这些之后,我们在Movie类中利用多态机制添加Price类的引用和方法的调用,

    我们接下来对包含switch语句的租赁价格的方法getCharge方法进行改造,我们在将Switch代码段移植到Price类中,对每一个case分支在Price子类的覆盖getCharge方法,

     

    我们通过添加一个中间层类Price利用java的多态特性将Movice中的getCharge方法进行了重构,如果将来添加影片类型,修改费用计算方式,可以通过添加Price子类和修改getCharge方法类进行,这也是state设计模式在重构中一个应用,希望对您有很好的帮助。

    展开全文
  • js代码-替换switch

    2021-07-16 12:30:41
    js代码-替换switch
  • switch(value){ case "A": name="AA"; case "B": name= BB } return name } 其实这段代码可以这样写 fun(value){ option={ A:"AA", B:"BB" } returnoption[value] } 这么写有什么好处呢? ...

    你是不是经常写这样的代码

    fun(value){

     name=""

     switch(value){

      case "A":

       name= "AA";

      case "B":

       name= BB

     }

     return name

    }

     

    其实这段代码可以这样写

    fun(value){

     option={

      A:"AA",

      B:"BB"

     }

     return option[value]

    }

    这么写有什么好处呢?

    1、逻辑清晰

    2、方便把option提出了作为配置参数,就是我们常见的框架中的配置参数

    例如前端ant的table控件的columns

    columns=[

    {

    title: "ID",

    dataIndex: "Id"

    },

    {

    title: "Name",

    dataIndex: "Name"

    },

    ]

    每一列的渲染其实是一样的,所以直接提出有差别的地方作为配置参数

    不只是前端,任何地方都可以使用这样方法编写,这是一种框架思维

     

    展开全文
  • 代码重构- - -多态+工厂模式替换Switch 一、问题描述: 有一个演出类:Show,演出类里面能有一个获取折扣方法getDiscount(int type),根据不同类型的顾客提供不同的计算折扣方式; 二、Code <一>Switch结构: ...

    代码重构- - -多态+工厂模式替换Switch

    一、问题描述:
    有一个演出类:Show,演出类里面能有一个获取折扣方法getDiscount(int type),根据不同类型的顾客提供不同的计算折扣方式;
    二、Code
    <一>Switch结构:

    public class Show{
        public static final int SVIP = 1;
        public static final int VIP = 2;
        public static final int NORMAL = 3;
        
        ......... // 其他部分
        public double getDiscount(int type){
    
            Switch(type){
                case 1: 计算方式1; return discount1; break;
                case 2: 计算方式2; return discount2;break;
                case 3: 计算方式3; return discount3;break;
            }
        }
    }
    

    <二> 利用多态

    1. 创建一个接口Discount;
    public interface Discount{
        public double getDiscount();
    }
    
    1. 每种不同类型的人都创建一个类并继承Discount接口,将计算方法写在重写后的方法里;
    public class SvipDiscount implements Discount{    public double getDiscount(){
    
            计算方式1,得到discount1;
            return discount1;
        }
    }
    
    public class VipDiscount implements Discount{
        public double getDiscount(){
    
            计算方式2,得到discount2;
            return discount2;
    
        }
    }
    
    public class NormalDiscount implements Discount{
        public double getDiscount(){
    
            计算方式3,得到discount3;
            return discount3;
    
        }
    }
    
    1. 修改Show类:
    public class discountFactory{
        Discount discount;
        public static final int SVIP = 1;
        public static final int VIP = 2;
        public static final int NORMAL = 3;
        
        ......... // 其他部分
    
        public double getDiscount(int type){
            Switch(type){
                case 1: discount = new SvipDiscount();
                case 2: discount = new VipDiscount();
                case 3: discount = new NormalDiscount();
            }
            return discount.getDiscount();
        }
    }
    

    <三>使用反射机制实现工厂模式替换switch:

    1. 同<二>2
    2. 创建折扣工厂
    public class DiscountFactory {
           public Object getDiscountInstance(Class<?> cls) throws Exception{
                 Object obj = cls.newInstance();
                 return obj;
           }
    }
    
    1. 计算某类型顾客的折扣(以VIP为例):
    public class Test{
        public static void main(String[] args){
        	DiscountFactory factory = new DiscountFactory();
        	Discount discount = null;
        	try {
        		discount = (VIPDiscount)factory.getDiscountInstance(VIPDiscount.class);
        		double result = discount.getDiscount();
        		System.out.println(result);
        	} catch (Exception e) {
        		System.out.println();
    		}
           
        }
    }
    

    三、总结
    Switch结构不利于代码的维护和扩展,比如,以后有新的分支加入,就需要修改原来的类,违反了开闭原则;但是结构清晰,容易理解;而利用多态+工厂模式却能很轻易的扩展代码,缺点是:设计起来比较复杂,代码阅读起来需要不停切换上下文,不易于理解和快速开发,此外,这种方式会产生很多的子类,也不太利于代码的阅读;

    展开全文
  • 参考文档: ...用switch case的缺点: 代码臃杂,经常一个case能写很多行,代码不易阅读 每次在使用switch case语句的时候,都应该考虑,能不能使用策略模式替代switc...
  • 都说“多态替换switch” 或者“多态取消switch”我觉得是不是翻译错了?即使引入了多态,也只能简化switch吧,因为无论如何在实例化的时候还是需要判断啊!!!!
  • switch方案这时候我们用switch取代了 elseif,从一个坑里跳入另外的一个坑。我们必须在每一个执行之后加上break,每个语句中加上case,导致难以调试和嵌套错误。随着条件的增加,性能会非常的差,它要对每...
  • 使用工厂方法替换switch语句

    千次阅读 2017-12-31 11:25:43
    如果switch语句中的分支固定,且不可变(例如,星期中只有7天)不用使用工厂方法替换;如果分支不固定,或将来有可能改,可以采用工厂方法来替换switch语句,这样就符合开发闭合原则。
  • 替换switch case方法的方式1--多态

    千次阅读 2013-03-04 22:28:20
    double getSpeed() { switch (_type) { case EUROPEAN: return getBaseSpeed(); case AFRICAN: return getBaseSpeed() - getLoadFactor() * _numberOfCoconuts; case NORWEGI
  • 主要介绍了使用命令对象代替switch语句的写法示例,JS规范里面是禁止使用switch语句的,使用命令对象可以完美的解决这个问题,需要的朋友可以参考下
  • C++11使用表格驱动技术替换switch case

    千次阅读 2017-12-23 20:25:51
    当你使用switch case有很多种类时,往往代码写得非常长,如下: int main() { int i; i=1; switch(i) { case 1: printf("%d/n",i); break; case
  • C++ switch/case的替换方案

    千次阅读 2019-07-03 19:16:01
    1. 常规switch 2. 多态+std::map取代switch 3. 函数指针+std::map取代switch 4. 状态模式取代switch 5. 多态+模板取代switch 1. 常规switch #include <iostream> enum EnumType { enumOne, enumTwo, ...
  • 假设有这样的一个场景:商场经常会根据情况采取不同的打折方案,如果打折方案比较少,可以考虑使用switch语句作判断。但如果有几十甚至几百种打折方案的时候,用switch语句就不够优雅。一、先来一个打折接口。 ...
  • 很多时候,当switch中有N个分支,且分支数已达10+,每个分支都是一个不小的方法体,那我们是不是应该考虑换一种方式来实现这个分支。 而我目前所能想到的是会用到如下几种方法。 1.Action 2.Func 3.Attribute 4.反射...
  • switch case给定一个操作符,就会选择执行相应的程序,如果选择有很多,就不得不写很多的case,这样子就非常的长,代码臃肿。如一个计算器的代码: switch(oper){ case add: ... case sub: .... case mul: .....
  • 下面是一个简单的工厂模式的例子,然后把这个例子里面的switch语句通过反射来实现: 创建一个ITree的接口: public interface ITree { void plant(); } 让三个不同的树的对象分别实现这个接口: public class ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 127,127
精华内容 50,850
关键字:

替换swith