昨天已經看到了 if 的各種型態轉換。有時候我們真的需要伸手去整理這些條件,Rider 也提供很多便捷的小技巧,可以最大幅度地減少我們手動修改條件判斷的機會。
沿用昨天的例子,這次我不用 Invert If
,而是從另一個方向來整理。
按下 Show Context Actions
,選擇 Merge Two 'if's
。
可以看到兩層的 if 被壓縮成一層了。
再做一次。雖然循環複雜度沒有減少,但減少了兩層的巢狀結構,對可理解性來說還是幫助非常大。
還是有點習慣 Early Return
的寫法,再做一次 Invert If
。
即使我早就忘記什麼是 De Morgan's Laws
也沒關係,Rider 會幫我把 if 整理地好好的。
中午吃飯前 PM 跑來跟我說,沒付錢的訂單不能算 Failed,要算 Pending。這個目標跟現在這個寫法有點遠,我打算先把它整理成適合修正的形狀。選取 Flip '||' Operands
。
如此就把 IsPaid 的判斷調換位置,搬到最後面了。
接著這次選擇 Split Into Two 'if' Statements
。
這樣就把不同情境的條件拆開了。
現在的寫法要調整邏輯就很簡單。
細心的人會注意到,Rider 並不是所有操作都符合重構「不改變行為」的定義。Rider 會特別將這類的操作標示為「會改變語意」 (chage semantics)。
一如昨天所說,條件式的修改往往是 bug 發生的地方,非到不得已是不會手動修改的。而即使 Rider 提供很多方便的操作,遇到一些比較複雜的情況,我甚至會畫真值表來驗算。當然,如果條件允許的話最好還是補個測試,即使我們知道怎麼做安全重構,也難保下一個修改的同事會不會又把它改壞。咦,我怎麼說又?