版权声明:本文为博主原创文章,未经博主允许不得转载。 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);
}