首页 > 其他分享 >优化if-else代码的八种方案

优化if-else代码的八种方案

时间:2022-12-01 12:00:32浏览次数:68  
标签:return String 代码 八种 else println 优化 public

前言

代码中如果if-else比较多,阅读起来比较困难,维护起来也比较困难,很容易出bug,接下来,本文将介绍优化if-else代码的八种方案。

优化if-else代码的八种方案_代码块

优化方案一:提前return,去除不必要的else

如果if-else代码块包含return语句,可以考虑通过提前return,把多余else干掉,使代码更加优雅。

优化前:


1. ​​if(condition){​​
2. ​​ //doSomething​​
3. ​​}else{​​
4. ​​ return ;​​
5. ​​}​​

优化后:


1. ​​if(!condition){​​
2. ​​ return ;​​
3. ​​}​​
4. ​​//doSomething​​

优化方案二:使用条件三目运算符

使用条件三目运算符可以简化某些if-else,使代码更加简洁,更具有可读性。

优化前:


1. ​​int  price ;​​
2. ​​if(condition){​​
3. ​​ price = 80;​​
4. ​​}else{​​
5. ​​ price = 100;​​
6. ​​}​​

优化后:


1. ​​int price = condition?80:100;​​

优化方案三:使用枚举

在某些时候,使用枚举也可以优化if-else逻辑分支,按个人理解,它也可以看作一种表驱动方法

优化前:


1. ​​String OrderStatusDes;​​
2. ​​if(orderStatus==0){​​
3. ​​ OrderStatusDes ="订单未支付";​​
4. ​​}else if(OrderStatus==1){​​
5. ​​ OrderStatusDes ="订单已支付";​​
6. ​​}else if(OrderStatus==2){​​
7. ​​ OrderStatusDes ="已发货"; ​​
8. ​​}​​
9. ​​...​​

优化后:

先定义一个枚举


1. ​​:​​
2. ​​public enum OrderStatusEnum {​​
3. ​​ UN_PAID(0,"订单未支付"),PAIDED(1,"订单已支付"),SENDED(2,"已发货"),;​​
4.
5. ​​ private int index;​​
6. ​​ private String desc;​​
7.
8. ​​ public int getIndex() {​​
9. ​​ return index;​​
10. ​​ }​​
11.
12. ​​ public String getDesc() {​​
13. ​​ return desc;​​
14. ​​ }​​
15.
16. ​​ OrderStatusEnum(int index, String desc){​​
17. ​​ this.index = index;​​
18. ​​ this.desc =desc;​​
19. ​​ }​​
20.
21. ​​ OrderStatusEnum of(int orderStatus) {​​
22. ​​ for (OrderStatusEnum temp : OrderStatusEnum.values()) {​​
23. ​​ if (temp.getIndex() == orderStatus) {​​
24. ​​ return temp;​​
25. ​​ }​​
26. ​​ }​​
27. ​​ return null;​​
28. ​​ }​​
29. ​​}​​

有了枚举之后,以上if-else逻辑分支,可以优化为一行代码


1. ​​String OrderStatusDes = OrderStatusEnum.0f(orderStatus).getDesc();​​

优化方案四:合并条件表达式

如果有一系列条件返回一样的结果,可以将它们合并为一个条件表达式,让逻辑更加清晰。

优化前


1. ​​ double getVipDiscount() {​​
2. ​​ if(age<18){​​
3. ​​ return 0.8;​​
4. ​​ }​​
5. ​​ if("深圳".equals(city)){​​
6. ​​ return 0.8;​​
7. ​​ }​​
8. ​​ if(isStudent){​​
9. ​​ return 0.8;​​
10. ​​ }​​
11. ​​ //do somethig​​
12. ​​ }​​

优化后


1. ​​ double getVipDiscount(){​​
2. ​​ if(age<18|| "深圳".equals(city)||isStudent){​​
3. ​​ return 0.8;​​
4. ​​ }​​
5. ​​ //doSomthing​​
6. ​​ }​​

优化方案五:使用 Optional

有时候if-else比较多,是因为非空判断导致的,这时候你可以使用java8的Optional进行优化。

优化前:


1. ​​String str = "jay@huaxiao";​​
2. ​​if (str != null) {​​
3. ​​ System.out.println(str);​​
4. ​​} else {​​
5. ​​ System.out.println("Null");​​
6. ​​}​​

优化后:


