你的某个class没有做太多事情(没有承担足够责任)。
将class的所有特性搬移到另一个class中,然后移除原class。
class Person...
private string _name;
public string getTelephoneNumber();
private TelephoneNumber _officeTelephone;
class TelephoneNumber...
private string _areaCode;
private string _number;
public string getTelephoneNumber();
==>
class Person...
private string _name;
private string _officeAreaCode;
private string _officeNumber;
public string getTelephoneNumber();
动机
Inline Class(154)正好与Extract Class(149)相反。如果一个class不再承担足够责任、不再有单独存在的理由(这通常是因为此前的重构动作移走了这个class的责任),我就会挑选这一[萎缩class]的最频繁用户(也是个class),以Inline Class(154)手法将[萎缩class]塞进去。
作法
1. 在absorbing class(合并端的那个class)身上声明source class的public协议,并将其中所有函数委托(delegate)至source class。
如果[以一个独立接口表示source class函数]更合适的话,就应该在inlining之前先使用Extract Interface(341)。
2. 修改所有source class引用点,改而引用absorbing class。
将source class声明为private,以斩断package之外的所有引用可能。
同时并修改source class的名称,这便可使编译器帮助你捕捉到所有对于source class的“dangling references”(虚悬引用点)。
3. 编译,测试。
4. 运用Move Method(142)和Move Field(146),将source class的特性全部搬移到absorbing class。
5. 为source class举行一个简单的葬礼。
先前(上个重构项)我从TelephoneNumber提炼出另一个class,现在我要将它inlining塞回到Person去。一开始这两个classes是分离的:
class Person...
public String getName() {
return _name;
}
public String getTelephoneNumber() {
return _officeTelephone.getTelephoneNumber();
}
TelephoneNumber getOfficeTelephone() {
return _officeTelephone;
}
private String _name;
private TelephoneNumber _officeTelephone = new TelephoneNumber();
class TelephoneNumber...
public String getTelephoneNumber() {
return ("(" + _areaCode + ")" + _number);
String getAreaCode() {
return _areaCode;
}
void setAreaCode(String arg) {
_areaCode = arg;
}
String getNumber() {
return _number;
}
void setNumber(String arg) {
_number = arg;
}
private String _number;
private String _areaCode;
首先我在Person中声明TelephoneNumber的所有[可见](public)函数:
class Person...
String getAreaCode() {
return _officeTelephone.getAreaCode();
}
void setAreaCode(String arg) {
_officeTelephone.setAreaCode(arg);
}
String getNumber() {
return _officeTelephone.getNumber();
}
void setNumber(String arg) {
_officeTelephone.setNumber(arg);
}
现在,我要找出TelephoneNumber的所有用户,让它们转而使用Person接口。于是下列代码:
Person martin = new Person();
martin.getOfficeTelephone().setAreaCode("781");
就变成了:
Person martin = new Person();
martin.setAreaCode("781");
现在,我可以持续使用Move Method(142)和Move Field(146),直到TelephoneNumber不复存在。