当前位置: 代码迷 >> 综合 >> 一次重构的话题
  详细解决方案

一次重构的话题

热度:51   发布时间:2024-02-01 11:51:59.0

背景:

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

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

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

重构前:

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

重构后:

 //工厂类StrategyFactorypublic 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 {@Overridepublic void sign(SignRequest request) {//doSomething   }@Overridepublic void afterPropertiesSet() {StrategyFactory.registerSign(VendorCheckEnum.FAIL_CHECK.getCode(), this);}@Service
public class SignOnLineServiceImpl implements SignStrategyService, InitializingBean {@Overridepublic void sign(SignRequest request) {//doSomething   }@Overridepublic 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) {@Overridepublic Object builder(VendorConfig vendorConfig) {return vendorConfig.getConfigInfo();}},/*** 地址配置*/ADDRESS(1) {@Overridepublic 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);

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

  相关解决方案