背景

由于目前工作岗位的原因,项目还是09年建立的,历史遗留问题也比较多,加上开发规范并不是很完善,项目中有的单个方法达到成百上千行,if-else更是连续写十几个也不累。

作为强迫症真的受不了,另一方面,代码的可读性以及可扩展性大大降低。在接下来的文章中,将结合不同的场景介绍几种优化if-else的常见方案。


一、巧用三目运算符

这种场景很常见,在开发过程中,碰到if-else的时候,可以想一下,是不是可以用三目运算符来替换?当然可以,不然我写文章干嘛,哈哈哈

//优化前
public static void before(boolean condition){
int temp;
if (condition) {
temp = 1;![file](https://img2020.cnblogs.com/other/2120441/202011/2120441-20201124205042187-859391812.png)
} else{
temp = 2;
}
System.out.println(temp);
}
//优化后
public static void after(boolean condition){
int temp = condition ? 1 : 2;
System.out.println(temp);
}

二、把你学的枚举用起来

使用枚举类,完成对不同分支的逻辑判断,通过枚举便于集中管理逻辑条件,维护起来也更得心应手。代码如下:

//优化前
public static void before(String code) {
String msg = null;
if ("00001".equals(code)) {
msg = "缓存数据不能为空";
} else if ("00002".equals(code)) {
msg = "数据格式异常";
}
System.out.println(msg);
}
//优化后
public enum CacheEnums {
CACHE_DATA_IS_NULL("00001", "缓存数据不能为空"),
DATA_FORMATE_EXCEPTION("00002", "数据格式异常");
private String code;
private String msg;

CacheEnums(String code, String msg) {
this.code = code;
this.msg = msg;
}

public String getCode() {
return code;
}

public void setCode(String code) {
this.code = code;
}

public String getMsg() {
return msg;
}

public void setMsg(String msg) {
this.msg = msg;
}

public static CacheEnums of(String code){
for (CacheEnums temp : CacheEnums.values()) {
if (temp.getCode().equals(code)) {
return temp;
}
}
return null;
}
}

优化后的代码,在想获取msg时,一句话搞定,再也不用写一堆if-else了

//优化后
public static void after(String code) {
String msg = CacheEnums.of(code).getCode();
System.out.println(msg);
}

三、忘记你学的else(合理分析基础上)

在业务逻辑开发过程中,经常会写一些方法,会校验参数合法性,以及是否符合业务逻辑等检查,一旦不合条件,就会进行return或者是抛异常。有些同学的写法:

//优化前
public static int before(boolean condition1,boolean condition2) {
if (!condition1){
return 0;
}else if (condition2){
return 1;
}else{
return 99;
}
}
//优化后
public static int after(boolean condition1,boolean condition2) {
if (condition1){
return 0;
}
if (condition2){
return 1;
}
return 99;
}

四、策略模式

能够用的上策略模式的场景相对就更加特殊一些了,举个常见的例子,一个超市收银系统中的结算模块中会有很多种结算方式:双十一打折活动、满减活动、会员积分兑换消费券等等。他们都属于结算业务,那么就可以通过策略模式,设计不同的结算方式,达到解耦合和易扩展的目的。

接下来的代码以我项目中实际开发中用到的例子来说明,本次改造点是:在原有发送请求的的方法中增加将消息转发到其他平台的功能。考虑到以后可能会增加更多的平台,因此,这里采用策略模式,方便未来的功能扩展。以下为简版策略模式:

/**
* Description:顶层接口类
*/
public interface Route {

//定义处理方法
void handler(Object object);
}
/**
* Description:上下文信息
*/
public class RouteContext {

//策略模式的顶层接口
private Route route;

public RouteContext(Route route) {
this.route = route;
this.init();
}

//调用具体的策略中handler方法
public void handler(Route route, Object object) {
this.route = route;
route.handler(object);
}

public void init() {
//做一些数据的初始化
}
}
/**
* Description:策略一
*/
public class MQType implements Route{
@Override
public void handler(Object object) {
//这里是业务逻辑
}
}
/**
* Description:策略二
*/
public class OtherType implements Route{
@Override
public void handler(Object object) {
//这里是业务逻辑
}
}

搞定,这样就能够实现不同业务逻辑对应不同的实现类,再也不用一大坨代码揉在一块了,每一种路由方式都可以独立维护且易扩展,调用方也是无感知的。

更多文章请扫码关注或微信搜索Java栈点公众号!

更多文章请扫码关注或微信搜索Java栈点公众号!

消灭又臭又长的if-else的更多相关文章

  1. 怎么摆脱又臭又长的 Git 命令?

    在使用 Git 的时候,虽然大部分时候我们用的是图形客户端,但图形客户端不能解决所有的操作,所以,也少不了要需要使用命令行的时候. 但有些 Git 命令和参数确实又不好记,甚至有的命令每次要用的时候需 ...

  2. dp-史上最戳最长最臭代码-hdu-4733-G(x)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4733 题目大意: 定义G(x)=x⊕(x>>1).给两个由0.1.?组成的长度相同的字符 ...

  3. 【编程题目】有 n 个长为 m+1 的字符串,如果某个字符串的最后 m 个字符与某个字符串的前 m 个字符匹配...

    37.(字符串)有 n 个长为 m+1 的字符串,如果某个字符串的最后 m 个字符与某个字符串的前 m 个字符匹配,则两个字符串可以联接,问这 n 个字符串最多可以连成一个多长的字符串,如果出现循环, ...

  4. 浅入 dancing links x(舞蹈链算法)

    abastract:利用dancing links 解决精确覆盖问题,例如数独,n皇后问题:以及重复覆盖问题. 要学习dacning links 算法,首先要先了解该算法适用的问题,精确覆盖问题和重复 ...

  5. Angular2学习笔记(1)

    Angular2学习笔记(1) 1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之 ...

  6. 120项改进:开源超级爬虫Hawk 2.0 重磅发布!

    沙漠君在历时半年,修改无数bug,更新一票新功能后,在今天隆重推出最新改进的超级爬虫Hawk 2.0! 啥?你不知道Hawk干吗用的? 这是采集数据的挖掘机,网络猎杀的重狙!半年多以前,沙漠君写了一篇 ...

  7. Linux 桌面美化那点事儿

    各个 Linux 桌面发行版刚拿到手的时候,或多或少都有点儿不满意,对它们进行一些改造是必须的.网上不乏各种 Linux 桌面美化的教程和经验贴,对我们这些 Linux 爱好者来说都是很好的参考资料. ...

  8. 【移动前端开发实践】从无到有(统计、请求、MVC、模块化)H5开发须知

    前言 不知不觉来百度已有半年之久,这半年是996的半年,是孤军奋战的半年,是跌跌撞撞的半年,一个字:真的是累死人啦! 我所进入的团队相当于公司内部创业团队,人员基本全部是新招的,最初开发时连数据库都没 ...

  9. 细说 Form (表单)

    细说 Form (表单) Form(表单)对于每个WEB开发人员来说,应该是再熟悉不过的东西了,可它却是页面与WEB服务器交互过程中最重要的信息来源. 虽然Asp.net WebForms框架为了帮助 ...

随机推荐

  1. 【计算几何 05】Pick定理

    什么是Pick定理(皮克定理) 来自wiki的介绍: 给定顶点座标均是整点(或正方形格子点)的简单多边形,皮克定理说明了其面积 \(A\)和内部格点数目 \(i\) .边上格点数目 \(b\) 的关系 ...

  2. ORA-28000错误解决方案

    当使用SQL*Plus登录时,Oracle数据库时提示"ORA-28000:帐号被锁定". 导致出现改错误的原因是:在oracle database 11g中,默认在default ...

  3. 1024|推荐一个开源免费的Spring Boot教程

    2020-1024=996! 今天,星期六,你们是否加班了?我反正加了!早上去公司开了一早上会,中午回家写下了这篇文章. 今天,我要推荐一个开源免费的Spring Boot项目,就是我最近日更的Spr ...

  4. HBase基础理论知识

    来源:第四章:大数据 の HBase 基础   本课主题 NoSQL 数据库介绍 HBase 基本操作 HBase 集群架构与设计介紹 HBase 与HDFS的关系 HBase 数据拆分和紧缩 引言 ...

  5. python接口自动化测试遇到的问题及解决方案

    工作中xml中的某一个字段是全网唯一,这就需要进行参数化处理.此次对这一个字段进行参数化处理引用了random模块和index()函数.代码如下: #!/usr/bin/python # -*- co ...

  6. 直接理解转置卷积(Transposed convolution)的各种情况

    使用GAN生成图像必不可少的层就是上采样,其中最常用的就是转置卷积(Transposed Convolution).如果把卷积操作转换为矩阵乘法的形式,转置卷积实际上就是将其中的矩阵进行转置,从而产生 ...

  7. TCP/IP 基础知识

    我把自己以往的文章汇总成为了 Github ,欢迎各位大佬 star https://github.com/crisxuan/bestJavaer 已提交此篇文章 要说我们接触计算机网络最多的协议,那 ...

  8. 仅用六种字符来完成Hello World,你能做到吗?

    Hello World 对于每一个开发者来说都不陌生,因为在我们学习任何一个语言或框架的时候,都会有一个Hello World的案例来帮助我们快速入门. 如果我们使用JavaScript来输出Hell ...

  9. Go读取论文并转换为simhahs

    package main import ( "fmt" _"flag" _ "os" _ "io/ioutil" _&q ...

  10. 基于YOLO-V2的行人检测(自训练)附pytorch安装方法

    声明:本文是别人发表在github上的项目,并非个人原创,因为那个项目直接下载后出现了一些版本不兼容的问题,故写此文帮助解决.(本人争取在今年有空的时间,自己实现基于YOLO-V4的行人检测) 项目链 ...