繁體中文(香港)
  • remove if-else
  • code optimization
  • clean code
  • interface-oriented programming
  • conditional logic

3 個強大的編碼技術來移除混亂的條件語句

介紹三種強大的編碼技術來優化和簡化複雜的條件結構,提升代碼質量和可維護性。

Yijun
Yijun
Developer

Stop wasting weeks on user auth
Launch secure apps faster with Logto. Integrate user auth in minutes, and focus on your core product.
Get started
Product screenshot

在軟件開發中,我們經常遇到需要處理多種情況的代碼邏輯。如果管理不當,這些邏輯很容易演變成冗長的 if-else 鏈條或龐大的 switch 語句。本文將介紹幾種有效的技術來優化這些結構,以提升代碼質量和可維護性。

1. 防禦式編程:早期返回

假設我們正在開發一個用戶身份驗證系統,需要在允許訪問之前檢查各種用戶狀態:

這段代碼有明顯的結構問題。它使用了深層嵌套的 if-else 結構,使代碼難以閱讀和維護。隨著條件檢查的增加,代碼的縮進層級加深,形成所謂的 "箭頭型" 代碼。錯誤處理邏輯分散在不同的嵌套層級,這不利於統一管理。更重要的是,代碼的核心邏輯——允許訪問的情況——埋在多層條件判斷的深處,缺乏直觀性。這種編碼風格不僅降低了代碼的可讀性,還增加了錯誤風險,使代碼擴展困難。

我們可以使用 "早期返回" 方法優化這段代碼:

通過採用 "早期返回" 策略,我們成功優化了原本的代碼結構。

這種方法帶來了幾個改進:

  • 它顯著減少了代碼的嵌套複雜性。每個條件檢查都獨立處理,使整體邏輯更加清晰易懂。這種扁平的結構不僅提高了代碼可讀性,也大大降低了維護的難度。
  • 這種優化方法實現了錯誤處理邏輯的集中管理。通過在每個條件檢查後即刻返回結果,我們避免了不必要的代碼執行,同時將各種錯誤場景的處理集中化,使整個錯誤處理過程更具組織性。
  • 代碼的核心邏輯——允許訪問的條件——變得更加突出。這種結構使代碼的主要目的即刻顯現,大大增強了代碼的表達力和可理解性。

2. 查找表法

我們經常遇到根據不同的輸入返回不同結果的場景。如果處理不當,這些邏輯很容易演變成冗長的 if-else 鏈或龐大的 switch 語句。例如,在一個電子商務平台上,我們需要根據不同的訂單狀態返回相應的狀態描述:

這是根據不同情況返回不同結果的典型場景。隨著情況數量的增加,switch 語句或 if-else 判斷會變得冗長。此外,在這種場景中,如果用戶需要將這些狀態內容翻譯成其他語言,則需要修改函數體或添加新函數,這將帶來顯著的維護成本。

在這種情況下,我們可以使用查找表法來優化代碼:

首先,通過使用 Map 對象存儲狀態與描述之間的映射關係,代碼變得更加簡潔。我們還簡化了將狀態描述移至配置文件的過程,為國際化和動態更新提供了便利。當新增狀態時,我們不需要修改核心邏輯代碼;只需在配置中添加相應的鍵值對即可。

3. 面向介面的編程

在開發大型軟件系統時,我們經常需要支持多服務提供者或功能模塊。在軟件設計階段,我們可以考慮使用面向介面的編程來方便後續擴展,從而消除複雜系統中由硬編碼帶來的多條件判斷的複雜性。

假設我們正在開發一個多語言翻譯系統,需要支持不同的翻譯服務提供者。如果我們不在設計階段考慮面向介面的編程,後續擴展將變得非常困難:

這段實現使用簡單粗暴的 if-else 結構來選擇翻譯提供者,導致代碼難以維護和擴展。將來新增翻譯提供者時,需要修改現有代碼,且隨著支持的翻譯提供者增多,代碼會變得臃腫且難以維護。同時,這種複雜的方法也難以單元測試,因為不易模擬不同的翻譯提供者。

為了解決這些問題,我們可以使用面向介面的編程來優化代碼。面向介面的編程是實現多態性的重要方式,允許不同物件對相同消息做出不同響應。

實現過程:

  1. 定義翻譯策略介面:
  1. 為每個翻譯提供者實現此介面:
  1. 重構 TranslationService 類,將策略作為參數傳入:
  1. 使用優化後的代碼:

通過定義 TranslationStrategy 介面和引入面向介面的編程,我們獲得以下好處:

  • TranslationService 可以在每次調用時使用不同的翻譯策略。
  • 新增翻譯提供者變得簡單,只需創建一個新的策略類並實現該介面。
  • 客戶端代碼可以靈活選擇每次翻譯使用的策略而不修改 TranslationService 的核心邏輯。
  • 每個翻譯策略可以獨立測試,提高了代碼的可測試性。
  • 避免在 TranslationService 中維護狀態,使服務更加無狀態和線程安全。

總結

優化條件語句結構是提升代碼質量的重要手段。本文介紹的三種方法——防禦式編程、查找表法和面向介面的編程(結合多態性)——各有其適用場景:

  1. 防禦式編程適用於處理多個獨立的條件檢查,可以有效減少代碼嵌套。
  2. 查找表法適用於處理對不同情況以不同方式響應的需求,使代碼更簡潔易於維護。
  3. 面向介面的編程結合多態性適用於構建複雜但靈活的系統,提高代碼靈活性和擴展性。

在實際開發中,我們往往需要根據具體情況選擇合適的方法,有時甚至需要綜合應用多種技術。重要的是要平衡代碼的簡單性、可讀性和可維護性,選擇最符合當前問題的解決方案。

記住,過度優化可能會導致代碼過於複雜。保持代碼簡單和可讀性始終是首要原則。在應用這些技術時,應根據項目的具體需求和團隊的技術水平做出明智的選擇。