0
点赞
收藏
分享

微信扫一扫

大数据高级开发工程师

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());

                }

            }

        }

    }

}


举报

相关推荐

0 条评论