if else去除

我相信小伙伴一定看过多篇怎么去掉 if...else 的文章,也知道大家都很有心得,知道多种方法来去掉 if...else ,比如 Option,策略模式等等,但我相信大明哥这篇文章绝对是最全,最完备怎么去掉 if...else 的文章,里面有些方法我相信有小伙伴肯定不知道,我也不卖关子,直接进入主题,如何干掉 if...else。
notion image

方法一:提前 return

假如有如下代码:
这种代码我们一般采用提前 return 的方式,去掉不必要的 else。
这种方法一般只适合分支结构很简单的 if...else,我们可以提前 return ,把一些不必要的 if...else 去掉。

方法二:枚举

枚举其实也是可以去掉 if...else 的,如下:
可能有小伙伴说,靠,谁会写这种代码?别这么绝对,大明哥工作这么久了,到现在依然看到有工作 5 、6 年的人写这样的代码。这种类型的代码非常适合枚举来解决。
先定义一个枚举类:
有了这个枚举,上面代码直接可以优化为一行代码:
当然一般在实际项目中,这种处理方式也不是最佳的,最佳的方式应该是在数据库里面有一个码值配置表,然后加载到系统缓存中来,在通过 code 去取值。当然枚举也是一种很好的解决方案。

方案三:Optional 判空

我相信各位小伙伴的项目里面一定存在非空判断,如果为空,则抛出异常或者 return。
对于这种代码我们利用 Optional 可以非常优雅地解决。
这种方式是不是非常优雅,有格调。最后补充一句:
防止 NPE,是程序员的基本修养

方案四:表驱动法

表驱动法,是一种让你可以在表中查找信息,而不必用过多的 if...else 来把他们找出来的方法。如下:
优化方法如下:
其实这种方式也不是很好,因为它会显得代码非常臃肿。一种变形方案是将 doAction() 抽象成类。如下:
这种方式是不是比较优雅些!

方案五:策略模式 + 工厂方法

策略模式 + 工厂方法是解决 if...else 用得非常多的方案,它和上面的表驱动法有点儿类似。使用策略模式 + 工厂方法分为几个步骤,以上面例子为例:
  • 把条件模块抽象为一个公共的接口,策略接口
  • 根据每个逻辑,定义出自己具体的策略实现类,如下:
  • 工厂类,统一调度,用来管理这些策略,如下:
单例模式实现工厂类。
  • 使用
这种优化方式也是很优雅的,特别适合分支较多,逻辑较为复杂的代码块,这种方式将分支逻辑与业务代码解耦了,是一种很不错的方案。

方案六:责任链模式

你想不到责任链模式也能优化 if...else 吧。责任链我们可以看做是一个单链表的数据结构,一个对象一个对象地过滤条件,符合的就执行,然后结束,不符合的就传递到下一个节点,如果每个对象都无法处理,一般都有一个最终的节点来统一处理。
我们依然以上面那个例子为例。
  • 定义责任链处理请求节点
  • 定义首尾节点,用于一些异常情况的处理
  • 定义各个节点具体的实现节点
  • 定义工厂,来构建一条完整的责任链,并负责调度
  • 使用

方案七:Function

Function 是 Java 8 中的函数式接口,利用好它我们可以极大地简化我们的代码,例如利用它我们可以轻松去掉我们的 if...else。比如有下面一段代码:
现在我们利用 Function 来处理上面两段代码

处理抛出异常

  • 定义抛出异常的形式的函数式接口
这里只需要有一个这样的函数式接口就行,而且方法也没有返回值,是一个消费型接口。
  • 增加判断工具类
ValidateUtils 类也是非常简单的,如果传入的 flag 为 true,则抛出异常。isTrue() 返回值也是刚刚我们定义的 ThrowExceptionFunction。
  • 使用
使用方式是不是非常简单?

处理 if...else 分支

其实使用 Function 来去掉 if...else 分支我认为有点儿偏门,因为它非常依赖我们定义的 Function 函数,比如我们定义的方法只有两个参数,那它就只能处理处理两个分支的,对于三个分支的 if...else 则需要重新定义方法。下面以两个分支为例。
  • 定义函数式接口
函数式接口中定义了一个方法,doActionHandler(),它有两个参数,分别为:
  1. trueActionService:为 true 时要进行的操作
  1. falseActionService:为 false 时要进行的操作
  • 定义判断方法
增加一个工具类,用来判断为 true 时执行哪个方法,为 false 时执行哪个方法。
  • 使用

总结

大明哥在这里总结了 7 中方式用来解决 if...else 的问题,我相信里面总有一两种方案是你比较满意的,七种方案各有优劣,各自有各自的使用场景,我们需要在实践中不断领悟,在重构中不断进化,总结出适合自己最佳的重构方案。
重构之路,任重而道远,各位其行且珍惜
作者:大明哥_链接:https://juejin.cn/post/7296751524809048073来源:稀土掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
Loading...
目录
文章列表
王小扬博客
产品
Think
Git
软件开发
计算机网络
CI
DB
设计
缓存
Docker
Node
操作系统
Java
大前端
Nestjs
其他
PHP