10 Switch Statements(Switch 驚悚現身)
面向對象程序的一個最明顯特征就是:
少用switch(或case)語句.
從本質上說,switch語句的問題在于重復. 你會發現同樣的switch語句散布于不同地點.如果要為它添加一個新的case子句,就必須找到所有并修改它們,面向對象的多態概念可為此帶來優雅的解決方案.
大多數時候,一看到swith語句,你就應該考慮以多態來替換它. 問題是多態該出現在哪里?Switch語句常常根據類型碼進行選擇,你要的是
"與該類型碼相關的函數或類"
所以應該使用Extract Method將switch語句提煉到一個獨立函數中,再以Move Method 將它們搬移到需要多態性的那個類里. 此時你必須決定是否使用Replace Type Code with Subclasses(用子類取代類型碼)或者Replace Type Code With State/Strategy(用state或Strategy替代類型碼) . 一旦這樣完成繼承結構之后, 你就可以運用Replace wonditional with
Polymorphism(用多態取代條件表達式)
如果你只是在單一函數中有些選擇事例, 且并不想改動它們,那么多態就有點殺雞用牛刀了. 這種情況下Replace Parameter with Explicit Methods(以明確函數取代參數)是個不錯的選擇. 如果你的選擇條件之一是null, 可以試試Introduce Null Object(引入Null對象).
tips
Replace Type Code with Subclasses(用子類取代類型碼)
如果你面對的類型碼不會影響宿主類的行為,
可以使用Replace Type Code with Class來處理它們.
但如果類型碼會影響宿主類的行為,
那么最好的辦法就是借助多態來處理變化行為.