项目重构,我是如何优化大量屎一样的 if else 代码的?

简介:   目录:  if else策略模式1、首先抽象业务处理器2、将业务处理器和其支持处理的类型放到一个容器中,java里Map就是最常用的容器之一3、定义不同的处理器4、测试类  前段时间,我将公司系统中的批量审单的功能进行了重构,用到了java的并发编程进行异步化处理,数据库的乐观锁机制处理多线程并发更新数据。  其中批量审单的业务处理涉及到多种任务类型,对应不同的业务方法进行处理,比如转仓,转快递,添加赠品,删除赠品,拆分订单,批量驳回,批量作废等等,其中就用到了策略模式。

  目录:

  if else策略模式1、首先抽象业务处理器2、将业务处理器和其支持处理的类型放到一个容器中,java里Map就是最常用的容器之一3、定义不同的处理器4、测试类

  前段时间,我将公司系统中的批量审单的功能进行了重构,用到了java的并发编程进行异步化处理,数据库的乐观锁机制处理多线程并发更新数据。

  其中批量审单的业务处理涉及到多种任务类型,对应不同的业务方法进行处理,比如转仓,转快递,添加赠品,删除赠品,拆分订单,批量驳回,批量作废等等,其中就用到了策略模式。

  if else

  if ("BATCH_CHANGE_WAREHOUSE".equals(taskType)) {

  //批量转仓逻辑

  } else if ("BATCH_CHANGE_SHIPPING".equals(taskType)) {

  //批量转快递逻辑

  } else if ("BATCH_REPLACE_ORDER_GOODS".equals(taskType)) {

  //批量替换订单商品逻辑

  } else if ("BATCH_DELETE_ORDER_GOODS".equals(taskType)) {

  //批量删除订单商品逻辑

  } else if ("BATCH_ADD_MEMO".equals(taskType)) {

  //批量添加备注逻辑

  } else {

  //任务类型未知

  System.out.println("任务类型无法处理");

  }

  看起来,思路清晰,if,else分支也很清楚,但不觉得代码很臃肿,维护起来麻烦吗

  尤其是其他人来接锅的时候,连看下去的欲望都没有了。这时候你需要用策略模式消除其中的if else,进行一下简单的重构!

  策略模式

  1、首先抽象业务处理器

  public abstract class InspectionSolver {

  public abstract void solve(Long orderId, Long userId);

  public abstract String[] supports();

  }

  2、将业务处理器和其支持处理的类型放到一个容器中,java里Map就是最常用的容器之一

  @Component

  public class InspectionSolverChooser implements ApplicationContextAware {

  private MapchooseMap=new HashMap<>();

  public InspectionSolver choose (String type) {

  return chooseMap.get(type);

  }

  @PostConstruct

  public void register () {

  MapsolverMap=context.getBeansOfType(InspectionSolver.class);

  for (InspectionSolver solver : solverMap.values()) {

  for (String support : solver.supports()) {

  chooseMap.put(support,solver);

  }

  }

  }

  private ApplicationContext context;

  @Override

  public void setApplicationContext (ApplicationContext applicationContext) throws BeansException {

  this .context=applicationContext;

  }

  }

  这里是在应用启动的时候,加载spring容器中所有InspectionSolver类型的处理器,放到InspectionSolverChooser的map容器中。

  注意是InspectionSolver类型,所以定义的二手手机号码拍卖处理器都得继承InspectionSolver

  其次是spring容器中的才能加载,所以定义的处理器都得放到spring容器中(@Component注解不能少)

  3、定义不同的处理器

  @Component

  public class ChangeWarehouseSolver extends InspectionSolver {

  @Override

  public void solve(Long orderId, Long userId) {

  System.out.println("订单"+orderId+"开始进行批量转仓了。。");

  }

  @Override

  public String[] supports() {

  return new String[] {InspectionConstant.INSPECTION_TASK_TYPE_BATCH_CHANGE_WAREHOUSE};

  }

  }

  @Component

  public class ChangeShippingSolver extends InspectionSolver{

  @Override

  public void solve(Long orderId, Long userId) {

  System.out.println("订单"+orderId+"开始进行转快递了。。");

  }

  @Override

  public String[] supports() {

  return new String[] {InspectionConstant.INSPECTION_TASK_TYPE_BATCH_CHANGE_SHIPPING};

  }

  }

  @Component

  public class ReplaceOrderGoodsSolver extends InspectionSolver{

  @Override

  public void solve(Long orderId, Long userId) {

  System.out.println("订单"+orderId+"开始进行替换商品了");

  }

  @Override

  public String[] supports() {

  return new String[]{InspectionConstant.INSPECTION_TASK_TYPE_BATCH_REPLACE_ORDER_GOODS};

  }

  }

  4、测试类

  @RunWith(SpringJUnit4ClassRunner.class)

  @SpringBootTest(classes=Application.class)// 指定spring-boot的启动类

  public class InspectionTest {

  @Autowired

  private InspectionSolverChooser chooser;

  @Test

  public void test() throws Exception{

  //准备数据

  String taskType=InspectionConstant.INSPECTION_TASK_TYPE_BATCH_CHANGE_WAREHOUSE;

  Long orderId=12345L;

  Long userId=123L;

  //获取任务类型对应的solver

  InspectionSolver solver=chooser.choose(taskType);

  if (solver==null) {

  throw new RuntimeException("任务类型暂时无法处理!");

  }

  //调用不同solver的方法进行处理

  solver.solve(orderId,userId);

  }

  }

  在测试类中我消除了可能一长段的if else,从选择器InspectionSolverChooser中根据type的不同取出不同的任务处理器InspectionSolver

  然后调用其solve()方法进行任务处理,不同处理器调用的当然就是不同的solve()方法了,目的达到。

  End

  作者:坚持就是胜利

  来源:

  juejin/post/5d12228de51d45775c73dd1b

