1 switch惊悚现身(Switch Statements)
一看到switch语句,就可以考虑用多态来替换它(switch常常根据类型码进行选择,你需要的是”与该类型码相关的函数或类“):
- 使用
Extract Method(提炼函数)
将switch语句提炼到一个独立函数中; - 以
Move Method(搬移函数)
将它搬到需要多态性的那个类里; - 然后决定是否使用
Replace Type Code with Subclasses(以子类取代类型码)
或Replace Type Code with State/Strategy(以State/Strategy取代类型码)
; - 接下来,就可以运用
Replace Conditional with Polymorphism(以多态取代条件表达式)
了。
如果只是在单一函数中有选择事例,并且不想改动他们,多态就有点大材小用了,针对这种情况,可以使用Replace Parameter with Explicit Methods(以明确函数取代参数)
。如果选择条件是null,可以试试Introduce Null Object(引入Null对象)
。
2 令人迷惑的暂时字段(Temporary Field)
坏味道描述:某个对象内部某个实例变量仅为某种特例情况而设。
可以使用Extract Class(提炼类)
给这个实例变量创造一个家,然后把变量相关的代码都放到这个新家中。还可以使用Introduce Null Object(引入Null对象)
在变量不合法的情况下创建Null对象,从而避免写出条件代码。
3 异曲同工的类(Alternative Classes with Different Interfaces)
如果两个函数做同一件事情,却有不同的签名,请运用Rename Method(函数改名)
根据用途重新命名。
也可以使用Extract Superclass(提炼超类)
把子类相同的函数放入超类。
4 被拒绝的遗赠(Refused Bequest)
正常来说,超类支持有所有子类共享的东西,所有超类都应该是抽象的。如果子类不想要继承超类的函数和方法,就会产生坏味道,但这种坏味道不是太强烈。
为了修复这种继承提醒错误,需要为子类新建一个兄弟类,再运用Push Down Method(函数下移)
和Push Down Field(字段下移)
把所有用不到的函数下推给那个兄弟。
拒绝继承超类的实现,这一点我们不介意,但是如果拒绝继承超类的接口,我们不以为然。这个时候应该应用Replace Inheritance with Delegation(以委托取代继承)
来达到目的。