因爲目前工做崗位的緣由,項目仍是09年創建的,歷史遺留問題也比較多,加上開發規範並非很完善,項目中有的單個方法達到成百上千行,if-else更是連續寫十幾個也不累。緩存
做爲強迫症真的受不了,另外一方面,代碼的可讀性以及可擴展性大大下降。在接下來的文章中,將結合不一樣的場景介紹幾種優化if-else的常見方案。微信
這種場景很常見,在開發過程當中,碰到if-else的時候,能夠想一下,是否是能夠用三目運算符來替換?固然能夠,否則我寫文章幹嗎,哈哈哈ide
//優化前 public static void before(boolean condition){ int temp; if (condition) { temp = 1;![file](https://img2020.cnblogs.com/other/2120441/202011/2120441-20201124205042187-859391812.png) } 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了this
//優化後 public static void after(String code) { String msg = CacheEnums.of(code).getCode(); System.out.println(msg); }
在業務邏輯開發過程當中,常常會寫一些方法,會校驗參數合法性,以及是否符合業務邏輯等檢查,一旦不合條件,就會進行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; }
可以用的上策略模式的場景相對就更加特殊一些了,舉個常見的例子,一個超市收銀系統中的結算模塊中會有不少種結算方式:雙十一打折活動、滿減活動、會員積分兌換消費券等等。他們都屬於結算業務,那麼就能夠經過策略模式,設計不一樣的結算方式,達到解耦合和易擴展的目的。
接下來的代碼以我項目中實際開發中用到的例子來講明,本次改造點是:在原有發送請求的的方法中增長將消息轉發到其餘平臺的功能。考慮到之後可能會增長更多的平臺,所以,這裏採用策略模式,方便將來的功能擴展。如下爲簡版策略模式:code
/** * 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) { //這裏是業務邏輯 } }
搞定,這樣就可以實現不一樣業務邏輯對應不一樣的實現類,不再用一大坨代碼揉在一塊了,每一種路由方式均可以獨立維護且易擴展,調用方也是無感知的。blog
更多文章請掃碼關注或微信搜索Java棧點公衆號!接口
更多文章請掃碼關注或微信搜索Java棧點公衆號!ip