06.19 Java高級——重構-完全不用 if-else 可能嗎?

上次那篇重構-

筆者曾就職於華為,三星,騰訊,將發佈一系列java技術文檔,歡迎大家關注我哦

本文的目的是重構,是研究其思想,而並不是說這個代碼一定比if-else好,謝謝大家

說到代碼中的 if-else會隨著代碼量的增加,在迭代的過程中變的越來越難以維護,

然後用工廠模式的思路可以把 if-else代碼塊給剝離開來,

不過有朋友提出了不足,

雖然表面上看沒有 if-else了,但其實只是給挪到工廠裡面去。

這不是換湯不換藥嘛?

但其實想完全不用 if-else也是可能的,還是以上次那段代碼為例子來說,

這是最終在調用端的代碼

TargetExecutor executor = ExecutorFactory.getExecutor(target);
executor.process();

這是工廠類的代碼

Java高級——重構-完全不用 if-else 可能嗎?

開始重構

我們關注的重點是 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 可能嗎?

準備工作好,還記得我們實例化了一個 HashMap嗎,以String和Executor作為鍵值對的,

現在我們需要另外一個方法來把 executor放到 HashMap裡,

Java高級——重構-完全不用 if-else 可能嗎?

完全摘除 if-else

在準備工作做到這裡後,我們就需要來把工廠中的 if-else摘除了,

我們把之前的條件判斷改成了從一個 map 中遍歷查找匹配的模式,雖然從邏輯上來說,遍歷查找跟 if-else差不多,

但代碼會變更簡潔,也不會再看到一長串的 if-else嵌套了,

下面是摘完之後的工廠類的代碼,

Java高級——重構-完全不用 if-else 可能嗎?

這只是一種代碼中的小技巧,可以在重構代碼的時候讓整個代碼邏輯清晰很多,

但是也有弊端,

因為需要通過 pattern 去查找匹配,就會有可能出現 pattern 類似或者重疊的情況,一不小心就會導致bug...

對於這種情況上面的重構方法就沒那麼好了,

所以我習慣的話會把 if-else 剝離到工廠中就結束,但如果涉及到多個模塊的人之間的合作的話,

才會再拆分一層,讓大家自己把自己的 executor 在靜態方法塊中註冊到 mMapping裡,

這樣各個模塊之前的耦合就能降的很低,大家也就只需要關注自己的功能就行。

Java高級——重構-完全不用 if-else 可能嗎?


分享到:


相關文章: