如何解决 if-else 过多的问题

2024-05-08 14:32
文章标签 问题 解决 else 过多

本文主要是介绍如何解决 if-else 过多的问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

if-else基本上是所有高级语言都有的语句。Java,Python,Go,C++。可以说if-else是编程语言种必须用的。基本上大大小小的需求都需要用到if-else。if-else不能滥用,不要让自己变成只会写if-else的程序员。if-else滥用会导致代码可读性,维护成本增高。我们需要使用好if-else来。

  1. 使用卫语句,提前return。
    提前return减少不必要的判断,减少If-else嵌套层次。
    优化前:
        if(a != null){b = doSomething(a);if(b != null){c = doSomething(b);if(c != null){d = doSomething(c);if(d != null){doSomething(d);}}}}

想想如果我们要在第二层,再增加一个同样的if-else判断会咋样,修改麻烦不?我们得把第二层之后的所有代码再包一层。再来几个怎么修改?
优化之后:

        if(a == null){return;}b = doSomething(a);if(b == null){return;}c = doSomething(b);
  1. 表驱动
    对于固定的那种If-else多层次判断的。我们可以使用类似表格的方式。找到某个输入对应需要的结果函数。
    优化前:
        if(name.equals("A") || name.equals("B")){status = 0;}else if(name.equals("C") || name.equals("D")){status = 1;}else if(name.equals("E") || name.equals("F")){status = 2;}else {status = 3;}

优化后

        Map<String,Integer> map = new HashMap<String,Integer>(){{put("A",0);put("B",0);put("C",1);put("D",1);}};status = map.getOrDefault("C",3);

如果复杂点的,可以使用Map与Function来解决
优化前

        if(name.equals("A") || name.equals("B")){result = doSomethingA(status);}else if(name.equals("C") || name.equals("D")){result = doSomethingC(status);}else {result = doSomethingOther(status);}

优化后:

        Map<String, Function<Integer,String>> map = new HashMap<String, Function<Integer,String>>(){{put("A", LearnDemo::doSomethingA);put("B", LearnDemo::doSomethingA);put("C", LearnDemo::doSomethingC);}};result = map.getOrDefault(name,LearnDemo::doSomethingOther).apply(2);
  1. 使用策略模式
    场景根据不同的参数走不同的逻辑,这种的一般可以使用策略模式。
    优化前
        if(name.equals("NORMAL")){result = doSomething(status);}else if(name.equals("VIP")){result = doSomething(status);}else if(name.equals("DEFAULT")){result = doSomething(status);}

优化后:

result = Strategy.valueOf(name).doSomething(status);
//使用枚举,这里也可以使用多态
public enum Strategy {NORMAL {@OverrideString doSomething(Integer object) {return "NORMAL";}},VIP {@OverrideString doSomething(Integer object) {return "VIP";}},DEFAULT {@OverrideString doSomething(Integer object) {return "DEFAULT";}},;abstract String doSomething(Integer object);}
  1. 使用ObjectUtils.defaultIfNull Optional Lambda
    优化前
        List<Friend> userFriendList = userFriendMap.get(userId);if(!CollectionUtils.isEmpty(userFriendList)){userFriendList.stream().forEach(friend -> {if(friend.getUserId().equals(friendId)){user.setFriend(true);return;}});}

优化后

        List<Friend> userFriendList = ObjectUtils.defaultIfNull(userFriendMap.get(userId),new ArrayList<>());boolean isFriend = userFriendList.stream().anyMatch(friend -> friend.getUserId().equals(friendId));

总结
if-else过多可以使用以下方法优化

  1. 使用卫语句,提前return。减少不必要的嵌套判断。
  2. 采用表驱动,映射关系,减少判断。
  3. 采用设计模式,比如策略模式,责任链模式。
  4. 合理使用ObjectUtils.defaultIfNull ,Optional ,Lambda,Assert减少If判断

这篇关于如何解决 if-else 过多的问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/970583

