重構(gòu)第七章
4.Inline Class(將類內(nèi)聯(lián)化)
你的某個(gè)class沒有做太多的事情(沒有承擔(dān)足夠責(zé)任),將class的左右特性搬移到另一個(gè)class中,然后移除原class
Example:
class Penson...
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;
Analyse:
根據(jù)上一個(gè)方法Extract Class(提煉類)之后,我們得到了TelephoneNumber這個(gè)類,或許如今的我覺得TelephoneNumber職責(zé)太過簡單,Person類可以兼并,那我選擇將TelephoneNumber類內(nèi)聯(lián)到Penson中。
。
End:
首先,在person中聲明TelephoneNumber所有public函數(shù):
class Person...
string getAreaCode() {
return _officeTelephone.getAreaCode();
}
void setAreaCode(string arg) {
_office_telephonr.setAreaCode(arg);
}
string getNumber() {
return _officeTelephone.getNumber();
}
string setNumber(string arg) {
_officeTelephone.setNumber(arg);
}
隨后使用Move Method 和Move Field 方法將Telephone的所有成員變量和方法移到Person類中。
class Person...
string getAreaCode() {
return areaCode
}
void setAreaCode(string arg) {
_areaCode=arg;
}
string getNumber() {
return _number);
}
string setNumber(string arg) {
_number = arg;
}
public string getTelephoneNumber() {
return { "(" + _areaCode + ")" + _number};
}
private string _name;
private string _number;
private string _areaCode;
Conclusion:
Inline class(將類內(nèi)聯(lián)化)可以使得不足以擔(dān)當(dāng)一個(gè)責(zé)任的class剔除,使得程序中每一個(gè)class都有其作用。
Inline class(將類內(nèi)聯(lián)化)和Extract Class(提煉類)是兩個(gè)根據(jù)類的職責(zé),進(jìn)行代碼重構(gòu)的方法,他們有著各自的優(yōu)缺點(diǎn)(Inline Class會使程序中class變少,可能會使一部分class職責(zé)增加,Extract Class會使程序中class職責(zé)單一,但是class可能會增多)。這個(gè)具體的評判標(biāo)準(zhǔn),要看每一個(gè)人的主觀判斷標(biāo)準(zhǔn)和每個(gè)程序的具體情況而定是否使用。
Move Method 和 Move Filed是實(shí)現(xiàn)他們底層的一個(gè)重構(gòu)方法,數(shù)個(gè)方法一起使用,才能進(jìn)行一個(gè)完整的重構(gòu)。
注意
重構(gòu)必須在有單元測試的情況下,保證之前的功能修改后不收影響。切記?。。?/code>