消滅又臭又長的if-else

背景

??????由于目前工作崗位的原因贝攒,項目還是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)用方也是無感知的蚤告。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市服爷,隨后出現(xiàn)的幾起案子杜恰,更是在濱河造成了極大的恐慌,老刑警劉巖层扶,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件箫章,死亡現(xiàn)場離奇詭異,居然都是意外死亡镜会,警方通過查閱死者的電腦和手機檬寂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來戳表,“玉大人桶至,你說我怎么就攤上這事昼伴。” “怎么了镣屹?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵圃郊,是天一觀的道長。 經(jīng)常有香客問我女蜈,道長持舆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任伪窖,我火速辦了婚禮逸寓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘覆山。我一直安慰自己竹伸,他們只是感情好,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布簇宽。 她就那樣靜靜地躺著勋篓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪魏割。 梳的紋絲不亂的頭發(fā)上譬嚣,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天,我揣著相機與錄音见妒,去河邊找鬼孤荣。 笑死,一個胖子當著我的面吹牛须揣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播钱豁,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼耻卡,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了牲尺?” 一聲冷哼從身側(cè)響起卵酪,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎谤碳,沒想到半個月后溃卡,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡蜒简,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年瘸羡,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片搓茬。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡犹赖,死狀恐怖队他,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情峻村,我是刑警寧澤麸折,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站粘昨,受9級特大地震影響垢啼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜张肾,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一膊夹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧捌浩,春花似錦放刨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至浪听,卻和暖如春螟碎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背迹栓。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工掉分, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人克伊。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓酥郭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親愿吹。 傳聞我的和親對象是個殘疾皇子不从,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 對于業(yè)務(wù)開發(fā)來說,業(yè)務(wù)邏輯的復雜是必然的犁跪,隨著業(yè)務(wù)發(fā)展椿息,需求只會越來越復雜,為了考慮到各種各樣的情況坷衍,代碼中不可避...
    Leiws閱讀 669評論 0 0
  • 一寝优、概述 如上圖,你選擇Life枫耳,還是選擇Work乏矾?這是個問題,這也是判斷語句,落實到代碼就是 語句妻熊。一句 看起來...
    雙魚子曰1987閱讀 2,292評論 0 0
  • 久違的晴天夸浅,家長會。 家長大會開好到教室時扔役,離放學已經(jīng)沒多少時間了帆喇。班主任說已經(jīng)安排了三個家長分享經(jīng)驗。 放學鈴聲...
    飄雪兒5閱讀 7,523評論 16 22
  • 今天感恩節(jié)哎亿胸,感謝一直在我身邊的親朋好友坯钦。感恩相遇!感恩不離不棄侈玄。 中午開了第一次的黨會婉刀,身份的轉(zhuǎn)變要...
    迷月閃星情閱讀 10,566評論 0 11
  • 可愛進取,孤獨成精序仙。努力飛翔突颊,天堂翱翔。戰(zhàn)爭美好潘悼,孤獨進取律秃。膽大飛翔,成就輝煌治唤。努力進取棒动,遙望,和諧家園宾添〈遥可愛游走...
    趙原野閱讀 2,727評論 1 1