相关文章

IDEA和GIT关于文件中LF和CRLF问题及解决

《IDEA和GIT关于文件中LF和CRLF问题及解决》文章总结:因IDEA默认使用CRLF换行符导致Shell脚本在Linux运行报错,需在编辑器和Git中统一为LF,通过调整Git的core.aut... 目录问题描述问题思考解决过程总结问题描述项目软件安装shell脚本上git仓库管理,但拉取后,上l

解决docker目录内存不足扩容处理方案

《解决docker目录内存不足扩容处理方案》文章介绍了Docker存储目录迁移方法:因系统盘空间不足,需将Docker数据迁移到更大磁盘(如/home/docker),通过修改daemon.json配... 目录1、查看服务器所有磁盘的使用情况2、查看docker镜像和容器存储目录的空间大小3、停止dock

idea npm install很慢问题及解决(nodejs)

《ideanpminstall很慢问题及解决(nodejs)》npm安装速度慢可通过配置国内镜像源(如淘宝)、清理缓存及切换工具解决,建议设置全局镜像(npmconfigsetregistryht... 目录idea npm install很慢(nodejs)配置国内镜像源清理缓存总结idea npm in

pycharm跑python项目易出错的问题总结

《pycharm跑python项目易出错的问题总结》:本文主要介绍pycharm跑python项目易出错问题的相关资料,当你在PyCharm中运行Python程序时遇到报错,可以按照以下步骤进行排... 1. 一定不要在pycharm终端里面创建环境安装别人的项目子模块等,有可能出现的问题就是你不报错都安装

idea突然报错Malformed \uxxxx encoding问题及解决

《idea突然报错Malformeduxxxxencoding问题及解决》Maven项目在切换Git分支时报错,提示project元素为描述符根元素,解决方法:删除Maven仓库中的resolv... 目www.chinasem.cn录问题解决方式总结问题idea 上的 maven China编程项目突然报错,是

在Ubuntu上打不开GitHub的完整解决方法

《在Ubuntu上打不开GitHub的完整解决方法》当你满心欢喜打开Ubuntu准备推送代码时,突然发现终端里的gitpush卡成狗,浏览器里的GitHub页面直接变成Whoathere!警告页面... 目录一、那些年我们遇到的"红色惊叹号"二、三大症状快速诊断症状1:浏览器直接无法访问症状2:终端操作异常

mybatis直接执行完整sql及踩坑解决

《mybatis直接执行完整sql及踩坑解决》MyBatis可通过select标签执行动态SQL,DQL用ListLinkedHashMap接收结果,DML用int处理,注意防御SQL注入,优先使用#... 目录myBATiFBNZQs直接执行完整sql及踩坑select语句采用count、insert、u

Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题

《Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题》在爬虫工程里,“HTTPS”是绕不开的话题,HTTPS为传输加密提供保护,同时也给爬虫带来证书校验、... 目录一、核心问题与优先级检查(先问三件事)二、基础示例:requests 与证书处理三、高并发选型:

前端导出Excel文件出现乱码或文件损坏问题的解决办法

《前端导出Excel文件出现乱码或文件损坏问题的解决办法》在现代网页应用程序中,前端有时需要与后端进行数据交互,包括下载文件,:本文主要介绍前端导出Excel文件出现乱码或文件损坏问题的解决办法,... 目录1. 检查后端返回的数据格式2. 前端正确处理二进制数据方案 1:直接下载(推荐)方案 2:手动构造

MyBatis Plus大数据量查询慢原因分析及解决

《MyBatisPlus大数据量查询慢原因分析及解决》大数据量查询慢常因全表扫描、分页不当、索引缺失、内存占用高及ORM开销,优化措施包括分页查询、流式读取、SQL优化、批处理、多数据源、结果集二次... 目录大数据量查询慢的常见原因优化方案高级方案配置调优监控与诊断总结大数据量查询慢的常见原因MyBAT