如何优化臃肿的 if else 代码

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhuqiuhui/article/details/87027468

文章目录

1.前言

过完年第一天上班,第一天工作很平淡,排查了一个bug后,顺便优化一下工程中的if-else代码,欢迎讨论!

2.现状

现有后端的版本兼容代码与业务代码耦合度较高,不利于对程序的扩展,如果活动再升级一个版本,还得再添加一个if…else…分支,不符合开-闭原则,示例如下,代码大致意义是根据版本不同返回不同的值:

public Integer getIsPayOnline(Integer salesType, Integer isPayOnline, Integer playType) {
    if (DataVersionEnum.V_8_1.getValue().equals(salesType)) {
        // do something 
    }
    if (DataVersionEnum.V_10_18.getValue().equals(salesType)) {
        // do something 
    }
    if (DataVersionEnum.V_11_12.getValue().equals(salesType)) {
        // do something 
    }
    if (DataVersionEnum.V_11_28.getValue().equals(salesType) || DataVersionEnum.V_01_14.getValue().equals(salesType)) {
        // do something 
    }
    return isPayOnline;
}

3.方案

优化方法有很多种,下面利用字典结合策略模式来优化代码,

public interface Version {
 
    Integer getIsPayOnline(Integer isPayOnline, Integer playType);
 
    Integer getSalesType();
}
@Component
public class Version1018 implements Version {
 
    @Override
    public Integer getIsPayOnline(Integer isPayOnline, Integer playType) {
        // do something
    }
 
    @Override
    public Integer getSalesType() {
        return DataVersionEnum.V_10_18.getValue();
    }
}
@Component
public class Version1112 implements Version {
    @Override
    public Integer getIsPayOnline(Integer isPayOnline, Integer playType) {
        // do something
    }
 
    @Override
    public Integer getSalesType() {
        return DataVersionEnum.V_11_12.getValue();
    }
}
@Component
public class Version0114 implements Version {
 
    @Override
    public Integer getIsPayOnline(Integer isPayOnline, Integer playType) {
        // do something
    }
 
    @Override
    public Integer getSalesType() {
        return DataVersionEnum.V_01_14.getValue();
    }
}
@Component
public class VersionFactory {
 
    private Map<Integer, Version> map = Maps.newHashMap();
 
    private Version[] versions;
 
    @Autowired
    public VersionFactory(Version[] versions) {
        this.versions = versions;
    }
 
    @PostConstruct
    private void init() {
        Arrays.stream(versions).forEach(version -> map.put(version.getSalesType(), version));
    }
 
    public Version getVersion(int value) {
        return map.getOrDefault(value, new Version0114());
    }
}

这里没有写出所有的Version实现类,另外在原代码中 DataVersionEnum 的value值对应salesType的值,优化后的函数如下,很清爽了:

@Autowired
private VersionFactory versionFactory;
  
public Integer getIsPayOnline(Integer salesType, Integer isPayOnline, Integer playType) {
    return versionFactory.getVersion(salesType).getIsPayOnline(isPayOnline, playType);
}

猜你喜欢

转载自blog.csdn.net/zhuqiuhui/article/details/87027468
今日推荐