重构对象-inline class将类内联化四-爱代码爱编程
重构对象-Inline Class将类内联化四
1.将类内联化
1.1.使用场景
Inline Class (154)将类内联化
正好与Extract Class (149)提炼类
相反。如果一个类不再承担足够责任、不再有单独存在的理由(这通常是因为此前的重构动作移走了这个类的责任),我就会挑选这一“萎缩类”的最频繁用户(也是个类),以Inline Class (154)手法将“萎缩类”塞进另一个类中。
1.2.如何做
- 在目标类身上声明源类的public协议,并将其中所有函数委托至源类。
- 如果“以一个独立接口表示源类函数”更合适的话,就应该在内联之前先使用Extract Interface (341)。
- 修改所有源类引用点,改而引用目标类。
- 将源类声明为private,以斩断包之外的所有引用可能。同时修改源类的名称,这便可使编译器帮助你捕捉到所有对于源类的隐藏引用点。
- 编译,测试。
- 运用Move Method (142)和Move Field (146),将源类的特性全部搬移到目标类。
- 删除原类
- 编译,测试
1.3.示例
下面程序有两个类,Person
类负责创建人对象。TelephoneNumber
类负责管理电话号码。现在将TelephoneNumber
类放到Person
类中。
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对象中的方法。同时删除上面的方法
Person martin = new Person();
martin.setAreaCode ("781");
现在,我可以持续使用Move Method 和 Move Field ,直到TelephoneNumber不复存在。