首页 > 其他分享 >项目中有 10000 个 if else 如何优化?

项目中有 10000 个 if else 如何优化?

时间:2024-09-12 21:51:55浏览次数:14  
标签:方案 return String else 10000 null 优化 desc

本文我总结10 种优化 if else 的方法,当然根据不同的场景还可以使用多态、责任链模式、模板方法模式等更多方法来消除 if else。

方案1:策略模式

  • 如果有 1 万个 if else 分支,那就会有 1 万个策略类,此时就会造成类膨胀,并且随着时间的推移逐渐变得更加庞大而复杂
  • 如果是多层的 if else 嵌套,策略模式可能也无法派上用场了。

方案2:策略模式变体

Map<Integer, Runnable> actionMap = new HashMap<>();
actionMap.put("condition1", () -> { /* 分支1的执行逻辑 */ });
actionMap.put("condition2", () -> { /* 分支2的执行逻辑 */ });
actionMap.put("conditionN", () -> { /* 分支N的执行逻辑 */ });

// 根据条件获取执行逻辑
Runnable action = actionMap.get("condition1");
if (action != null) {
    action.run();
}

这种把业务逻辑代码分离出去了,简化了单个类的代码,也省去了策略实现类,可是如果有大量的条件映射,依然会造成单个类的膨胀和难以维护。

方案3:多级嵌套优化

上面说的两种方案嵌套可能无法解决,如果是这种带层级的判断是可以优化的,这个你觉得怎么优化?

if(xxxOrder != null){
 if(xxxOrder.getXxxShippingInfo() != null){
  if(xxxOrder.getXxxShippingInfo().getXxxShipmentDetails() != null){
   if(xxxOrder.getXxxShippingInfo().getXxxShipmentDetails().getXxxTrackingInfo() != null){
    ...
   }
  }
 }
}

方案4:使用三目运算符

如果判断条件不多,只有 2、3 个的情况下可以使用三目运算符简化 if else 分支。

String desc;
if (condition1) {
    desc = "XX1";
} else if (condition2) {
    desc = "XX2";
} else {
    desc = "XX3";
}

使用三目运算符一行搞定:

String desc = condition1 ? "XX1" : (condition2 ? "XX2" : "XX3");

超过 3 个条件就不建议使用了。

方案5:使用枚举

枚举类型可以用来表示一组固定的值,例如星期几、月份、颜色等,它提供了一种更简洁、可读性更高的方式来表示一组相关的常量。

public class Test {
    
    public static void main(String[] args) {
        Day today = Day.MONDAY;
        System.out.println("Today is " + today);
        System.out.println("Today is " + today.getChineseName());
    }

    enum Day {
        MONDAY("星期一"),
        TUESDAY("星期二"),
        WEDNESDAY("星期三"),
        THURSDAY("星期四"),
        FRIDAY("星期五"),
        SATURDAY("星期六"),
        SUNDAY("星期日");

        private String chineseName;

        Day(String chineseName) {
            this.chineseName = chineseName;
        }

        public String getChineseName() {
            return chineseName;
        }
    }
    
}

这里我只写了一个字段,我们可以在枚举属性里面定义多个字段,这样就无需大量的 if else 判断,直接通过枚举来获取某个某一组固定的值了。

方案6:使用 Optional

Java 8 提供了一个 Optional 新特性,它是一个可以包含 null 值的容器对象,可以用来代替 xx != null 的判断。

方案7:尽快返回

分析业务,根据 if else 的执行次数按降序排,把执行次数较多的 if 放在最前面,如果符合条件,就使用 return 返回,如下面代码:

if (条件1) {
    return
}

if (条件2) {
    return
}

...

这样改可能是比较简单的方式,在很大程度上可以提升系统的性能,但是还存在以下问题:

  • 有的条件不能按执行次数排序,存在先后或者互斥关系。
  • 如果新增一个条件,可能无法马上判定它的执行次数,如果放在后面可能也还会影响性能。
  • 对类的继续膨胀和代码维护没有任何帮助。

方案8:去除没必要的 if else

if (condition) {
    ...
} else {
    return;
}

优化后:

if(!condition){
    return;
}

或者是这样:

return !condition

方案9:合并条件

考虑是不是可以合并归类,比如是不是可以把几百、几千个相似逻辑的归为一类,这样也能大大简化 if else 数量。

比如以下代码:

double calculateShipping() {
    if (orderAmount > 1000) {
        return 0.5;
    }
    if (customerLoyaltyLevel > 5) {
        return 0.5;
    }
    if (promotionIsActive) {
        return 0.5;
    }
}

优化后:

double calculateShipping() {
    if (orderAmount > 1000 || customerLoyaltyLevel > 5 || promotionIsActive) {
        return 0.5;
    }
}

这样就把返回相同值的 if 归为一类了,如果 if 较大就能大大简化代码量。

方案10:规则引擎

对于复杂的业务逻辑,业务规则经常变化,规则制定不依赖于技术团队,需要实现可配置的逻辑处理,此时可以考虑使用规则引擎来处理,比如 Drools。

