- 含义:
少用switch语句,尽量用多态取代 - 坏处:
switch带来代码重复的问题 - 目标:
使用多态代替switch - 实现方法:
- 如果需要根据类型码进行选择,使用Extract Method(提炼函数),在使用**Move Method(搬移函数)**搬到需要改为多态性的类中。
- 之后,可以考虑使用Replace Type Code with Subclasses(以子类代替类型码) 或 Replace Type Code with State/Strategy(用状态或策略模式代替类型码)
- 完成了前面的步骤,就可运用Replace Conditional with Polymorphism (使用多态代替条件语句) 来消除switch了。
- 如果想要替换的数据值是类型码,而这些类型码并不影响行为,则可以运用Replace Type Code with Class (以类取代类型码)
- 如果有与类型码相关的条件表达式,可运用Replace Type Code with Subclass (以子类替代类型码) 或 Replace Type Code with State/Strategy(以状态/策略取代类型码)。
- 如果switch语句并不多,就不宜使用多态方式了,这时候可以考虑使用Replace Parameter with Explicit Methods(以明确的函数取代参数)。
- 如果选择的条件中,有null的,可以试试Introduce Null Object(引入Null对象)
Replace Parameter with Explicit Methods(以明确的函数取代参数)
- 作用:
那些入参以后根据入参不同执行不同行为的情况,改为为每种入参创建独立的函数,减少不必要的判断 - 步骤:
- 针对入参的每一个可能值,新建一个对应的函数
- 修改原先调用此函数的地点,改为直接调用对应的函数
- 编译,测试
- 删除原函数
- 代码实例
//重构前
private int height = 0;
private int width = 0;
void setValue(String name, int value) {
if (name.equals("height")) {
this.height = value;
} else if (name.equals("width")) {
this.width = value;
} else {
//...
}
}
//重构后
private int height = 0;
private int width = 0;
void setHeight(int value) {
this.height = value;
}
void setWidth(int value) {
this.width = value;
}
- 重构思路:
如果某方法中有根据入参执行不同行为的情况,可以改为为该行为新建对应方法,减少代码中的判断语句。
Introduce Null Object(引入Null对象)
- 作用:
将null值用null对象代替,减少代码中判断null的代码。但是有时会造成问题的侦测和查找上的困难。 - 重构思路:
此方法java8以后使用Optional替代。