上次那篇重構-
筆者曾就職於華為,三星,騰訊,將發佈一系列java技術文檔,歡迎大家關注我哦
本文的目的是重構,是研究其思想,而並不是說這個代碼一定比if-else好,謝謝大家
說到代碼中的 if-else會隨著代碼量的增加,在迭代的過程中變的越來越難以維護,
然後用工廠模式的思路可以把 if-else代碼塊給剝離開來,
不過有朋友提出了不足,
雖然表面上看沒有 if-else了,但其實只是給挪到工廠裡面去。
這不是換湯不換藥嘛?
但其實想完全不用 if-else也是可能的,還是以上次那段代碼為例子來說,
這是最終在調用端的代碼
TargetExecutor executor = ExecutorFactory.getExecutor(target);
executor.process();
這是工廠類的代碼
![Java高級——重構-完全不用 if-else 可能嗎?](http://p2.ttnews.xyz/loading.gif)
開始重構
我們關注的重點是 getExecutor()這個方法,這裡一堆 if-else,
可以看到這裡面的邏輯是根據 target 字符串的不同內容實例化不同的 executor對象給調用者使用,
也就是說,這裡是一種多對多的模式,對於這種模式我們可以考慮用一個 HashMap來保存鍵值對,
private static HashMap<string> mMappings = new HashMap<>();
/<string>
而判斷 target內容的邏輯也不需要放在工廠類裡了,可以重構 TargetExecutor的代碼,給它增加一個抽象方法,
public abstract String matchUri();
這個方法的作用就是返回需要跟它匹配的字符串,
比如 ExecutorWithTag,那麼它返回的是 "RANGE",
如果是 ExecutorWithStash,那麼它返回的是 "#".
我們把新增的代碼列出來,
![Java高級——重構-完全不用 if-else 可能嗎?](http://p2.ttnews.xyz/loading.gif)
準備工作好,還記得我們實例化了一個 HashMap嗎,以String和Executor作為鍵值對的,
現在我們需要另外一個方法來把 executor放到 HashMap裡,
完全摘除 if-else
在準備工作做到這裡後,我們就需要來把工廠中的 if-else摘除了,
我們把之前的條件判斷改成了從一個 map 中遍歷查找匹配的模式,雖然從邏輯上來說,遍歷查找跟 if-else差不多,
但代碼會變更簡潔,也不會再看到一長串的 if-else嵌套了,
下面是摘完之後的工廠類的代碼,
這只是一種代碼中的小技巧,可以在重構代碼的時候讓整個代碼邏輯清晰很多,
但是也有弊端,
因為需要通過 pattern 去查找匹配,就會有可能出現 pattern 類似或者重疊的情況,一不小心就會導致bug...
對於這種情況上面的重構方法就沒那麼好了,
所以我習慣的話會把 if-else 剝離到工廠中就結束,但如果涉及到多個模塊的人之間的合作的話,
才會再拆分一層,讓大家自己把自己的 executor 在靜態方法塊中註冊到 mMapping裡,
這樣各個模塊之前的耦合就能降的很低,大家也就只需要關注自己的功能就行。
閱讀更多 Java高併發框架 的文章