java 重构 if else_项目中的if else太多了,该怎么重构?
前言
if else過多的話,一般都是用策略模式來進行重構,策略模式也非常的簡單。先定義一個接口,各種處理分支實現這個接口,定義好 條件->處理類的映射關系,然后根據條件找到響應的處理類執行即可,當有新的分支的話,只需要增加一個接口實現類,增加一個條件->映射類的映射關系即可。還是很好容易理解的
介紹
不出意外,這應該是年前最后一次分享,本次來一點實際開發中會用到的小技巧。
比如平時大家是否都會寫類似這樣的代碼:
條件少還好,一旦 else if 過多這里的邏輯將會比較混亂,并很容易出錯。
比如這樣:
摘自 cim 中的一個客戶端命令的判斷條件。
剛開始條件較少,也就沒管那么多直接寫的;現在功能多了導致每次新增一個 else 條件我都得仔細核對,生怕影響之前的邏輯。
這次終于忍無可忍就把他重構了,重構之后這里的結構如下:
最后直接變為兩行代碼,簡潔了許多。
而之前所有的實現邏輯都單獨抽取到其他實現類中。
這樣每當我需要新增一個 else 邏輯,只需要新增一個類實現同一個接口便可完成。每個處理邏輯都互相獨立互不干擾。
實現
按照目前的實現畫了一個草圖。
整體思路如下:
定義一個 InnerCommand 接口,其中有一個 process 函數交給具體的業務實現。
根據自己的業務,會有多個類實現 InnerCommand 接口;這些實現類都會注冊到 Spring Bean 容器中供之后使用。
通過客戶端輸入命令,從 Spring Bean 容器中獲取一個 InnerCommand 實例。
執行最終的 process 函數。
主要想實現的目的就是不在有多個判斷條件,只需要根據當前客戶端的狀態動態的獲取 InnerCommand 實例。
從源碼上來看最主要的就是 InnerCommandContext 類,他會根據當前客戶端命令動態獲取 InnerCommand 實例。
第一步是獲取所有的 InnerCommand 實例列表。
根據客戶端輸入的命令從第一步的實例列表中獲取類類型。
根據類類型從 Spring 容器中獲取具體實例對象。
因此首先第一步需要維護各個命令所對應的類類型。
所以在之前的枚舉中就維護了命令和類類型的關系,只需要知道命令就能知道他的類類型。
這樣才能滿足只需要兩行代碼就能替換以前復雜的 if else,同時也能靈活擴展。
總結
當然還可以做的更靈活一些,比如都不需要顯式的維護命令和類類型的對應關系。
只需要在應用啟動時掃描所有實現了 InnerCommand 接口的類即可,在 cicada 中有類似實現,感興趣的可以自行查看。
這樣一些小技巧希望對你有所幫助。
github地址:https://github.com/crossoverJie/cim
【編輯推薦】
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的java 重构 if else_项目中的if else太多了,该怎么重构?的全部內容,希望文章能夠幫你解決所遇到的問題。