「这是我参与2022首次更文挑战的第22天,活动详情查看:2022首次更文挑战」
前言
接下来我们可能会有一个新的产品规划,就是把目前的项目整体重构,架构师和技术负责人已经在做技术方案了。他们的考量应该是基于整体的,但是最终大部分精力还是会落到具体代码上。刚刚看到了一个讲代码重构思想的文章,跟大家分享一下。
if/else、switch/case
我们的业务代码中会经常要处理这样的逻辑:在每种条件下处理不同的逻辑,比如分别处理两个数的加减乘除。最常见的写法:
public int calculate(int a, int b, String operator) {
int result = Integer.MIN_VALUE;
if ("add".equals(operator)) {
result = a + b; }
else if ("multiply".equals(operator)) {
result = a * b; }
else if ("divide".equals(operator)) {
result = a / b; }
else if ("subtract".equals(operator)) {
result = a - b; }
return result;
}
// 或者用switch/case
switch (operator) {
case "add": result = a + b;
break;
// other cases
}
return result;
思路
上面这些是最基础的写法,那像这种基础代码如何重构呢?有很多重构方法可以用来解决这个问题,接下来是一些思路:
- 工厂类
- 定义一个操作接口
- 实现操作
- 实现操作工厂
- 在方法中调用
- 枚举
- 定义枚举类
- 在方法中调用 枚举适合于类型固定,可枚举的情况;同时枚举中是可以提供方法实现的,所以可以选择通过枚举进行重构。
- 命令模式
- command接口
- 实现command
- 在方法中调用
- 规则引擎
- 定义规则
- add规则
- 表达式
- 规则引擎 规则引擎适合规则很多且可能动态变化的情况;
- 策略模式 策略模式定义了算法族,分别封闭起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
综述
上面这些思路的实现代码在那篇文章中都有例子,但是在实际开发中,要考虑折中,业务和代价的折中、开发和维护的折中。期待我们的项目重构尽快提上日程啊!