<返回更多

两个方法干掉代码中那些复杂的if-else

2021-04-30  微信公众号  wangyuancun
加入收藏

01导读

在项目中你有没有遇到过这样的代码:(伪代码如下)

     if(type==0){
            return "01";
        }else if(type==1){
            return "03";
        }else if(type==2){
            return "04";
        }else if(type==3){
          return "05"
        }
       //......

上面这种一大堆判断,看着是不是很让人头皮发麻,如果某天需求还需要增加判断是不是还得往下增加判断条件,这种大量的if/else if/....../else写在项目中估计代码review时会被骂死。

为了使代码看起来更加的简洁以及扩展性更强,今天我们就改造一下这种代码(其实这种大量的if/else if/else也有一点好处就是逻辑看着比较简单易懂)。

02代码改造(简单的业务)

如果只是上面这种简单的根据条件进行判断返回固定的值,我们可以利用map的特性来进行优化(在map中一个key只会绑定一个指定的value)。所以根据这个特性我们把上面的代码改造如下:

private static final HashMap<Integer,String> HASH_MAP =new HashMap<>();
static {
	HASH_MAP.put(0,"01");
	HASH_MAP.put(1,"03");
	HASH_MAP.put(2,"04");
	HASH_MAP.put(3,"05");
	//如果还有其他往后面加;
}

在需要返回值的地方直接使用HASH_MAP.get(type)就可以得到你想要的值了,这种方法是不是简单明了也避免了使用大量的if/esle if/......

上面的这个key或者value值也可以用枚举,这样的话也便于后面使用时可以进行统一管理;

03代码改造(复杂的业务)

可能在有些业务场景下,不一定只是根据条件去返回固定的值,而是在判断里面还要做一些其他的业务逻辑,伪代码如下:

      if (type==0){
           doSomething();
            System.out.println("我是火影忍者鸣人:"+type);
        }else if (type==1){
          doSomething();
            System.out.println("我是火影忍者卡卡西"+type);
        }else if(type==2){
           doSomething();
            System.out.println("我是木叶三忍自来也"+type);
        }

像上面这种在条件判断之后还需要做其他操作的业务,显然上面那种map的方式不能够满足了,这个时候我们可以使用策略+工厂的方法进行改造。

1:首先我们需要新建一个接口,如下:

public interface Handler extends InitializingBean {
    public void doSomething(Integer type);
}                                             

2:实现上面的接口把if条件里面的操作给抽取出来,这里我就写一个实现类,剩下的大家可以直接复制就行,代码如下:

@Component
public class HandlerImpl implements Handler{
    @Override
    public void doSomething(Integer type) {
        System.out.println("我是火影忍者鸣人:"+type);
    }
   //类初始化之后会执行这个方法
    @Override
    public void afterPropertiesSet() throws Exception {
        Factory.putHandler(0,this);
    }
}

上面的Factory.putHandler(type,this)可能暂时看得有点懵逼,别着急往下继续看。代码在下面。

3:这个时候我们就可以新建一个工厂来把if/else if/....优化掉,代码如下:

public class Factory {
    //map里面存储的是判断条件以及对应的Handle处理类;
     private static Map<Integer,Handler> HANDLER_MAP= new HashMap();
     //根据条件type得到对应的handler;
     public static Handler getHandler(Integer type){
         return HANDLER_MAP.get(type);
     }
     public static void putHandler(Integer type,Handler handler){
         HANDLER_MAP.put(type,handler);
     }
}

4:到这里基本上快要改造完了,现在我们再回头看把最上面的if业务改造,代码如下:

    @Test
    public void typeDo(){
        Integer type=0;
        Handler handler = Factory.getHandler(type);
        handler.doSomething(type);
    }

运行结果也达到了预期的效果,如下图01:

两个方法干掉代码中那些复杂的if-else

01

总结

上面我只是列了两种怎么优化大量的if/else if/...../else的方法,在实际项目中大家还是根据实际情况来处理使用,不要为了使用而使用!

作者:wangyuancun

微信公众号:wangyuancun

原创:02

声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>