消除if-else的实践,提升代码质量

我们的代码中总是有很多的if-else,这些代码既容易产生bug也提高了阅读代码的难度。这里总结几个方法来处理,消除if-else,清晰代码逻辑。

一、分类
二、异常逻辑优化
三、状态逻辑优化
四、真实案例
五、总结

一、分类

出现if-else的情况无非就是两种:

1、有些异常判断:代码中包含太多的异常判断,比如不能为空,集合长度大于0才能继续之类的。

2、不同状态不同处理:每个状态下都有很长一段逻辑需要处理,造成代码臃肿。

二、异常逻辑优化

1、多种条件返回相同结果

这种情况好理解,也比较常见,把多个判断放到一个判断里面就行了,优化后明显简单很多,也易读,代码行数也减少了。如下图分别为优化前后代码:

1相同结果重构.png

2、多层嵌套逻辑

这种情况也是我们最常见的一种,我们写代码的时候不觉得有什么问题,等到写完在看就会发现代码逻辑太深,不易理解。简单的案例和解决方案如下图:

2多层嵌套.png

3、多次嵌套逻辑不可提前返回

上面那种情况还是比较直接、简单的例子。我们平时也会遇到很多层判断获取到的结果并不是马上返回的,而是在后面的代码中需要的。这种情况就不好提前返回了。(真实业务代码,部分打了马赛克)如下图:

3逻辑异常-不能提前退出.png

那么这种情况怎么办呢?
实际上也简单,那就是把判断逻辑提出一个独立的方法来,然后就可以提前返回了啊!解决后如下图:

4逻辑异常-不能提前退出优化.png

扫描二维码关注公众号,回复: 10645960 查看本文章

三、状态逻辑优化

1、提取独立方法:当每个判断里面还有一大段代码的时候,是可以把这个里面的逻辑提成一个方法。这种情况在上一步的多层嵌套逻辑中就是已经解决的方案,本来sale()就是提出过后的样子了。
2、设计模式解决:设计模式也能解决这些方法,比如责任链模式、状态模式等都是能解决这类问题的,只不过用设计模式一般都是业务比较复杂,在代码开发前应该就计划好了设计模式,代码涉及的类比较多。这个就不代码验证了,看一个真实案例的类截图:

5设计模式解决.png

四、真实案例

下图是我开发的一个真实案例,主要逻辑就是根据代理商的套餐去分配合理的客户。大概逻辑讲一下:分配的客户有优先级,没有分配的可有优先分配过的客户,客户意向的产品刚好是代理商有的产品>是代理商同类产品>在同一个城市。

截图如下:
7真实案例1.png

还有一张:

8真实案例2.png

这已经是在开发过程中优化了很多的代码,很多分类、判断和最后的分发都已经独立成其他方法了。但是最终结果来看,代码还是比较复杂,逻辑嵌套太深,if-else代码太多,现在来开始优化。

第一步:提前返回方法,移除最外面的两个if。
9移除外层逻辑.png

第二步:剩下的逻辑是先找到没有分配的客户,进行分配,如果失败,继续分配其他客户。所以这段逻辑不好提前返回。那就独立成方法,如下图。
优化前:
10不可提前退出.png

优化后:

11提方法.png
优化后主流程瞬间神清气爽了。剩下的就是刚刚提出来的两个方法了,这里只看其中一个方法:
12方法优化前.png

优化后:

13优化后.png

这个优化和之前的优化方法差不多,能提前返回的提前返回了。而且在代码优化的过程中发现逻辑竟然也优化了。

五、总结

在我们写代码的时候可能顺着心思就写下来了,但当整个写完后再一看,太多的if-esle影响整体的美观和阅读。这个时候我们就可以简单的优化下的。最常见的方法就是看是不是能提前返回,减少逻辑的嵌套层数。

比如在上面那个真实案例的最后一步优化,最后竟然重整了逻辑顺序,并且还更加合情合理、清晰明了。所以看到了if-else代码我们不妨优化优化,说不定能产生更好的结果。

针对两种if-esle的解决方案总结

1、异常逻辑:把判断提前返回,解决嵌套太深,不能提前就提成独立的方法,然后在用提前返回。
2、状态逻辑:简单的可以把每个判断里面的代码独立成方法,复杂的就用设计模式解决。

Java程序员日常学习笔记,如理解有误欢迎各位交流讨论!
Java程序员日常学习笔记

发布了20 篇原创文章 · 获赞 48 · 访问量 1662

猜你喜欢

转载自blog.csdn.net/weixin_46421629/article/details/105180164