溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何解決代碼中if…else過多的問題

發(fā)布時間:2020-08-10 11:24:26 來源:億速云 閱讀:240 作者:Leah 欄目:編程語言

如何解決代碼中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è)資訊頻道,感謝各位的閱讀!

向AI問一下細節(jié)

免責(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)容。

AI