满屏的if-else,看我怎么消灭你!

Posted 码农小宋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了满屏的if-else,看我怎么消灭你!相关的知识,希望对你有一定的参考价值。

  • 满屏的if-else,看我怎么消灭你!_微信
  • 技巧一:提取方法,拆分逻辑
  • 技巧二:分支逻辑提前return
  • 技巧三:枚举
  • 技巧四:函数式接口
  • 技巧五:设计模式
  • 其他技巧
  • 写在最后

在实际的业务开发当中,经常会遇到复杂的业务逻辑,可能部分同学实现出来的代码并没有什么问题,但是代码的可读性很差。

本篇文章主要总结一下自己在实际开发中如何避免大面积的 if-else 代码块的问题。补充说明一点,不是说 if-else 不好,而是多层嵌套的 if-else 导致代码可读性差、维护成本高等问题。

现有如下一段示例代码,部分优化技巧是根据这段代码进行的:

public class BadCodeDemo 

private void getBadCodeBiz(Integer city, List<TestCodeData> newDataList, List<TestCodeData> oldDataList)
if (city != null)

if (newDataList != null && newDataList.size() > 0)
TestCodeData newData = newDataList.stream().filter(p ->
if (p.getIsHoliday() == 1)
return true;

return false;
).findFirst().orElse(null);
if (newData != null)
newData.setCity(city);



else

if (oldDataList != null && newDataList != null)
List<TestCodeData> oldCollect = oldDataList.stream().filter(p ->
if (p.getIsHoliday() == 1)
return true;

return false;

).collect(Collectors.toList());
List<TestCodeData> newCollect = newDataList.stream().filter(p ->
if (p.getIsHoliday() == 1)
return true;

return false;
).collect(Collectors.toList());

if (newCollect != null && newCollect.size() > 0 && oldCollect != null && oldCollect.size() > 0)
for (TestCodeData newPO : newCollect)
if (newPO.getStartTime() == 0 && newPO.getEndTime() == 12)
TestCodeData po = oldCollect.stream().filter(p -> p.getStartTime() == 0
&& (p.getEndTime() == 12 || p.getEndTime() == 24)).findFirst().orElse(null);
if (po != null)
newPO.setCity(po.getCity());

else if (newPO.getStartTime() == 12 && newPO.getEndTime() == 24)
TestCodeData po = oldCollect.stream().filter(
p -> (p.getStartTime() == 12 || p.getStartTime() == 0)
&& p.getEndTime() == 24).findFirst().orElse(null);
if (po != null)
newPO.setCity(po.getCity());

else if (newPO.getStartTime() == 0 && newPO.getEndTime() == 24)
TestCodeData po = oldCollect.stream().filter(
p -> p.getStartTime() == 0 && p.getEndTime() == 24).findFirst().orElse(null);
if (po == null)
po = oldCollect.stream().filter(
p -> p.getStartTime() == 0 && p.getEndTime() == 12).findFirst().orElse(null);

if (po == null)
po = oldCollect.stream().filter(
p -> p.getStartTime() == 12 && p.getEndTime() == 24).findFirst().orElse(null);

if (po != null)
newPO.setCity(po.getCity());

else if (newPO.getTimeUnit().equals(Integer.valueOf(1)))
TestCodeData po = oldCollect.stream().filter(
e -> e.getTimeUnit().equals(Integer.valueOf(1))).findFirst().orElse(null);
if (po != null)
newPO.setCity(满屏的if-else,看我怎么消灭你!

满屏的if-else,看我怎么消灭你!

求求你们了,别再写满屏的 if/ else 了!

参数校验别再写满屏的 if/else 了,差点被劝退……

别再写满屏的爆爆爆炸类了,试试装饰器模式,这才是优雅的方式!!

别再写满屏的爆爆爆炸类了,试试装饰器模式,这才是优雅的方式!!