download:大数据高级开发工程师
实战技巧:if-else代码优化技巧
在实践的业务开发当中,经常会遇到复杂的业务逻辑,可能局部同窗完成出来的代码并没有什么问题,但是代码的可读性很差。本篇文章主要总结一下本人在实践开发中如何防止大面积的 if-else 代码块的问题。补充阐明一点,不是说 if-else 不好,而是多层嵌套的 if-else 招致代码可读性差、维护本钱高等问题。
现有如下一段示例代码,局部优化技巧是依据这段代码停止的
public class BadCodeDemo {
private void getBadCodeBiz(Integer city, List newDataList, List 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 oldCollect = oldDataList.stream().filter(p -> {
if (p.getIsHoliday() == 1) {
return true;
}
return false;
}).collect(Collectors.toList());
List 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(po.getCity());
}
}
}
}
}
}
}
}
复制代码
技巧一:提取办法,拆分逻辑
比方上面这段代码中
if(null != city) {
} else {
}
复制代码
这里能够拆分红两段逻辑,中心思想就是逻辑单元最小化,然后兼并逻辑单元。
private void getCityNotNull(Integer city, List newDataList) {
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);
}
}
}
// 兼并逻辑流程
private void getBadCodeBiz(Integer city, List newDataList, List oldDataList) {
if (city != null) {
this.getCityNull(city, newDataList);
} else {
//此处代码省略
}
}
复制代码
技巧二:分支逻辑提早return
比方 技巧一 中的 getCityNull 办法,我们能够这样写
public void getCityNotNull(Integer city, List newDataList) {
if (CollectionUtils.isEmpty(newDataList)) {
// 提早判别,返回业务逻辑
return;
}
TestCodeData newData = newDataList.stream().filter(p -> {
if (p.getIsHoliday() == 1) {
return true;
}
return false;
}).findFirst().orElse(null);
if (null != newData) {
newData.setCity(city);
}
}
复制代码
技巧三:枚举
经过 技巧一 和 技巧二 的优化,文章开头的这段代码被优化成如下所示:
public class BadCodeDemo {
public void getBadCodeBiz(Integer city, List newDataList, List oldDataList) {
if (city != null) {
this.getCityNotNull(city, newDataList);
} else {
this.getCityNull(newDataList, oldDataList);
}
}
private void getCityNotNull(Integer city, List newDataList) {
if (CollectionUtils.isEmpty(newDataList)) {
// 提早判别,返回业务逻辑
return;
}
TestCodeData newData = newDataList.stream().filter(p -> {
if (p.getIsHoliday() == 1) {
return true;
}
return false;
}).findFirst().orElse(null);
if (null != newData) {
newData.setCity(city);
}
}
private void getCityNull(List newDataList, List oldDataList) {
// 提早判别,返回业务逻辑
if (CollectionUtils.isEmpty(oldDataList) && CollectionUtils.isEmpty(newDataList)) {
return;
}
List oldCollect = oldDataList.stream().filter(p -> {
if (p.getIsHoliday() == 1) {
return true;
}
return false;
}).collect(Collectors.toList());
List newCollect = newDataList.stream().filter(p -> {
if (p.getIsHoliday() == 1) {
return true;
}
return false;
}).collect(Collectors.toList());
// 提早判别,返回业务逻辑
if (CollectionUtils.isEmpty(newCollect) && CollectionUtils.isEmpty(oldCollect)) {
return;
}
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(po.getCity());
}
}
}
}
}