优化if-else的11种方案

优雅永不过时!

image-20240805201630837

1. 使用早返回(Early Return):尽可能早地返回,避免嵌套的if-else。

优化前:

public class NoEarlyReturnExample {public boolean hasPositiveNumber(int[] numbers) {boolean foundPositive = false;for (int number : numbers) {if (number > 0) {foundPositive = true;// 没有早返回,而是继续循环}}return foundPositive; // 循环结束后返回结果}
}

优化后:

public class EarlyReturnExample {public boolean hasPositiveNumber(int[] numbers) {for (int number : numbers) {if (number > 0) {return true; // 找到正数立即返回}}return false; // 没有找到正数}
}

减少了多次循环

2. 使用三元运算符:在条件简单的情况下,可以使用三元运算符来简化代码。

优化前:

public class NoTernaryOperatorExample {public String getGender(int number) {if (number > 0) {return "girl";} else if (number < 0) {return "boy";} else {return "other";}}
}

优化后:

public class TernaryOperatorExample {public String getGender(int number) {return (number > 0) ? "girl" : (number < 0) ? "boy" : "other";}
}

3. 使用switch-case语句:如果你的条件是基于不同的情况或值,更好的选择是switch-case。

优化前:

public class NoSwitchCaseExample {public void performAction(String action) {if ("start".equals(action)) {System.out.println("Starting...");} else if ("stop".equals(action)) {System.out.println("Stopping...");} else {System.out.println("Unknown action");}}
}

优化后:

public class SwitchCaseExample {public void performAction(String action) {switch (action) {case "start":System.out.println("Starting...");break;case "stop":System.out.println("Stopping...");break;default:System.out.println("Unknown action");}}
}

4. 使用策略模式:将每个条件分支封装成一个策略对象,然后根据条件选择使用哪个策略。

优化前:

public class NoStrategyExample {public void context() {// 没有使用策略模式,而是直接执行代码System.out.println("Direct execution");// do something...}
}

优化后:

public class StrategyExample {interface Strategy {void execute();}public class ConcreteStrategyA implements Strategy {public void execute() {System.out.println("Strategy A executed");}}public void context(Strategy strategy) {strategy.execute();}
}

5. 使用查找表:对于固定数量的条件分支,可以使用查找表(例如字典或哈希表)来映射条件和对应的行为。

优化前:

public class NoLookupTableExample {public void performAction(String action) {// 没有使用查找表,而是使用if-elseif ("start".equals(action)) {System.out.println("Starting...");} else if ("stop".equals(action)) {System.out.println("Stopping...");} else {System.out.println("No action found");}}
}

优化后:

public class LookupTableExample {public void performAction(Map<String, Runnable> actions, String key) {actions.getOrDefault(key, () -> System.out.println("No action found")).run();}
}

6. 使用函数或方法:将每个条件分支的逻辑封装到不同的函数或方法中,然后在if-else中调用这些函数。

优化前:

public class NoFunctionExample {public void handleUserType(String userType) {// 没有使用函数封装,而是直接在if-else中编写逻辑if ("admin".equals(userType)) {System.out.println("Admin logic here");} else if ("user".equals(userType)) {System.out.println("User logic here");} else {System.out.println("Guest logic here");}}
}

优化后:

public class FunctionExample {public void handleUserType(String userType) {if ("admin".equals(userType)) {handleAdmin();} else if ("user".equals(userType)) {handleUser();} else {handleGuest();}}private void handleAdmin() {System.out.println("Handling admin");}private void handleUser() {System.out.println("Handling user");}private void handleGuest() {System.out.println("Handling guest");}
}

这个是大家比较常用的,通过不同的功能拆分成不同的函数。

7. 使用命令模式:将每个条件分支封装成一个命令对象,然后根据条件执行相应的命令。

优化前:

public class NoCommandExample {public void performAction(String action) {// 直接执行动作,没有使用命令模式if ("start".equals(action)) {System.out.println("Starting...");} else if ("stop".equals(action)) {System.out.println("Stopping...");}}
}

优化后:

public class CommandExample {interface Command {void execute();}public class StartCommand implements Command {public void execute() {System.out.println("Starting...");}}public class StopCommand implements Command {public void execute() {System.out.println("Stopping...");}}public void executeCommand(Command command) {command.execute();}
}

8. 使用状态模式:如果逻辑分支与状态有关,可以使用状态模式来管理状态转换。

优化前:

public class NoStateExample {public void handleAction(String state) {// 没有使用状态模式,直接在代码中处理逻辑if ("start".equals(state)) {System.out.println("Handling start");} else if ("stop".equals(state)) {System.out.println("Handling stop");}}
}

优化后:

public class StateExample {interface State {void handle();}public class StartState implements State {public void handle() {System.out.println("Handling start state");}}public class StopState implements State {public void handle() {System.out.println("Handling stop state");}}public class Context {private State state;public void setState(State state) {this.state = state;}public void request() {state.handle();}}
}

状态转换类似于我们在做一个简单的工单流转,每一步都是确定且可复用的场景。

9. 重构条件表达式:检查是否可以将复杂的条件表达式分解为更简单的部分。

优化前:

public class UnrefactoredConditionExample {public boolean isWeekend(int day) {// 没有重构的条件表达式,切套多、不好阅读if (day == 6 || (day == 7 && !isHoliday(day))) {return true;}return false;}private boolean isHoliday(int day) {// 法定的假日检查逻辑(法定节假日每年都在变)return false;}
}

优化后:

public class RefactoredConditionExample {public boolean isWeekend(int day) {return day == 6 || day == 7;}
}

简洁了很多

10. 使用断言:在某些情况下,使用断言来确保代码的预设条件被满足,避免复杂的条件判断。

优化前:

public class NoAssertExample {public void process(int value) {if (value <= 0) {throw new IllegalArgumentException("Value must be positive");}// 处理逻辑System.out.println("Processing value: " + value);}
}

优化后:

public class AssertExample {public void process(int value) {assert value > 0 : "Value must be positive";// 处理逻辑System.out.println("Processing value: " + value);}
}

多数编程中,断言被用在自动化测试用例。不过预设条件判断用起来也非常丝滑。

11. 使用异常处理:在某些情况下,使用异常处理来简化错误条件的处理。

优化前:

public class NoExceptionHandlingExample {public int divide(int dividend, int divisor) {if (divisor == 0) {// 没有使用异常处理,而是直接返回错误代码System.out.println("Cannot divide by zero");return -1;}return dividend / divisor;}
}

优化后:

public class ExceptionHandlingExample {public int divide(int dividend, int divisor) {try {return dividend / divisor;} catch (ArithmeticException e) {System.out.println("Cannot divide by zero");return -1;}}
}

当遇到异常,尽可能在合适的地方捕获并处理,不要直接把所有异常都抛到最外层。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/392209.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习大数据DAY31 Python基础语法4和基于Python中的MySQL 编程

目录 Python 库 模块 time&datetime 库 连接 MySQL 操作 结构操作 数据增删改操作 数据查询操作 上机练习 7 面向对象 OOP 封装 继承 三层架构---面向对象思想模型层 数据层 业务逻辑显示层 上机练习 8 三层架构开发豆瓣网 关于我对 AI 写代码的看法&#xf…

客户数据分析模型:RFM模型的深度解析与应用探索

RFM模型&#xff0c;作为客户数据分析中的经典工具&#xff0c;凭借其简单而强大的分析能力&#xff0c;被广泛应用于各行各业。本文旨在深入探讨RFM模型的核心原理、应用价值&#xff0c;并详细阐述其在2C&#xff08;面向消费者&#xff09;和2B&#xff08;面向企业&#xf…

使用ThreadLocal来存取单线程内的数据

一.什么是ThreadLocal&#xff1f; ThreadLocal&#xff0c;即线程本地变量。如果你创建了一个 ThreadLocal变量&#xff0c;那么访问这个变量的每个线程都会有这个变量的一个本地拷贝&#xff0c;多个线程操作这个变量的时候&#xff0c;实际是在操作自己本地内存里面的变量&…

自注意力和位置编码

一、自注意力 1、给定一个由词元组成的输入序列x1,…,xn&#xff0c; 其中任意xi∈R^d&#xff08;1≤i≤n&#xff09;。 该序列的自注意力输出为一个长度相同的序列 y1,…,yn&#xff0c;其中&#xff1a; 2、自注意力池化层将xi当作key&#xff0c;value&#xff0c;query来…

Ubuntu配置carla docker环境

前言: 本文只在以下设备成功运行, 其他设备不保证能成功, 可以参考在自己设备进行配置 环境 ubuntu 20.04carla 0.9.15gpu 3060(notebook) 安装显卡驱动&nvidia-container-toolkit 显卡驱动 安装完成系统后直接在’软件和更新->附加驱动’直接选择470(proprietary…

Leetcode3227. 字符串元音游戏

Every day a Leetcode 题目来源&#xff1a;3227. 字符串元音游戏 解法1&#xff1a;博弈论 分类讨论&#xff1a; 如果 s 不包含任何元音&#xff0c;小红输。如果 s 包含奇数个元音&#xff0c;小红可以直接把整个 s 移除&#xff0c;小红赢。如果 s 包含正偶数个元音&am…

R 语言学习教程,从入门到精通,R 基础运算(5)

1、R 基础运算 本章介绍 R 语言的简单运算。 1.1、赋值 一般语言的赋值是 号&#xff0c;但是 R 语言是数学语言&#xff0c;所以赋值符号与我们数学书上的伪代码很相似&#xff0c;是一个左箭头 <- &#xff1a; a <- 123 b <- 456 print(a b)以上代码执行结果…

最好用的掏耳勺是哪种?年度五款可视挖耳勺高分机型

在我们的日常生活中&#xff0c;掏耳朵似乎是一件再平常不过的小事&#xff0c;不过&#xff0c;传统挖耳勺在使用时完全依赖我们的感觉和经验&#xff0c;我们无法直接看到耳道内部的情况。这就如同在黑暗中摸索&#xff0c;极易造成意外伤害。稍有不慎&#xff0c;就可能刮伤…

使用gitea私有仓库作为依赖

实际问题 由于公司团队使用gitea搭建了git私有仓库&#xff0c;在开发Go程序的时候会有一些公共代码&#xff0c;比如插件和主程序之间要共享接口和数据结构&#xff0c;所以就需要在gitea私有仓库中创建依赖仓库&#xff0c;然后其他仓库引用这个私有仓库作为依赖。 解决方案…

如何实现pxe安装部署

此实验环境&#xff1a;rhel7主机 一、kickstart自动化安装脚本 1、安装可视化图形 [rootlocalhost ~]# yum group install "Server with GUI" 2、关闭vmware dhcp功能&#xff08;编辑-虚拟网络编辑器&#xff09; 3、httpd 1、安装httpd服务 [rootlocalhost …

网鼎杯比赛二次注入技巧

文章目录 前端的网页展示分析题目暴力破解寻找代码找到注入点进行注入查询想要的文件 前端的网页展示 分析题目 1.目前我们能看到的只有三个页面&#xff0c;但是我们可以看到三个*号。 2.考虑三个*的密码是什么&#xff0c;这里可以采用暴力破解&#xff08;我们先猜这是三个…

会声会影下载免费吗?会声会影2023中文旗舰版下载及配置最低要求

**会声会影2024&#xff1a;引领视频创作新时代的创新之旅** 在数字时代的浪潮中&#xff0c;视频创作已成为连接世界、表达创意的重要方式。随着技术的不断进步&#xff0c;一款名为“会声会影2024”的视频编辑软件横空出世&#xff0c;它不仅继承了前代产品的优秀传统&#…

C#MQTT协议应用

1 &#xff0c;MQTT介绍&#xff1a;MQTT详解以及实际操作_mqtt使用-CSDN博客 2&#xff0c;MQTT应用&#xff1a; C#MQTT编程06--MQTT服务器和客户端(winform版)_c# mqtt服务器-CSDN博客 3&#xff0c;MQTT实例&#xff1a; 效果 代码&#xff1a; 服务端 public parti…

通过Stack Overflow线程栈溢出的问题实例,详解C++程序线程栈溢出的诸多细节

目录 1、问题说明 2、从Visual Studio输出窗口中找到了线索,发生了Stack Overflow线程栈溢出的异常 3、发生Stack Overflow线程栈溢出的原因分析 4、线程占用的栈空间大小说明 5、引发线程栈溢出的常见原因和场景总结 6、在问题函数入口处添加return语句,在Debug下运行…

TI音频功放TAS6511(二)

3.数字音频处理 芯片支持高级数字音频处理能力&#xff0c;包括&#xff1a; 高通滤波器/直流阻断 数字音量控制 PVDD的Foldback/AGL 热Foldback 双象限增益补偿 混合调制 实时负载诊断 低延迟路径 喇叭功率限制 1&#xff09;PVDD Foldback 本功能主要为了防止音频…

【Material-UI】Autocomplete中的禁用选项:Disabled options

文章目录 一、简介二、基本用法三、进阶用法1. 动态禁用2. 提示禁用原因3. 复杂的禁用条件 四、最佳实践1. 一致性2. 提供反馈3. 优化性能 五、总结 Material-UI的Autocomplete组件提供了丰富的功能&#xff0c;包括禁用特定选项的能力。这一特性对于限制用户选择、提供更好的用…

【你也能从零基础学会网站开发】SQL Server 2000中的数据类型之String字符串类型

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;程序猿、设计师、技术分享 &#x1f40b; 希望大家多多支持, 我们一起学习和进步&#xff01; &#x1f3c5; 欢迎评论 ❤️点赞&#x1f4ac;评论 &#x1f4c2;收藏 &#x1f4c2;加关注 SQL Server 中…

不用PS也能抠图?点哪抠哪,简直是职场人的最强助手

抠图你还在用 PS 一点点抠吗&#xff1f; 不仅费时费力&#xff0c;还常常达不到理想效果&#xff0c;真的太让人崩溃了 但别担心&#xff0c;我找到了一个超棒的工具——千鹿设计助手的AI智能抠图插件。它就像你的私人设计小助手&#xff0c;能快速帮你把想要的元素抠出来&…

《花100块做个摸鱼小网站! · 序》灵感来源

序 大家好呀&#xff0c;我是summo&#xff0c;这次来写写我在上班空闲(摸鱼)的时候做的一个小网站的事。去年阿里云不是推出了个活动嘛&#xff0c;2核2G的云服务器一年只要99块钱&#xff0c;懂行的人应该知道这个价格在业界已经是非常良心了&#xff0c;虽然优惠只有一年&a…

C++初阶学习——探索STL奥秘——模拟实现string类

1、string类的构造 上面的代码从表面看没什么问题&#xff0c;但是运行后会发现程序有多处bug 但是如上图一样&#xff0c;这样改进依然有bug 因为我们编写无参构造函数的时候&#xff0c;肯定要让_str默认为nullptr&#xff0c;但是这样的话&#xff0c;在main函数中创建对象…