背景:

最近公司开始自建供应链系统,我接手了商家端各个系统的开发和重构任务,说实话对于一些祖传代码看起来真的很头疼,没办法只能一步一步的去梳理原理的业务逻辑,本篇主要记录下有关if- else 在项目重构时的一些案例和心得。

目的:代码可扩展、可维护。

  • 使用工厂模式和策略模式

重构前:

if (VendorCheckStatusEnum.PASS.getCode() == checkStatus) {
//doSomething
} else {
//doSomething
}

重构后:

//工厂类StrategyFactory
public class StrategyFactory {
private StrategyFactory() {
}

private static Map<Integer, SignStrategyService> services = new ConcurrentHashMap<>();

public static void registerSign(Integer type, SignStrategyService signStrategyService) {
services.put(type, signStrategyService);
}

public static SignStrategyService getSignStrategy(Integer type) {
return services.get(type);
}
}

//定义接口
public interface SignStrategyService {

void sign(SignRequest request);

}


//接口实现
@Service
public class SignOffLineServiceImpl implements SignStrategyService, InitializingBean {


@Override
public void sign(SignRequest request) {
//doSomething
}
@Override
public void afterPropertiesSet() {
StrategyFactory.registerSign(VendorCheckEnum.FAIL_CHECK.getCode(), this);
}

@Service
public class SignOnLineServiceImpl implements SignStrategyService, InitializingBean {

@Override
public void sign(SignRequest request) {
//doSomething

}
@Override
public void afterPropertiesSet() {
StrategyFactory.registerSign(VendorCheckEnum.SUCCESS_CHECK.getCode(),this);
}
}

//调用者
SignStrategyService strategy=StrategyFactory.getSignStrategy(vendor.getIsChecked());
strategy.sign(signRequest);

重构后虽然增加了代码量,但是对于后面增加的一些校验类型避免了更多if -else 的出现,重构之后逻辑清晰,职责更加明确。

  • 使用枚举
public enum VendorConfigEnum {

/**
* 默认配置
*/
TOLERATION(0) {
@Override
public Object builder(VendorConfig vendorConfig) {
return vendorConfig.getConfigInfo();
}
},
/**
* 地址配置
*/
ADDRESS(1) {
@Override
public Object builder(VendorConfig vendorConfig) {
return JSON.parseArray(vendorConfig.getConfigInfo(), AddressTemplate.class);
}
};


private Integer type;

public abstract Object builder(VendorConfig vendorConfig);

public static VendorConfigEnum getInstance(Integer type) {
for (VendorConfigEnum configEnum : values()) {
if (configEnum.getType().equals(type)) {
return configEnum;
}
}
return null;
}
//调用者
Object configInfo = VendorConfigEnum.getInstance(vendorConfig.getConfigType()).builder(vendorConfig);

本次重构从实际的业务出发对原有逻辑的改造,上面两种方式并不一定是适合所有的业务场景,如果大家有更好的方式欢迎交流!