背景
由於目前工作崗位的原因,專案還是09年建立的,歷史遺留問題也比較多,加上開發規範並不是很完善,專案中有的單個方法達到成百上千行,if-else更是連續寫十幾個也不累。
作為強迫症真的受不了,另一方面,程式碼的可讀性以及可擴充套件性大大降低。在接下來的文章中,將結合不同的場景介紹幾種優化if-else的常見方案。
一、巧用三目運算子
這種場景很常見,在開發過程中,碰到if-else的時候,可以想一下,是不是可以用三目運算子來替換?當然可以,不然我寫文章幹嘛,哈哈哈
//優化前
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了
//優化後
public static void after(String code) {
String msg = CacheEnums.of(code).getCode();
System.out.println(msg);
}
三、忘記你學的else(合理分析基礎上)
在業務邏輯開發過程中,經常會寫一些方法,會校驗引數合法性,以及是否符合業務邏輯等檢查,一旦不合條件,就會進行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;
}
四、策略模式
能夠用的上策略模式的場景相對就更加特殊一些了,舉個常見的例子,一個超市收銀系統中的結算模組中會有很多種結算方式:雙十一打折活動、滿減活動、會員積分兌換消費券等等。他們都屬於結算業務,那麼就可以通過策略模式,設計不同的結算方式,達到解耦合和易擴充套件的目的。
接下來的程式碼以我專案中實際開發中用到的例子來說明,本次改造點是:在原有傳送請求的的方法中增加將訊息轉發到其他平臺的功能。考慮到以後可能會增加更多的平臺,因此,這裡採用策略模式,方便未來的功能擴充套件。以下為簡版策略模式:
/**
* 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) {
//這裡是業務邏輯
}
}
搞定,這樣就能夠實現不同業務邏輯對應不同的實現類,再也不用一大坨程式碼揉在一塊了,每一種路由方式都可以獨立維護且易擴充套件,呼叫方也是無感知的。
更多文章請掃碼關注或微信搜尋Java棧點公眾號!
更多文章請掃碼關注或微信搜尋Java棧點公眾號!