当前位置: 首页 > article >正文

重构之去除多余的if-else

一、提前返回(Guard Clauses)

适用场景:当 else 块仅用于处理异常或边界条件时。

  • 优化前:
    if (isValid) {doSomething();
    } else {return;
    }
    
  • 优化后:
    if (!isValid) return;  // 提前处理异常,主流程保持简洁
    doSomething();
    
  • 优势:减少嵌套层级,逻辑更线性化。

二、使用枚举(Enum)

适用场景:多分支状态映射(如状态码、配置值)。

  • 示例:
    // 优化前
    if ("1".equals(status)) { ... } else if ("2".equals(status)) { ... }
    // 优化后
    public enum StatusEnum {UN PAID("1", "未支付"), PAID("2", "已支付");// 通过枚举直接获取值
    }
    String desc = StatusEnum.of(status).getDesc();
    
  • 优势:集中管理状态,避免冗余判断。

三、Map/字典驱动

适用场景:根据键值对执行不同操作。

  • 示例:
    // 优化前
    if (type == 1) { action1(); } else if (type == 2) { action2(); }
    // 优化后
    Map actions = new HashMap<>();
    actions.put(1, () -> action1());
    actions.getOrDefault(type, () -> defaultAction()).run();
    
  • 优势:动态扩展分支,无需修改原有逻辑。

四、三元运算符(Ternary Operator)

适用场景:简单的二元条件赋值。

  • 示例:
    // 优化前
    int score = 85;
    if (score > 60) {result = "Pass";
    } else {result = "Fail";
    }
    // 优化后
    String result = score > 60 ? "Pass" : "Fail";
    
  • 注意:避免嵌套使用,保持可读性。

五、Optional 处理空值

适用场景:非空判断与默认值处理。

  • 示例:
    // 优化前
    if (order != null) {return order.getId();
    } else {return -1;
    }
    // 优化后
    return Optional.ofNullable(order).map(Order::getId).orElse(-1);
    
  • 优势:链式调用,避免空指针异常。

六、策略模式(Strategy Pattern)

适用场景:多分支逻辑需独立扩展。

  • 示例:
    interface PaymentStrategy {void pay();
    }
    class AlipayStrategy implements PaymentStrategy { ... }
    class WechatPayStrategy implements PaymentStrategy { ... }
    // 使用策略工厂动态选择
    PaymentStrategy strategy = StrategyFactory.create(type);
    strategy.pay();
    
  • 优势:符合开闭原则,新增逻辑无需修改原有代码。

七、表驱动法(Table-Driven Methods)

适用场景:基于配置表的条件映射。

  • 示例:
    // 将条件与操作存入 Map 或数据库
    Map discounts = new HashMap<>();
    discounts.put("SUMMER2023", 0.8);
    discounts.put("BLACKFRIDAY", 0.5);
    double rate = discounts.getOrDefault(code, 1.0);
    
  • 优势:动态配置,降低代码耦合度。

八、正则表达式替代多重判断

适用场景:字符串匹配规则复杂。

  • 示例:
    # 优化前
    if len(password) < 8: return False
    if not any(char.isdigit() for char in password): return False
    # 优化后
    import re
    pattern = r'^.*[0-9].*[A-Za-z].*$'
    return bool(re.match(pattern, password))
    
  • 优势:集中管理匹配规则,减少冗余代码。

九、责任链模式(Chain of Responsibility)

适用场景:多层级处理请求。

  • 示例:
    abstract class Handler {private Handler next;public void setNext(Handler next) { ... }public abstract void handleRequest();
    }
    // 各处理器依次处理请求
    Handler h1 = new Handler1();
    Handler h2 = new Handler2();
    h1.setNext(h2);
    h1.handleRequest();
    
  • 优势:解耦处理逻辑,支持动态添加步骤。

十、合并条件表达式

适用场景:多个条件返回相同结果。

  • 示例:
    // 优化前
    if (city.equals("北京")) return "首都";
    if (city.equals("上海")) return "经济中心";
    // 优化后
    if ("北京".equals(city) || "上海".equals(city)) {return "一线城市";
    }
    
  • 优势:减少重复判断,提升可读性。

