背景
??????由于目前工作崗位的原因贝攒,項目還是09年建立的,歷史遺留問題也比較多收津,加上開發(fā)規(guī)范并不是很完善饿这,項目中有的單個方法達到成百上千行浊伙,if-else更是連續(xù)寫十幾個也不累撞秋。
??????作為強迫癥真的受不了,另一方面嚣鄙,代碼的可讀性以及可擴展性大大降低哆致。在接下來的文章中菩收,將結(jié)合不同的場景介紹幾種優(yōu)化if-else的常見方案。
一、巧用三目運算符
這種場景很常見咬崔,在開發(fā)過程中,碰到if-else的時候妓蛮,可以想一下侦香,是不是可以用三目運算符來替換?當然可以弥奸,不然我寫文章干嘛榨惠,哈哈哈
//優(yōu)化前
public static void before(boolean condition){
int temp;
if (condition) {
temp = 1;
} else{
temp = 2;
}
System.out.println(temp);
}
//優(yōu)化后
public static void after(boolean condition){
int temp = condition ? 1 : 2;
System.out.println(temp);
}
二、把你學的枚舉用起來
使用枚舉類盛霎,完成對不同分支的邏輯判斷赠橙,通過枚舉便于集中管理邏輯條件,維護起來也更得心應(yīng)手愤炸。代碼如下:
//優(yōu)化前
public static void before(String code) {
String msg = null;
if ("00001".equals(code)) {
msg = "緩存數(shù)據(jù)不能為空";
} else if ("00002".equals(code)) {
msg = "數(shù)據(jù)格式異常";
}
System.out.println(msg);
}
//優(yōu)化后
public enum CacheEnums {
CACHE_DATA_IS_NULL("00001", "緩存數(shù)據(jù)不能為空"),
DATA_FORMATE_EXCEPTION("00002", "數(shù)據(jù)格式異常");
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;
}
}
優(yōu)化后的代碼期揪,在想獲取msg時,一句話搞定规个,再也不用寫一堆if-else了
//優(yōu)化后
public static void after(String code) {
String msg = CacheEnums.of(code).getCode();
System.out.println(msg);
}
三凤薛、忘記你學的else(合理分析基礎(chǔ)上)
在業(yè)務(wù)邏輯開發(fā)過程中姓建,經(jīng)常會寫一些方法,會校驗參數(shù)合法性缤苫,以及是否符合業(yè)務(wù)邏輯等檢查引瀑,一旦不合條件,就會進行return或者是拋異常榨馁。有些同學的寫法:
//優(yōu)化前
public static int before(boolean condition1,boolean condition2) {
if (!condition1){
return 0;
}else if (condition2){
return 1;
}else{
return 99;
}
}
//優(yōu)化后
public static int after(boolean condition1,boolean condition2) {
if (condition1){
return 0;
}
if (condition2){
return 1;
}
return 99;
}
四憨栽、策略模式
能夠用的上策略模式的場景相對就更加特殊一些了,舉個常見的例子翼虫,一個超市收銀系統(tǒng)中的結(jié)算模塊中會有很多種結(jié)算方式:雙十一打折活動屑柔、滿減活動、會員積分兌換消費券等等珍剑。他們都屬于結(jié)算業(yè)務(wù)掸宛,那么就可以通過策略模式,設(shè)計不同的結(jié)算方式招拙,達到解耦合和易擴展的目的唧瘾。
接下來的代碼以我項目中實際開發(fā)中用到的例子來說明,本次改造點是:在原有發(fā)送請求的的方法中增加將消息轉(zhuǎn)發(fā)到其他平臺的功能别凤∈涡颍考慮到以后可能會增加更多的平臺,因此规哪,這里采用策略模式求豫,方便未來的功能擴展。以下為簡版策略模式:
/**
* Description:頂層接口類
*/
public interface Route {
?
//定義處理方法
void handler(Object object);
}
/**
* Description:上下文信息
*/
public class RouteContext {
?
//策略模式的頂層接口
private Route route;
?
public RouteContext(Route route) {
this.route = route;
this.init();
}
?
//調(diào)用具體的策略中handler方法
public void handler(Route route, Object object) {
this.route = route;
route.handler(object);
}
?
public void init() {
//做一些數(shù)據(jù)的初始化
}
}
/**
* Description:策略一
*/
public class MQType implements Route{
@Override
public void handler(Object object) {
//這里是業(yè)務(wù)邏輯
}
}
/**
* Description:策略二
*/
public class OtherType implements Route{
@Override
public void handler(Object object) {
//這里是業(yè)務(wù)邏輯
}
}
??????搞定诉稍,這樣就能夠?qū)崿F(xiàn)不同業(yè)務(wù)邏輯對應(yīng)不同的實現(xiàn)類蝠嘉,再也不用一大坨代碼揉在一塊了,每一種路由方式都可以獨立維護且易擴展杯巨,調(diào)用方也是無感知的蚤告。