您好,登錄后才能下訂單哦!
如何解決代碼中if…else過多的問題?相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
解決方案一:職責(zé)鏈模式
當(dāng) if...else 中的條件表達式靈活多變,無法將條件中的數(shù)據(jù)抽象為表格并用統(tǒng)一的方式進行判斷時,這時應(yīng)將對條件的判斷權(quán)交給每個功能組件。并用鏈的形式將這些組件串聯(lián)起來,形成完整的功能。代碼演示:
public void handle(request) {
handlerA.handleRequest(request);
}
public abstract class Handler {
protected Handler next;
public abstract void handleRequest(Request request);
public void setNext(Handler next) { this.next = next; }
}
public class HandlerA extends Handler {
public void handleRequest(Request request) {
if (canHandle(request)) doHandle(request);
else if (next != null) next.handleRequest(request);
}
}
解決方案二:表驅(qū)動
對于邏輯表達模式固定的 if...else 代碼,可以通過某種映射關(guān)系,將邏輯表達式用表格的方式表示;再使用表格查找的方式,找到某個輸入所對應(yīng)的處理函數(shù),使用這個處理函數(shù)進行運算。代碼演示:
Map<?, Function<?> action> actionMappings = new HashMap<>(); // 這里泛型 ? 是為方便演示,實際可替換為你需要的類型
// When init
actionMappings.put(value1, (someParams) -> { doAction1(someParams)});
actionMappings.put(value2, (someParams) -> { doAction2(someParams)});
actionMappings.put(value3, (someParams) -> { doAction3(someParams)});
// 省略 null 判斷
actionMappings.get(param).apply(someParams);
解決方案三:Optional
Java 代碼中的一部分 if...else 是由非空檢查導(dǎo)致的。因此,降低這部分帶來的 if...else 也就能降低整體的 if...else 的個數(shù)。Java 從 8 開始引入了 Optional 類,用于表示可能為空的對象。這個類提供了很多方法,用于相關(guān)的操作,可以用于消除 if...else。開源框架 Guava 和 Scala 語言也提供了類似的功能。代碼演示:
Optional<String> strOptional = Optional.of("Hello World!");
strOptional.ifPresentOrElse(System.out::println, () -> System.out.println("Null"));
解決方案四:注解驅(qū)動
通過 Java 注解(或其它語言的類似機制)定義執(zhí)行某個方法的條件。在程序執(zhí)行時,通過對比入?yún)⑴c注解中定義的條件是否匹配,再決定是否調(diào)用此方法。具體實現(xiàn)時,可以采用表驅(qū)動或職責(zé)鏈的方式實現(xiàn)。
很多框架中都能看到這種模式的使用,比如常見的 Spring MVC。因為這些框架很常用,demo 隨處可見,所以這里不再展示具體的演示代碼了。這個模式的重點在于實現(xiàn)?,F(xiàn)有的框架都是用于實現(xiàn)某一特定領(lǐng)域的功能,例如 MVC。故業(yè)務(wù)系統(tǒng)如采用此模式需自行實現(xiàn)相關(guān)核心功能。主要會涉及反射、職責(zé)鏈等技術(shù)。具體的實現(xiàn)這里就不做演示了。
解決方案五:多態(tài)
使用面向?qū)ο蟮亩鄳B(tài),也可以起到消除 if...else 的作用。鏈接中給出的示例比較簡單,無法體現(xiàn)適合使用多態(tài)消除 if...else 的具體場景。一般來說,當(dāng)一個類中的多個方法都有類似于示例中的 if...else 判斷,且條件相同,那就可以考慮使用多態(tài)的方式消除 if...else。同時,使用多態(tài)也不是徹底消除 if...else。而是將 if...else 合并轉(zhuǎn)移到了對象的創(chuàng)建階段。在創(chuàng)建階段的 if..,我們可以使用前面介紹的方法處理。
看完上述內(nèi)容,你們掌握如何解決代碼中if…else過多的問題的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。