注意事项

  1. 避免过度优化:若逻辑简单,保留 if-else 可能更清晰。
  2. 结合设计模式:策略模式、状态模式等适用于复杂业务场景。
  3. 文档与注释:优化后需补充注释,确保团队协作。
    通过上述方法,可显著降低代码复杂度,提升可维护性。具体选择需根据场景权衡,核心原则是 “让代码更易读,而非追求形式上的简洁”。

相关文章:

重构之去除多余的if-else

一、提前返回&#xff08;Guard Clauses&#xff09; 适用场景&#xff1a;当 else 块仅用于处理异常或边界条件时。 优化前&#xff1a;if (isValid) {doSomething(); } else {return; }优化后&#xff1a;if (!isValid) return; // 提前处理异常&#xff0c;主流程保持简洁…...

安装部署RabbitMQ

一、RabbitMQ安装部署 1、下载epel源 2、安装RabbitMQ 3、启动RabbitMQ web管理界面 启用插件 rabbitmq数据目录 创建rabbitmq用户 设置为管理员角色 给用户赋予权限 4、访问rabbitmq...

Qt实现文件传输客户端(图文详解+代码详细注释)

Qt实现文件传输客户端 1、 客户端UI界面设计2、客户端2.1 添加网络模块和头文件2.2 创建Tcp对象2.3 连接按钮2.3.1 连接按钮连接信号与槽2.3.2 连接按钮实现 2.4 读取文件2.4.1 连接读取文件的信号与槽2.4.2 读取文件槽函数实现2.5 进度条2.5.1 设置进度条初始值2.5.2 初始化进…...

机器学习期末

选择题 以下哪项不是机器学习的类型&#xff1f; A. 监督学习 B.无监督学习 C.半监督学习 D.全监督学习 D 哪一个是机器学习的合理定义? A、机器学习是计算机编程的科学 B、机器学习从标记的数据中学习 C、机器学习是允许机器人智能行动的领域 D、机器学习能使计算机能够在…...

在 Linux 上部署 .NET Core 应用并配置为开机自动启动

在本文中&#xff0c;我们将详细介绍如何在 Linux 系统上部署 .NET Core 应用程序&#xff0c;并配置为开机自动启动。以下是一步一步的详细部署过程&#xff0c;适用于将 .NET Core Web 应用部署到生产环境中。 1. 安装 .NET 运行时和 SDK 首先&#xff0c;确保 Linux 系统上…...

Python多任务编程:进程全面详解与实战指南

1. 进程基础概念 1.1 什么是进程&#xff1f; 进程(Process)是指正在执行的程序&#xff0c;是程序执行过程中的一次指令、数据集等的集合。简单来说&#xff0c;进程就是程序的一次执行过程&#xff0c;它是一个动态的概念。 想象你打开电脑上的音乐播放器听歌&#xff0c;…...

【QT】 QT中的列表框-横向列表框-树状列表框-表格列表框

QT中的列表框-横向列表框-树状列表框-表格列表框 1.横向列表框(1)主要方法(2)信号(3) 示例代码1:(4) 现象&#xff1a;(5) 示例代码2&#xff1a;加载目录项在横向列表框显示(6) 现象&#xff1a; 2.树状列表框 QTreeWidget(1)使用思路(2)信号(3)常用的接口函数(4) 示例代码&am…...

决策树:ID3,C4.5,CART树总结

树模型总结 决策树部分重点关注分叉的指标&#xff0c;多叉还是单叉&#xff0c;处理离散还是连续值&#xff0c;剪枝方法&#xff0c;以及回归还是分类 一、决策树 ID3(Iterative Dichotomiser 3) 、C4.5、CART决策树 ID3:确定分类规则判别指标、寻找能够最快速降低信息熵的方…...

easyexcel使用模板填充excel坑点总结

1.单层map设置值是{属性}&#xff0c;那使用两层map进行设置值&#xff0c;是不是可以使用{属性.属性}&#xff0c;以为取出map里字段只用{属性}就可以设置值&#xff0c;那再加个.就可以从里边map取出对应属性&#xff0c;没有两层map写法 填充得到的文件打开报错 was empty (…...

量子计算与经典计算融合:开启计算新时代

