当前位置:网站首页>优化if-else代码的八种方案
优化if-else代码的八种方案
2020-11-08 12:11:00 【osc_pl4ni83h】
前言
代码中如果if-else比较多,阅读起来比较困难,维护起来也比较困难,很容易出bug,接下来,本文将介绍优化if-else代码的八种方案。
优化方案一:提前return,去除不必要的else
如果if-else代码块包含return语句,可以考虑通过提前return,把多余else干掉,使代码更加优雅。
优化前:
if
(
condition
){
//doSomething
}
else
{
return
;
}
优化后:
if
(!
condition
){
return
;
}
//doSomething
优化方案二:使用条件三目运算符
使用条件三目运算符可以简化某些if-else,使代码更加简洁,更具有可读性。
优化前:
int
price
;
if
(
condition
){
price
=
80
;
}
else
{
price
=
100
;
}
优化后:
int
price
=
condition
?
80
:
100
;
优化方案三:使用枚举
在某些时候,使用枚举也可以优化if-else逻辑分支,按个人理解,它也可以看作一种表驱动方法。
优化前:
String
OrderStatusDes
;
if
(
orderStatus
==
0
){
OrderStatusDes
=
"订单未支付"
;
}
else
if
(
OrderStatus
==
1
){
OrderStatusDes
=
"订单已支付"
;
}
else
if
(
OrderStatus
==
2
){
OrderStatusDes
=
"已发货"
;
}
...
优化后:
先定义一个枚举
:
public
enum
OrderStatusEnum
{
UN_PAID
(
0
,
"订单未支付"
),
PAIDED
(
1
,
"订单已支付"
),
SENDED
(
2
,
"已发货"
),;
private
int
index
;
private
String
desc
;
public
int
getIndex
()
{
return
index
;
}
public
String
getDesc
()
{
return
desc
;
}
OrderStatusEnum
(
int
index
,
String
desc
){
this
.
index
=
index
;
this
.
desc
=
desc
;
}
OrderStatusEnum
of
(
int
orderStatus
)
{
for
(
OrderStatusEnum
temp
:
OrderStatusEnum
.
values
())
{
if
(
temp
.
getIndex
()
==
orderStatus
)
{
return
temp
;
}
}
return
null
;
}
}
有了枚举之后,以上if-else逻辑分支,可以优化为一行代码
String
OrderStatusDes
=
OrderStatusEnum
.
0f
(
orderStatus
).
getDesc
();
优化方案四:合并条件表达式
如果有一系列条件返回一样的结果,可以将它们合并为一个条件表达式,让逻辑更加清晰。
优化前
double
getVipDiscount
()
{
if
(
age
<
18
){
return
0.8
;
}
if
(
"深圳"
.
equals
(
city
)){
return
0.8
;
}
if
(
isStudent
){
return
0.8
;
}
//do somethig
}
优化后
double
getVipDiscount
(){
if
(
age
<
18
||
"深圳"
.
equals
(
city
)||
isStudent
){
return
0.8
;
}
//doSomthing
}
优化方案五:使用 Optional
有时候if-else比较多,是因为非空判断导致的,这时候你可以使用java8的Optional进行优化。
优化前:
String
str
=
"jay@huaxiao"
;
if
(
str
!=
null
)
{
System
.
out
.
println
(
str
);
}
else
{
System
.
out
.
println
(
"Null"
);
}
优化后:
Optional
<
String
>
strOptional
=
Optional
.
of
(
"jay@huaxiao"
);
strOptional
.
ifPresentOrElse
(
System
.
out
::
println
,
()
->
System
.
out
.
println
(
"Null"
));
优化方案六:表驱动法
表驱动法,又称之为表驱动、表驱动方法。表驱动方法是一种使你可以在表中查找信息,而不必用很多的逻辑语句(if或case)来把它们找出来的方法。以下的demo,把map抽象成表,在map中查找信息,而省去不必要的逻辑语句。
优化前:
if
(
param
.
equals
(
value1
))
{
doAction1
(
someParams
);
}
else
if
(
param
.
equals
(
value2
))
{
doAction2
(
someParams
);
}
else
if
(
param
.
equals
(
value3
))
{
doAction3
(
someParams
);
}
// ...
优化后:
Map
<?,
Function
<?>
action
>
actionMappings
=
new
HashMap
<>();
// 这里泛型 ? 是为方便演示,实际可替换为你需要的类型
// 初始化
actionMappings
.
put
(
value1
,
(
someParams
)
->
{
doAction1
(
someParams
)});
actionMappings
.
put
(
value2
,
(
someParams
)
->
{
doAction2
(
someParams
)});
actionMappings
.
put
(
value3
,
(
someParams
)
->
{
doAction3
(
someParams
)});
// 省略多余逻辑语句
actionMappings
.
get
(
param
).
apply
(
someParams
);
优化方案七:优化逻辑结构,让正常流程走主干
优化前:
public
double
getAdjustedCapital
(){
if
(
_capital
<=
0.0
){
return
0.0
;
}
if
(
_intRate
>
0
&&
_duration
>
0
){
return
(
_income
/
_duration
)
*
ADJ_FACTOR
;
}
return
0.0
;
}
优化后:
public
double
getAdjustedCapital
(){
if
(
_capital
<=
0.0
){
return
0.0
;
}
if
(
_intRate
<=
0
||
_duration
<=
0
){
return
0.0
;
}
return
(
_income
/
_duration
)
*
ADJ_FACTOR
;
}
将条件反转使异常情况先退出,让正常流程维持在主干流程,可以让代码结构更加清晰。
优化方案八:策略模式+工厂方法消除if else
假设需求为,根据不同勋章类型,处理相对应的勋章服务,优化前有以下代码:
String
medalType
=
"guest"
;
if
(
"guest"
.
equals
(
medalType
))
{
System
.
out
.
println
(
"嘉宾勋章"
);
}
else
if
(
"vip"
.
equals
(
medalType
))
{
System
.
out
.
println
(
"会员勋章"
);
}
else
if
(
"guard"
.
equals
(
medalType
))
{
System
.
out
.
println
(
"展示守护勋章"
);
}
...
首先,我们把每个条件逻辑代码块,抽象成一个公共的接口,可以得到以下代码:
//勋章接口
public
interface
IMedalService
{
void
showMedal
();
String
getMedalType
();
}
我们根据每个逻辑条件,定义相对应的策略实现类,可得以下代码:
//守护勋章策略实现类
public
class
GuardMedalServiceImpl
implements
IMedalService
{
@Override
public
void
showMedal
()
{
System
.
out
.
println
(
"展示守护勋章"
);
}
@Override
public
String
getMedalType
()
{
return
"guard"
;
}
}
//嘉宾勋章策略实现类
public
class
GuestMedalServiceImpl
implements
IMedalService
{
@Override
public
void
showMedal
()
{
System
.
out
.
println
(
"嘉宾勋章"
);
}
@Override
public
String
getMedalType
()
{
return
"guest"
;
}
}
//VIP勋章策略实现类
public
class
VipMedalServiceImpl
implements
IMedalService
{
@Override
public
void
showMedal
()
{
System
.
out
.
println
(
"会员勋章"
);
}
@Override
public
String
getMedalType
()
{
return
"vip"
;
}
}
接下来,我们再定义策略工厂类,用来管理这些勋章实现策略类,如下:
//勋章服务工产类
public
class
MedalServicesFactory
{
private
static
final
Map
<
String
,
IMedalService
>
map
=
new
HashMap
<>();
static
{
map
.
put
(
"guard"
,
new
GuardMedalServiceImpl
());
map
.
put
(
"vip"
,
new
VipMedalServiceImpl
());
map
.
put
(
"guest"
,
new
GuestMedalServiceImpl
());
}
public
static
IMedalService
getMedalService
(
String
medalType
)
{
return
map
.
get
(
medalType
);
}
}
使用了策略+工厂模式之后,代码变得简洁多了,如下:
public
class
Test
{
public
static
void
main
(
String
[]
args
)
{
String
medalType
=
"guest"
;
IMedalService
medalService
=
MedalServicesFactory
.
getMedalService
(
medalType
);
medalService
.
showMedal
();
}
}
参考与感谢
- 6个实例详解如何把if-else代码重构成高质量代码
-
如何 “干掉” if...else
个人公众号
- 觉得写得好的小伙伴给个点赞+关注啦,谢谢~
- 同时非常期待小伙伴们能够关注我公众号,后面慢慢推出更好的干货~嘻嘻
版权声明
本文为[osc_pl4ni83h]所创,转载请带上原文链接,感谢
https://my.oschina.net/u/4402583/blog/4708088
边栏推荐
- BCCOIN告诉您:年底最靠谱的投资项目是什么!
- Ubuntu20.04下访问FTP服务器乱码问题+上传文件
- Python basic syntax variables
- Personal current technology stack
- Can you do it with only six characters?
- 阿里撕下电商标签
- Adobe media encoder / me 2021 software installation package (with installation tutorial)
- TCP协议如何确保可靠传输
- PCIe enumeration process
- On monotonous stack
猜你喜欢
最全!阿里巴巴经济体云原生实践!(附网盘链接)
2天,利用下班后的4小时开发一个测试工具
Where is the new target market? What is the anchored product? |Ten questions 2021 Chinese enterprise service
VC++指定目录下文件按时间排序输出
It's 20% faster than python. Are you excited?
[data structure Python description] use hash table to manually implement a dictionary class based on Python interpreter
python基本语法 变量
Rust : 性能测试criterion库
Xamarin 从零开始部署 iOS 上的 Walterlv.CloudKeyboard 应用
这次,快手终于比抖音'快'了!
随机推荐
第二次作业
吐血整理!阿里巴巴 Android 开发手册!(附网盘链接)
If you don't understand the gap with others, you will never become an architect! What's the difference between a monthly salary of 15K and a monthly salary of 65K?
Win10 terminal + WSL 2 installation and configuration guide, exquisite development experience
在51CTO学院Get到PMP证书
PMP experience sharing
This year's salary is 35W +! Why is the salary of Internet companies getting higher and higher?
Ali! Visual computing developer's series of manuals (with internet disk link)
分布式文档存储数据库之MongoDB基础入门
Iqkeyboardmanager source code to see
软件测试培训班出来好找工作么
Automatically generate RSS feeds for docsify
用 Python 写出来的进度条,竟如此美妙~
新的目标市场在哪里?锚定的产品是什么?| 十问2021中国企业服务
Adobe Lightroom /Lr 2021软件安装包(附安装教程)
What can your cloud server do? What is the purpose of cloud server?
Entry level! Teach you how to develop small programs without asking for help (with internet disk link)
还不快看!对于阿里云云原生数据湖体系全解读!(附网盘链接)
PMP心得分享
笔试面试题目:求丢失的猪