重构第八章
16.Replace Subclass with Fields(以值域取代子类)
你的各个subclasses的唯一差别就只在[返回常量数据]的函数上。修改这些函数,使他们返回superclass的某个值域,然后销毁subclasses。
Example:
abstract class Person {
abstract boolean isMale();
abstract char getCode();
...
}
class Male extends Person {
boolean isMale() {
return true;
}
char getCode() {
return 'M';
}
}
class Female extends Person {
boolean isMale() {
return false;
}
char getCode() {
return 'F';
}
}
Analyse:
Male class和 Female class的唯一区别是:他们以不同的方式实现了Person所声明的抽象函数getCode(),返回不同的常量。我们应该把这两个怠惰的subclasses。
End:
class Person {
public Person(boolean isMale, char code) {
_isMale = isMale;
_code = code;
}
private boolean _isMale;
private char _code;
boolean isMale() {
return isMale;
}
char getCode(){
return _code;
}
}
Conclusion:
Replace Subclass with Fields(以值域取代子类)减少了程序中不应该存在的子类,简化了系统架构。
Replace_Type_Code_With_Subclasses(以子类替代类型代码)和Replace Subclass with Fields(以值域取代子类)是相反的两种方法,可以反复使用,平衡代码中的不合理的地方。
注意
重构必须在有单元测试的情况下,保证之前的功能修改后不收影响。切记!!!
网友评论