1. ​​Optional<String> strOptional = Optional.of("jay@huaxiao");​​
2. ​​strOptional.ifPresentOrElse(System.out::println, () -> System.out.println("Null"));​​

优化方案六:表驱动法

表驱动法,又称之为表驱动、表驱动方法。表驱动方法是一种使你可以在表中查找信息,而不必用很多的逻辑语句(if或case)来把它们找出来的方法。以下的demo,把map抽象成表,在map中查找信息,而省去不必要的逻辑语句。

优化前:


1. ​​if (param.equals(value1)) {​​
2. ​​ doAction1(someParams);​​
3. ​​} else if (param.equals(value2)) {​​
4. ​​ doAction2(someParams);​​
5. ​​} else if (param.equals(value3)) {​​
6. ​​ doAction3(someParams);​​
7. ​​}​​
8. ​​// ...​​

优化后:


1. ​​Map<?, Function<?> action> actionMappings = new HashMap<>(); // 这里泛型 ? 是为方便演示,实际可替换为你需要的类型​​
2.
3. ​​// 初始化​​
4. ​​actionMappings.put(value1, (someParams) -> { doAction1(someParams)});​​
5. ​​actionMappings.put(value2, (someParams) -> { doAction2(someParams)});​​
6. ​​actionMappings.put(value3, (someParams) -> { doAction3(someParams)});​​
7.
8. ​​// 省略多余逻辑语句​​
9. ​​actionMappings.get(param).apply(someParams);​​

优化方案七:优化逻辑结构,让正常流程走主干

优化前:


1. ​​public double getAdjustedCapital(){​​
2. ​​ if(_capital <= 0.0 ){​​
3. ​​ return 0.0;​​
4. ​​ }​​
5. ​​ if(_intRate > 0 && _duration >0){​​
6. ​​ return (_income / _duration) *ADJ_FACTOR;​​
7. ​​ }​​
8. ​​ return 0.0;​​
9. ​​}​​

优化后:


1. ​​public double getAdjustedCapital(){​​
2. ​​ if(_capital <= 0.0 ){​​
3. ​​ return 0.0;​​
4. ​​ }​​
5. ​​ if(_intRate <= 0 || _duration <= 0){​​
6. ​​ return 0.0;​​
7. ​​ }​​
8.
9. ​​ return (_income / _duration) *ADJ_FACTOR;​​
10. ​​}​​

将条件反转使异常情况先退出,让正常流程维持在主干流程,可以让代码结构更加清晰。

优化方案八:策略模式+工厂方法消除if else

假设需求为,根据不同勋章类型,处理相对应的勋章服务,优化前有以下代码:


1. ​​    String medalType = "guest";​​
2. ​​ if ("guest".equals(medalType)) {​​
3. ​​ System.out.println("嘉宾勋章");​​
4. ​​ } else if ("vip".equals(medalType)) {​​
5. ​​ System.out.println("会员勋章");​​
6. ​​ } else if ("guard".equals(medalType)) {​​
7. ​​ System.out.println("展示守护勋章");​​
8. ​​ }​​
9. ​​ ...​​

首先,我们把每个条件逻辑代码块,抽象成一个公共的接口,可以得到以下代码:


1. ​​//勋章接口​​
2. ​​public interface IMedalService {​​
3. ​​ void showMedal();​​
4. ​​ String getMedalType();​​
5. ​​}​​

我们根据每个逻辑条件,定义相对应的策略实现类,可得以下代码:


1. ​​//守护勋章策略实现类​​
2. ​​public class GuardMedalServiceImpl implements IMedalService {​​
3. ​​ @Override​​
4. ​​ public void showMedal() {​​
5. ​​ System.out.println("展示守护勋章");​​
6. ​​ }​​
7. ​​ @Override​​
8. ​​ public String getMedalType() {​​
9. ​​ return "guard";​​
10. ​​ }​​
11. ​​}​​
12. ​​//嘉宾勋章策略实现类​​
13. ​​public class GuestMedalServiceImpl implements IMedalService {​​
14. ​​ @Override​​
15. ​​ public void showMedal() {​​
16. ​​ System.out.println("嘉宾勋章");​​
17. ​​ }​​
18. ​​ @Override​​
19. ​​ public String getMedalType() {​​
20. ​​ return "guest";​​
21. ​​ }​​
22. ​​}​​
23. ​​//VIP勋章策略实现类​​
24. ​​public class VipMedalServiceImpl implements IMedalService {​​
25. ​​ @Override​​
26. ​​ public void showMedal() {​​
27. ​​ System.out.println("会员勋章");​​
28. ​​ }​​
29. ​​ @Override​​
30. ​​ public String getMedalType() {​​
31. ​​ return "vip";​​
32. ​​ }​​
33. ​​}​​

