我们日常开发的项目中,如果代码中存在大量的if-else语句,阅读起来非常的折磨(直接劝退),维护起来也很难,也特别容易出问题。比如说以下:
接下来,本文介绍我们常使用的8种方法去优化if-else。
希望这篇文章能对您有所启发。如果您觉得有价值,欢迎点赞或转载,并请记得注明出处
1、提前return,让正常流程走主干
如果if-else代码中包含return语句,或者我们可以将包含if-else的代码从主干中抽取到一个单独方法,这样就可以在这个方法中可以return掉。这中思想也是短路求值的一种体现。把多余 else 干掉,使代码更加优雅。
- 优化前代码:
1 | kotlin复制代码// 主流程代码 |
1 | arduino复制代码// 主流程代码 |
- 优化后代码:
1 | kotlin复制代码// 主流程代码 |
1 | csharp复制代码// 主流程代码 |
2、使用三目运算符
某些if-else可以优化为使用三目运算符,这样会让代码更简洁,可读性高。
- 优化前
1 | ini复制代码int price; |
- 优化后
1 | ini复制代码int price = condition1 ? 1 : (condition2 ? 2 : 0); |
3、使用Optional
我们在代码中判null会导致存在大量的if-else,这个时候我们可以考虑使用Java8的Optional
去优化。
- 优化前
1 | typescript复制代码public static void main(String[] args) { |
- 优化后代码:
1 | typescript复制代码public static void main(String[] args) { |
4、多态
我们可以将一些操作(比如一些状态)的一些共性的方法抽象成一个公共接口,然后针对这些操作实现这些接口完成不同的逻辑,在调用时我们只需要传入对应的操作类即可,对外的操作方法都是同一个。
- 优化前代码
1 | csharp复制代码public class OrderProcessing { |
- 优化后代码
1 | typescript复制代码// 状态接口 |
5、枚举
对一些创建了枚举值,针对不同的枚举值有不同的操作时,枚举也可以消除if-else。个人感觉有点像策略模式或者表驱动。
- 优化前
1 | csharp复制代码enum OperateTypeEnum{ |
- 优化后的代码
1 | typescript复制代码enum OperateTypeEnum{ |
这种方式也是我再处理一些枚举时,对应不同的处理逻辑时常用的一种方式。比如根据订单类型的不同返回类型对应的数据。当然我们枚举方法中处理逻辑时如果想用bean的话,可以当做参数传入或者直接从Spring容器中获取。
6、表驱动(Map+函数方法)
表驱动编程是一种通过查找表格而不是嵌套条件语句来实现的编程方法。可以使用数据结构(如数组、Map)来存储条件和对应的操作,这样就不必用很多的逻辑语句(if 或 case)来把它们找出来的方法。
- 优化前代码
1 | csharp复制代码private static OrderInfoVO operateOrder(String orderType, OrderInfoDO orderInfo){ |
- 优化后代码
1 | scss复制代码private static OrderInfoVO handlerOrder(String orderType, OrderInfoDO orderInfo){ |
当然Funtion
也可以根据业务需要,可以为Consumer
,Predicate
等。
不过我们也可以利用Spring的依赖注入,将其转换为对应的Map。比如上述代码也可以这么优化:
1 | typescript复制代码interface IOrderHandler{ |
7、策略模式+工厂模式
我们可以使用策略模式将每个条件分支抽象为一个策略类,然后在主逻辑中使用策略类来执行相应的逻辑。这种方式可以降低代码的耦合性,使得代码更加可维护和可扩展。然后再使用工厂模式定义一个策略工厂类去管理这些策略,即对外提供的都是策略工厂的方法。这种方法可以有效的去除if-else,并且代码逻辑更容易阅读维护以及扩展。
比如上例中,我们在处理不同订单类型时的handler类就是一个个的策略,我们也可以创建一个策略工厂类。
1 | arduino复制代码publid class OrderHandlerFactory{ |
8、规则引擎
使用规则引擎来管理条件和对应的执行逻辑。例如,Drools 是一个强大的规则引擎,它允许你定义规则并动态执行它们。再比如LiteFlow,EasyRule,都可以通过管理条件和对应的执行逻辑。可以消除if-else。规则引擎适合处理复杂的业务逻辑。通过编排条件去处理业务逻辑。
总结:
上述方案都可以达到优化if-else的效果,但是采用那种方案还是要看具体的代码逻辑以及业务处理逻辑,重要的是要评估项目的复杂性、维护性和性能需求,选择最适合项目需求的优化方案。在实际开发中,通常会根据具体情况结合多种方式来达到更好的优化效果。
本文已收录于我的个人博客:码农Academy的博客,专注分享Java技术干货,包括Java基础、Spring Boot、Spring Cloud、Mysql、Redis、Elasticsearch、中间件、架构设计、面试题、程序员攻略等
本文转载自: 掘金