一、引言 随着科技的飞速发展&#xff0c;计算技术正迎来一场前所未有的变革。量子计算作为前沿技术&#xff0c;以其强大的并行计算能力和对复杂问题的高效处理能力&#xff0c;吸引了全球科技界的关注。然而&#xff0c;量子计算并非要完全取代经典计算&#xff0c;而是与经典…...

C# LINQ基础知识

简介 LINQ(Language Integrated Query)&#xff0c;语言集成查询&#xff0c;是一系列直接将查询功能集成到 C# 语言的技术统称。使用LINQ表达式可以对数据集合进行过滤、排序、分组、聚合、串联等操作。 例子&#xff1a; public class Person {public int Id;public string…...

GCoNet+:更强大的团队协作 Co-Salient 目标检测器 2023 GCoNet+(翻译)

摘要 摘要&#xff1a;本文提出了一种新颖的端到端群体协作学习网络&#xff0c;名为GCoNet&#xff0c;它能够高效&#xff08;每秒250帧&#xff09;且有效地识别自然场景中的共同显著目标。所提出的GCoNet通过基于以下两个关键准则挖掘一致性表示&#xff0c;实现了共同显著…...

QT常见输入类控件及其属性

Line Edit QLineEdit用来表示单行输入框&#xff0c;可以输入一段文本&#xff0c;但是不能换行 核心属性&#xff1a; 核心信号 信号 说明 void cursorPositionChanged(int old,int new) 当鼠标移动时发出此型号&#xff0c;old为先前位置&#xff0c;new为新位置 void …...

Few-shot medical image segmentation with high-fidelity prototypes 论文总结

题目&#xff1a;Few-shot medical image segmentation with high-fidelity prototypes&#xff08;高精确原型&#xff09; 论文&#xff1a;Few-shot medical image segmentation with high-fidelity prototypes - ScienceDirect 源码&#xff1a;https://github.com/tntek/D…...

DBA工作常见问题整理

MVCC机制: PostgreSQL的多版本并发控制(MVCC)是其核心特性之一&#xff0c;它允许数据库在高并发环境下保持高性能的同时提供事务隔离。 MVCC通过维护数据的多个版本实现&#xff1a; 读操作不阻塞写操作写操作不阻塞读操作避免使用锁实现并发控制 PostgreSQL的MVCC特点 写时…...

深入理解Java包装类:自动装箱拆箱与缓存池机制

深入理解Java包装类&#xff1a;自动装箱拆箱与缓存池机制 对象包装器 Java中的数据类型可以分为两类&#xff1a;基本类型和引用类型。作为一门面向对象编程语言&#xff0c; 一切皆对象是Java语言的设计理念之一。但基本类型不是对象&#xff0c;无法直接参与面向对象操作&…...

如何使用Node-RED采集西门子PLC数据通过MQTT协议实现数据交互并WEB组态显示

需求概述 本章节主要实现一个流程&#xff1a;使用纵横智控的EG网关通过Node-red&#xff08;可视化编程&#xff09;采集PLC数据&#xff0c;并通过MQTT协议和VISION&#xff08;WEB组态&#xff09;实现数据交互。 以采集西门子PLC为例&#xff0c;要采集的PLC的IP、端口和点…...

【cocos creator 3.x】速通3d模型导入, 模型创建,阴影,材质使用,模型贴图绑定

1、右键创建平面&#xff0c;立方体 2、点击场景根节点&#xff0c;shadows勾选enabled3、点击灯光&#xff0c;shadow enabled勾选 4、点击模型&#xff0c;勾选接收阴影&#xff0c;投射阴影&#xff08;按照需要勾选&#xff09; 5、材质创建 6、选中节点&#xff0c;找…...

批量创建OpenStack实例

在Linux终端实现批量创建OpenStack实例&#xff0c;支持支持统计、并发创建、安全确认、重试机制、日志。 #!/bin/bash # # 增强版OpenStack实例创建脚本&#xff08;修复日志功能&#xff09; # 功能&#xff1a;支持统计、并发创建、安全确认、重试机制 # 更新日期&#xf…...

常用的 ​​SQL 语句分类整理​​

