消灭又臭又长的if-else
背景
由于目前工作岗位的原因,项目还是09年建立的,历史遗留问题也比较多,加上开发规范并不是很完善,项目中有的单个方法达到成百上千行,if-else更是连续写十几个也不累。
作为强迫症真的受不了,另一方面,代码的可读性以及可扩展性大大降低。在接下来的文章中,将结合不同的场景介绍几种优化if-else的常见方案。
一、巧用三目运算符
这种场景很常见,在开发过程中,碰到if-else的时候,可以想一下,是不是可以用三目运算符来替换?当然可以,不然我写文章干嘛,哈哈哈
//优化前
public static void before(boolean condition){
int temp;
if (condition) {
temp = 1;
} 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的更多相关文章
- 怎么摆脱又臭又长的 Git 命令?
在使用 Git 的时候,虽然大部分时候我们用的是图形客户端,但图形客户端不能解决所有的操作,所以,也少不了要需要使用命令行的时候. 但有些 Git 命令和参数确实又不好记,甚至有的命令每次要用的时候需 ...
- dp-史上最戳最长最臭代码-hdu-4733-G(x)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4733 题目大意: 定义G(x)=x⊕(x>>1).给两个由0.1.?组成的长度相同的字符 ...
- 【编程题目】有 n 个长为 m+1 的字符串,如果某个字符串的最后 m 个字符与某个字符串的前 m 个字符匹配...
37.(字符串)有 n 个长为 m+1 的字符串,如果某个字符串的最后 m 个字符与某个字符串的前 m 个字符匹配,则两个字符串可以联接,问这 n 个字符串最多可以连成一个多长的字符串,如果出现循环, ...
- 浅入 dancing links x(舞蹈链算法)
abastract:利用dancing links 解决精确覆盖问题,例如数独,n皇后问题:以及重复覆盖问题. 要学习dacning links 算法,首先要先了解该算法适用的问题,精确覆盖问题和重复 ...
- Angular2学习笔记(1)
Angular2学习笔记(1) 1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之 ...
- 120项改进:开源超级爬虫Hawk 2.0 重磅发布!
沙漠君在历时半年,修改无数bug,更新一票新功能后,在今天隆重推出最新改进的超级爬虫Hawk 2.0! 啥?你不知道Hawk干吗用的? 这是采集数据的挖掘机,网络猎杀的重狙!半年多以前,沙漠君写了一篇 ...
- Linux 桌面美化那点事儿
各个 Linux 桌面发行版刚拿到手的时候,或多或少都有点儿不满意,对它们进行一些改造是必须的.网上不乏各种 Linux 桌面美化的教程和经验贴,对我们这些 Linux 爱好者来说都是很好的参考资料. ...
- 【移动前端开发实践】从无到有(统计、请求、MVC、模块化)H5开发须知
前言 不知不觉来百度已有半年之久,这半年是996的半年,是孤军奋战的半年,是跌跌撞撞的半年,一个字:真的是累死人啦! 我所进入的团队相当于公司内部创业团队,人员基本全部是新招的,最初开发时连数据库都没 ...
- 细说 Form (表单)
细说 Form (表单) Form(表单)对于每个WEB开发人员来说,应该是再熟悉不过的东西了,可它却是页面与WEB服务器交互过程中最重要的信息来源. 虽然Asp.net WebForms框架为了帮助 ...
随机推荐
- Linux终端 terminal
终端 一个可以进行人机交互的界面 物理终端 设备终端:键盘.鼠标.显示器 终端类型 控制台终端: /dev/console 串行终端:/dev/ttyS# 虚拟终端:tty:teletypewrite ...
- 攻防世界-mfw
打开题目,让我们看看about这个链接是什么,我们看到了这个 他说他写这个站点用了git.php.bootstrap这很容易就能让我们想到,git源码泄露,这我们直接掏出githack, python ...
- VirtualBox 安装Ubuntu(16.04/18.04)时显示不全的解决方法
是是系统分辨率不同导致的问题 Alt+鼠标左键 (16.04版本亲测有效,18.04版本亲测无效)或者Win+鼠标左键 (18.04版本亲测有效)拖动安装界面,即可显示内容.
- Tomcat8升级后URL中特殊字符报错出现原因
请求带上花括号等字符,请求无法送达服务端,报错: Failed to load resource: the server responded with a status of 400 () https ...
- KVM虚拟化管理平台WebVirtMgr部署及使用
KVM虚拟化管理平台WebVirtMgr部署及使用 需求: 公司机房有一台2U的服务器(64G内存,32核),由于近期新增业务比较多,测试机也要新增,服务器资源十分有限.所以打算在这台2U服务器上 ...
- 学习写简单的RPC框架demo
学习实现一个简单的RPC框架. 工程主要目录分级结构: rpc-common: 公共基础包,能力提供包 rpc-provider: 服务提供者 rpc-consumer:服务消费者 rpc-servi ...
- redis方法-
//链接错误注意 //1.防火墙 //2.配置文件IP绑定 $redis = new Redis(); //连接redis $redis->connect('127.0.0.1', 6379); ...
- 神州笔记本电脑【K670D】安装 Ubuntu18.04 系列操作
一.使用U盘安装 Ubuntu 前的处理如下: 进入BIOS将SSD设为启动首选项 -> F10保存退出 -> 用方向键高亮ubuntu启动项 -> 按e键进入编辑状态 -> ...
- 2018noip游记
2018noip游记 相隔一年多才想起可以弄一篇博客纪念一下我的首次比赛, 以现在的水平回望过去,发现很好玩很有纪念意义, 于是这篇博客诞生了 \(T1\) 当时的我刚学会什么是字符串,但仍然很不熟练 ...
- Docker(2)- Centos 7.x 下安装 Docker
如果你还想从头学起 Docker,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1870863.html 前言 虚拟机安装 centos ...