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来处理它们.
但如果类型码会影响宿主类的行为,
那么最好的办法就是借助多态来处理变化行为.