我们的代码中总是有很多的if-else,这些代码既容易产生bug也提高了阅读代码的难度。这里总结几个方法来处理,消除if-else,清晰代码逻辑。
一、分类
二、异常逻辑优化
三、状态逻辑优化
四、真实案例
五、总结
一、分类
出现if-else的情况无非就是两种:
1、有些异常判断:代码中包含太多的异常判断,比如不能为空,集合长度大于0才能继续之类的。
2、不同状态不同处理:每个状态下都有很长一段逻辑需要处理,造成代码臃肿。
二、异常逻辑优化
1、多种条件返回相同结果
这种情况好理解,也比较常见,把多个判断放到一个判断里面就行了,优化后明显简单很多,也易读,代码行数也减少了。如下图分别为优化前后代码:
2、多层嵌套逻辑
这种情况也是我们最常见的一种,我们写代码的时候不觉得有什么问题,等到写完在看就会发现代码逻辑太深,不易理解。简单的案例和解决方案如下图:
3、多次嵌套逻辑不可提前返回
上面那种情况还是比较直接、简单的例子。我们平时也会遇到很多层判断获取到的结果并不是马上返回的,而是在后面的代码中需要的。这种情况就不好提前返回了。(真实业务代码,部分打了马赛克)如下图:
那么这种情况怎么办呢?
实际上也简单,那就是把判断逻辑提出一个独立的方法来,然后就可以提前返回了啊!解决后如下图:
三、状态逻辑优化
1、提取独立方法:
当每个判断里面还有一大段代码的时候,是可以把这个里面的逻辑提成一个方法。这种情况在上一步的多层嵌套逻辑中就是已经解决的方案,本来sale()就是提出过后的样子了。
2、设计模式解决:
设计模式也能解决这些方法,比如责任链模式、状态模式等都是能解决这类问题的,只不过用设计模式一般都是业务比较复杂,在代码开发前应该就计划好了设计模式,代码涉及的类比较多。这个就不代码验证了,看一个真实案例的类截图:
四、真实案例
下图是我开发的一个真实案例,主要逻辑就是根据代理商的套餐去分配合理的客户。大概逻辑讲一下:
分配的客户有优先级,没有分配的可有优先分配过的客户,客户意向的产品刚好是代理商有的产品>是代理商同类产品>在同一个城市。
截图如下:
还有一张:
这已经是在开发过程中优化了很多的代码,很多分类、判断和最后的分发都已经独立成其他方法了。但是最终结果来看,代码还是比较复杂,逻辑嵌套太深,if-else代码太多,现在来开始优化。
第一步:提前返回方法,移除最外面的两个if。
第二步:剩下的逻辑是先找到没有分配的客户,进行分配,如果失败,继续分配其他客户。所以这段逻辑不好提前返回。那就独立成方法,如下图。
优化前:
优化后:
优化后主流程瞬间神清气爽了。剩下的就是刚刚提出来的两个方法了,这里只看其中一个方法:
优化后:
这个优化和之前的优化方法差不多,能提前返回的提前返回了。而且在代码优化的过程中发现逻辑竟然也优化了。
五、总结
在我们写代码的时候可能顺着心思就写下来了,但当整个写完后再一看,太多的if-esle影响整体的美观和阅读。这个时候我们就可以简单的优化下的。最常见的方法就是看是不是能提前返回,减少逻辑的嵌套层数。
比如在上面那个真实案例的最后一步优化,最后竟然重整了逻辑顺序,并且还更加合情合理、清晰明了。所以看到了if-else代码我们不妨优化优化,说不定能产生更好的结果。
针对两种if-esle的解决方案总结:
1、异常逻辑
:把判断提前返回,解决嵌套太深,不能提前就提成独立的方法,然后在用提前返回。
2、状态逻辑
:简单的可以把每个判断里面的代码独立成方法,复杂的就用设计模式解决。
Java程序员日常学习笔记,如理解有误欢迎各位交流讨论!