目录
相关文章
|
设计模式 算法
重构,避免重构误区
重构,避免重构误区
41 0
|
设计模式
重构·改善既有代码的设计.03之重构手法(上)
之前的重构系列中,介绍了书中提到的重构基础,以及识别代码的坏味道。今天继续第三更,讲述那些重构手法(上)。看看哪些手法对你的项目能有所帮助......
19248 1
重构·改善既有代码的设计.03之重构手法(上)
|
设计模式
重构·改善既有代码的设计.04之重构手法(下)完结
重构改善既有代码的设计完结篇,汇总了全部的重构手法。看看哪些手法对你的项目能有所帮助…
7405 2
重构·改善既有代码的设计.04之重构手法(下)完结
|
开发者
工作一年,我重新理解了《重构》
重构是一种在不改变代码本身执行效果的前提下,让代码变得更加整洁易懂的方式。代码不仅要让机器能够实现预期的处理逻辑,更要能够面向开发人员简洁易懂,便于后期维护升级。
372 5
|
设计模式 测试技术
重构·改善既有代码的设计.02之代码的“坏味道”
之前在《重构·改善既有代码的设计.01》中初步了解了重构的基本前提,基础原则等入门知识。今天我们继续第二更......
205 1
重构·改善既有代码的设计.02之代码的“坏味道”
|
消息中间件 JavaScript 小程序
用1个月重构了同事写的烂代码,我总结出了15条重写烂代码的经验!
用1个月重构了同事写的烂代码,我总结出了15条重写烂代码的经验!
|
数据库
高质量代码优化!谈谈重构项目中if-else代码的几点建议
本篇文章探讨了代码的重构以及优化,主要针对代码中大量的条件判断if-else语句问题提出了具体的优化建议。介绍了优化if-else语句的几种有效的方法,包括switch,接口interface以及数据库实现对条件语句进行的优化。
172 0
高质量代码优化!谈谈重构项目中if-else代码的几点建议
|
Java Spring
9条消除if...else的锦囊妙计,助你写出更优雅的代码(下)
9条消除if...else的锦囊妙计,助你写出更优雅的代码(下)
|
数据格式 索引
日常开发之重构
作为开发人员,应该让重构贯穿于你的开发日常的每一刻。
347 0
|
设计模式 算法 Java
9条消除if...else的锦囊妙计,助你写出更优雅的代码
9条消除if...else的锦囊妙计,助你写出更优雅的代码