以下是常用的 ​​SQL 语句分类整理​​&#xff0c;覆盖数据查询、操作、表管理和高级功能&#xff0c;适用于大多数关系型数据库&#xff08;如 MySQL、PostgreSQL、SQL Server&#xff09;&#xff1a; 目录 ​​一、数据查询&#xff08;DQL&#xff09;​​ ​​1. 基础查…...

驱动开发硬核特训 · Day 15:电源管理核心知识与实战解析

在嵌入式系统中&#xff0c;电源管理&#xff08;Power Management&#xff09;并不是“可选项”&#xff0c;而是实际部署中影响系统稳定性、功耗、安全性的重要一环。今天我们将以 Linux 电源管理框架 为基础&#xff0c;从理论结构、内核架构&#xff0c;再到典型驱动实战&a…...

【零基础】基于DeepSeek-R1与Qwen2.5Max的行业洞察自动化平台

自动生成行业报告,通过调用两个不同的大模型(DeepSeek 和 Qwen),完成从行业趋势分析到结构化报告生成的全过程。 完整代码:https://mp.weixin.qq.com/s/6pHi_aIDBcJKw1U61n1uUg 🧠 1. 整体目的与功能 该脚本实现了一个名为 ReportGenerator 的类,用于: 调用 DeepSe…...

Web前端 (CSS篇)

什么是CSS&#xff1f; css(Cascading Style Sheets)是层叠样式表或级联样式表&#xff0c;是一组设置规则&#xff0c;用于控制web页面外观。 为什么使用CSS? CSS 用于定义网页的样式&#xff0c;包括针对不同设备和屏幕尺寸的设计和布局。 CSS 实例 body {background-col…...

C 语言联合与枚举:自定义类型的核心解析

目录 1.联合体 1.1联合体的声明与创建 1.2联合体在内存中的存储 1.3相同成员的结构体与内存比较 1.4联合体内存空间大小的计算 1.5联合体的应用 2.枚举类型 2.1枚举变量的声明 2.2枚举变量的优点 2.3枚举的使用 上篇博客中&#xff0c;我们通过学习了解了C语言中一种自…...

基于Canal+Spring Boot+Kafka的MySQL数据变更实时监听实战指南

前期知识背景 binlog 什么是binlog 它记录了所有的DDL和DML(除 了数据查询语句)语句&#xff0c;以事件形式记录&#xff0c;还包含语句所执行的消耗的时间&#xff0c;MySQL 的二进制日志是事务安全型的。一般来说开启二进制日志大概会有1%的性能损耗。 binlog分类 MySQL Bi…...

MySQL运维三部曲初级篇:从零开始打造稳定高效的数据库环境

文章目录 一、服务器选型——给数据库一个舒适的家二、系统调优——打造高性能跑道三、MySQL配置——让数据库火力全开四、监控体系——数据库的体检中心五、备份恢复——数据安全的最后防线六、主从复制——数据同步的艺术七、安全加固——守护数据长城 引言&#xff1a;从小白…...

golang context源码

解析 context结构 Deadline&#xff1a;返回 context 的过期时间&#xff1b; Done&#xff1a;返回 context 中的 channel&#xff1b; Err&#xff1a;返回错误&#xff1b; Value&#xff1a;返回 context 中的对应 key 的值. type Context interface {Deadline() (deadl…...

【MySQL】MySQL的基础语法及其语句的介绍

1、基础语法 mysql -h【主机名】 -u【用户名】 -p //登录MySQL exit或quit; //退出MySQL show database; //查看MySQL下的所有数据库 use 【数据库名】; //进入数据库 show tables; //查看数据库下的所有表名 *MySQL的启动和关闭 &am…...

大模型应用开发自学笔记

理论学习地址&#xff1a; https://zh.d2l.ai/chapter_linear-networks/index.html autodl学术加速&#xff1a; source /etc/network_turboconda常见操作: 删除&#xff1a; conda remove --name myenv --all -y导出&#xff1a; conda env export > environment.yml…...

Spring能够有效地解决单例Bean之间的循环依赖问题

在Spring框架中&#xff0c;earlySingletonObjects和singletonObjects是两个与Bean实例化过程密切相关的概念&#xff0c;它们都存储在DefaultSingletonBeanRegistry类中。这两个概念主要用于Spring的依赖注入机制&#xff0c;特别是针对单例Bean的创建过程。 singletonObject…...