0%

处理概括关系

字段上移

如果两个子类拥有相同的字段,请通过 Pull Up Field(字段上移) 将该字段移至超类。

1
2
3
4
5
6
7
8
9
class Employee {...} // Java

class Salesman extends Employee {
private String name;
}

class Engineer extends Employee {
private String name;
}
1
2
3
4
5
6
class Employee {
protected String name;
}

class Salesman extends Employee {...}
class Engineer extends Employee {...}

重构原因

子类分别的进行开发,会导致出现相同(或几乎相同)的字段和方法。

好处

  • 消除子类中重复的字段;
  • 可以使你将使用该字段的行为从子类移至超类,从而去除重复的行为。

函数上移

如果有些函数在各个子类中产生完全相同的效果,请通过 Pull Up Method(函数上移) 将该函数移至超类。

1
2
3
4
5
6
7
8
9
class Employee {...}

class Salesman extends Employee {
get name() {...}
}

class Engineer extends Employee {
get name() {...}
}
1
2
3
4
5
6
class Employee {
get name() {...}
}

class Salesman extends Employee {...}
class Engineer extends Employee {...}

重构原因

子类彼此独立地进行开发,会导致相同(或几乎相同)的字段和方法。

好处

  • 摆脱重复的代码。如果需要对方法进行修改,最好在一个地方进行更改,而不是在子类中重复修改;
  • 如果由于某种原因,子类重新定义了超类方法但执行基本相同的工作,也可以使用这种重构技术。

构造函数本地上移

如果在各个子类拥有一些几乎完全一致的构造函数,可以通过 Pull Up Constructor Body(构造函数本体上移) 早超类中新建一个构造函数,并在子类中调用它。

1
2
3
4
5
6
7
8
class Manager extends Employee {
public Manager(String name, String id, int grade) {
this.name = name;
this.id = id;
this.grade = grade;
}
// ...
}
1
2
3
4
5
6
7
class Manager extends Employee {
public Manager(String name, String id, int grade) {
super(name, id);
this.grade = grade;
}
// ...
}

函数下移

如果超类中的某个函数只与部分子类有关,请通过 Push Down Method(函数下移) 将这个函数移到相关的那些子类去。

1
2
3
4
5
6
class Employee {
getQuota {...}
}

class Engineer extends Employee {...}
class Salesman extends Employee {...}
1
2
3
4
5
class Employee {...}
class Engineer extends Employee {...}
class Salesman extends Employee {
getQuota {...}
}

好处

  • 提高类的内聚性,让方法位于您希望看到的位置。

字段下移

如果超类中某个字段只被部分子类用到,那么请通过 Push Down Field(字段下移) 将这个字段移到需要它的那些子类去。

1
2
3
4
5
6
class Employee {        // Java
private String quota;
}

class Engineer extends Employee {...}
class Salesman extends Employee {...}
1
2
3
4
5
6
class Employee {...}
class Engineer extends Employee {...}

class Salesman extends Employee {
protected String quota;
}

好处

  • 提高类的内聚性,让字段位于实际使用的位置;
  • 同时移动到多个子类时,可以相互独立地开发字段。这确实会创建代码重复,因此只有在您真正打算以不同方式使用字段时才按下字段。

提炼子类

1
2


1
2


提炼超类

1
2


1
2


提炼接口

1
2


1
2


折叠继承体系

1
2


1
2


塑造模板函数

1
2


1
2


以委托取代继承

1
2


1
2


以继承取代委托

1
2


1
2


欢迎关注我的其它发布渠道