一次重构的话题

背景:

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

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

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

重构前:

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

重构后:

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

    private static Map 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);

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

你可能感兴趣的:(随笔)