接下来,我们再定义策略工厂类,用来管理这些勋章实现策略类,如下:


1. ​​//勋章服务工产类​​
2. ​​public class MedalServicesFactory {​​
3.
4. ​​ private static final Map<String, IMedalService> map = new HashMap<>();​​
5. ​​ static {​​
6. ​​ map.put("guard", new GuardMedalServiceImpl());​​
7. ​​ map.put("vip", new VipMedalServiceImpl());​​
8. ​​ map.put("guest", new GuestMedalServiceImpl());​​
9. ​​ }​​
10. ​​ public static IMedalService getMedalService(String medalType) {​​
11. ​​ return map.get(medalType);​​
12. ​​ }​​
13. ​​}​​

使用了策略+工厂模式之后,代码变得简洁多了,如下:


1. ​​public class Test {​​
2. ​​ public static void main(String[] args) {​​
3. ​​ String medalType = "guest";​​
4. ​​ IMedalService medalService = MedalServicesFactory.getMedalService(medalType);​​
5. ​​ medalService.showMedal();​​
6. ​​ }​​
7. ​​}​​

参考与感谢

个人公众号

优化if-else代码的八种方案_代码块_02

  • 觉得写得好的小伙伴给个点赞+关注啦,谢谢~
  • 同时非常期待小伙伴们能够关注我公众号,后面慢慢推出更好的干货~嘻嘻


标签:return,String,代码,八种,else,println,优化,public
From: https://blog.51cto.com/u_15659694/5901519

相关文章

  • 整个页面代码置灰,css设置
    全民悲伤的日子,页面置灰的代码。 <styletype="text/css">html{filter:progid:DXImageTransform.Microsoft.BasicImage(grayscale=1);-webkit-fil......
  • 异步方法代码片段
    VS=>工具=>代码片段管理器=>下拉选择语言==>导入/添加创建名为method.snippet的文件,然后将其导入<?xmlversion="1.0"encoding="utf-8"?><CodeSnippetsxmln......
  • 代码随想录算法训练营Day15|102. 二叉树的层序遍历、226. 翻转二叉树、101. 对称二叉
    代码随想录算法训练营Day15|102.二叉树的层序遍历、226.翻转二叉树、101.对称二叉树102.二叉树的层序遍历102.二叉树的层序遍历需要借用一个辅助数据结构即队列来......
  • 重构:改善既有代码的设计 第八章 读书笔记
    第8章搬移特性8.1搬移函数(MoveFunction)在对象之间搬移函数;8.2搬移字段(MoveField)在对象之间搬移字段;8.3搬移语句到函数(MoveStatementsintoFu......
  • (附代码)树莓派利用OpenCV的图像跟踪、人脸识别等
    编者荐语 树莓派(RaspberryPi)是各种派中最早开始流行起来的一个嵌入式Linux板卡,其本质是尺寸仅有信用卡大小的一个小型电脑。你可以将树莓派连接电视、显示器、键盘鼠标等......
  • 实战 | OpenCV+OCR实现环形文字识别实例(详细步骤 + 代码)
    导读本文将介绍使用OpenCV+OCR实现环形文字识别的详细步骤和代码演示。(来源公众号:OpenCV与AI深度学习) 背景介绍  光学字符识别(OCR)场景中有很多特殊情况,比如噪声、......
  • 让网站首页变灰代码
    不少网站首页已经变成了灰色。下面笔者整理了几种让网页变灰色的CSS代码,供各位站长参考!方法1:支持IE<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN"......
  • 我就往代码加了一行 log 日志,结果引发了 P1 级线上事故。。大家注意!
    作者:老鹰汤链接:https://juejin.cn/post/7156439842958606349线上事故回顾前段时间新增一个特别简单的功能,晚上上线前review代码时想到公司拼搏进取的价值观临时加一行lo......
  • 保序加密代码 说明
     【实验室电脑】【百度网盘:1,2,4,5】【南大云盘:1,2,3,4,5】(因为3太大了网盘没有会员装不下) 1.DP_DT:(复现论文)实现差分隐私 决策树(联想小新)2.HE_DT:(复现论文)同态加密......
  • 代码随想录Day33
    LeetCode530.二叉搜索树的最小绝对差给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。示例:提示:树中至少有2个节点。思路:由于是......