当前位置:网站首页>优化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
边栏推荐
- 渤海银行百万级罚单不断:李伏安却称治理完善,增速呈下滑趋势
- Where is the new target market? What is the anchored product? |Ten questions 2021 Chinese enterprise service
- Close to the double 11, he made up for two months and successfully took the offer from a large factory and transferred to Alibaba
- Flink的sink实战之一:初探
- 笔试面试题目:判断单链表是否有环
- 分布式文档存储数据库之MongoDB基础入门
- laravel8更新之速率限制改进
- 虚拟机中安装 macOS 11 big sur
- Is software testing training class easy to find a job
- Second assignment
猜你喜欢
TiDB 性能竞赛 11.02-11.06
Istio流量管理--Ingress Gateway
个人目前技术栈
Adobe Lightroom / LR 2021 software installation package (with installation tutorial)
Entry level! Teach you how to develop small programs without asking for help (with internet disk link)
PCIe enumeration process
Xamarin deploys IOS from scratch Walterlv.CloudKeyboard application
新的目标市场在哪里?锚定的产品是什么?| 十问2021中国企业服务
阿里出品!视觉计算开发者系列手册(附网盘链接)
PMP心得分享
随机推荐
The most complete! Alibaba economy cloud original practice! (Internet disk link attached)
软件测试培训班出来好找工作么
Rust : 性能测试criterion库
This paper analyzes the top ten Internet of things applications in 2020!
用 Python 写出来的进度条,竟如此美妙~
用科技赋能教育创新与重构 华为将教育信息化落到实处
PCIe enumeration process
From a friend recently Ali, Tencent, meituan and other P7 Python development post interview questions
Improvement of rate limit for laravel8 update
Understanding design patterns
当Kubernetes遇到机密计算,看阿里巴巴如何保护容器内数据的安全!(附网盘链接)
2018中国云厂商TOP5:阿里云、腾讯云、AWS、电信、联通 ...
Is software testing training class easy to find a job
漫画|讲解一下如何写简历&项目
211 postgraduate entrance examination failed, stay up for two months, get the byte offer! [face to face sharing]
What can your cloud server do? What is the purpose of cloud server?
Top 5 Chinese cloud manufacturers in 2018: Alibaba cloud, Tencent cloud, AWS, telecom, Unicom
墨者学院SQL注入解题
学习小结(关于深度学习、视觉和学习体会)
吐血整理!阿里巴巴 Android 开发手册!(附网盘链接)