总之,消除 if else 并没有万能的方法,也不可能全部优化掉,在实际开发中需要根据实际场景使用不同的方法,以及多种方法组合使用,这样才是正确的方式。

最后说一句(求关注!别白嫖!)

如果这篇文章对您有所帮助,或者有所启发的话,求一键三连:点赞、转发、在看。

关注公众号:woniuxgg,在公众号中回复:笔记  就可以获得蜗牛为你精心准备的java实战语雀笔记,回复面试、开发手册、有超赞的粉丝福利!





标签:方案,return,String,else,10000,null,优化,desc
From: https://blog.51cto.com/u_16502039/11993666

相关文章

  • 深度学习实战88-基于注意力机制优化的WGAN-BiLSTM模型应用于信用卡欺诈识别方法
    大家好,我是微学AI,今天给大家介绍一下本文介绍了基于注意力机制优化的WGAN-BiLSTM模型应用于信用卡欺诈识别方法。该文章详细阐述了该模型的架构,包括其独特设计及优势。展示了相关公式以深入理解其原理,同时给出了代码实现过程,便于实际应用。对所用数据集进行了全面介绍,包括其......
  • MySQL学习笔记(四)MySQL慢查询优化
    慢日志查询慢速查询日志由执行时间超过long_query_time几秒并且至少需要min_examined_row_limit检查行的SQL语句组成long_query_timeSELECT@@long_query_time;--默认是10单位sSETGLOBALlong_query_time=1;--设置超过1s就算慢查min_examined_row_limitSEL......
  • solidworks软件许可优化解决方案
    Solidworks软件介绍SolidWorks是达索系统(DassaultSystemes )下的子公司,专门负责研发与销售机械设计软件的视窗产品,公司总部位于美国马萨诸塞州。达索公司是负责系统性的软件供应,并为制造厂商提供具有Internet整合能力的支援服务。该集团提供涵盖整个产品生命周期的系统,包括设计......
  • 探索MySQL视图的无限可能:优化查询、增强数据安全与简化数据访问
     作者简介:我是团团儿,是一名专注于云计算领域的专业创作者,感谢大家的关注 座右铭:   云端筑梦,数据为翼,探索无限可能,引领云计算新纪元 个人主页:团儿.-CSDN博客目录前言:正文:1.视图的定义:2.视图的优点:简单化:安全性:逻辑数据独立性:3.创建单表视图创表:插入数据:创建......
  • FlexibleBI智能SPC系统:提升效率,优化质量控制的利器
    在现代工业中,质量控制是决定产品合格率和企业竞争力的关键环节。为了应对生产流程中的复杂数据管理需求,我们推出了一款集成全面功能的智能SPC(统计过程控制)系统,旨在帮助企业高效地管理、分析和优化生产质量。以下是这款SPC系统的核心特点及优势。FlexibleBI一键生成全面SPC分......
  • 虚幻引擎VR游戏开发04| 毛发性能优化
    节约游戏毛发的GPU占用//Ctrl+shift+,查看gpu占用groom毛发转插片毛发:插件及制作步骤(以下插件非本人所著,付费插件需自行购买)1.groom2abc(UE)(付费:插件购买连接及使用教程)Groom2AbcUE5.4编译版  【metahuman修改groom毛发教程】导出metahumangroom毛发为Abc文件......
  • 苹果研究人员提出了一种新颖的AI算法来优化字节级表示以自动语音识别(ASR),并将其与UTF
    端到端(E2E)神经网络已成为多语言自动语音识别(ASR)的灵活且准确的模型。然而,随着支持的语言数量增加,尤其是像中文、日语、韩语(CJK)这样大字符集的语言,输出层的大小显著增长。这种扩展对计算资源、内存使用和资产大小产生了负面影响。在多语言系统中,这一挑战尤为严重,因为输出通常包......
  • C# List删除元素的性能优化
    背景X上闲逛发现这样一个post简单翻译一下,就是说如果针对无序数组(顺序不重要),要删除其中某个元素,比起费劲的移动很多元素,可以把要删除的元素和最后一个元素交换,然后减小数组的长度即可。然后我看有回复说,他给dotnet提了PR有这样的一个优化githubPR地址:https://github.com/do......
  • Java技术深度探索:高并发场景下的线程安全与性能优化
    Java技术深度探索:高并发场景下的线程安全与性能优化在当今的软件开发领域,随着互联网应用的日益复杂和用户量的激增,高并发成为了一个不可忽视的技术挑战。Java,作为一门广泛应用于企业级开发的编程语言,其内置的并发支持机制如线程(Thread)、锁(Lock)、并发集合(ConcurrentCollect......
  • 【mysql】mysql之优化
     本站以分享各种运维经验和运维所需要的技能为主《python零基础入门》:python零基础入门学习《python运维脚本》: python运维脚本实践《shell》:shell学习《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战《k8》从问题中去学习k8s《docker学习》暂未更新......