重構手法之在物件之間搬移特性 2

2022-05-01 12:57:07 字數 2352 閱讀 8607

返回總目錄

本小節目錄

某個類做了應該由兩個類做的事。

建立乙個新類,將相關的字段和函式從舊類搬移到新類。

如果乙個類中有大量的函式和資料,這個類往往太大而且不易理解。這時候就需要考慮哪些部分可以分離出去,並將它們分離到乙個單獨的類中。

如果發現子類化只影響類的部分特性,或如果某些特性需要以一種方式來子類化,某些特性則需要以另一種方式子類化,這也意味著需要分解原來的類。

先看乙個簡單的person類。

class

person

public

string officeareacode

public

string officenumber

public

string

gettelephonenumber()

)-";

}}

在這裡,我們可以將與**號碼有關的行為分離到乙個獨立的類中。

首先,定義乙個telephonenumber類表示「**號碼」:

class telephonenumber{}

然後,在person類中建立從person到telephonenumber的連線:

private telephonenumber _phonenumber = new telephonenumber();

現在運用move field移動屬性,並運用move method將相關函式移動到telephonenumber類中。

class

person

public

string

gettelephonenumber()

}

class

telephonenumber

public

string officenumber

public

string

gettelephonenumber()

)-";

}}

類的單一原則表示:乙個類應該是乙個清楚的抽象,處理一些明確的責任。如果乙個類做了兩個類的事,那它就該被提煉了。

某個類沒有做太多事情。

將這個類的所有特性搬移到另乙個類中,然後移除原類。

inline class和extract class正好相反。如果乙個類不再承擔足夠責任、不再有單獨存在的理由,那麼就將其塞進另乙個類中。

第3節中我們提煉出乙個telephonenumber類,現在我們將其塞回person中。

class

person

public

string

gettelephonenumber()

}class

telephonenumber

public

string officenumber

public

string

gettelephonenumber()

)-";

}}

首先,在person中宣告telephonenumber的所有public的函式。

class

person

public

string officeareacode

public

string officenumber

public

string

gettelephonenumber()

public

telephonenumber getofficetelephonenumber()

}

現在,我們要做的就是:找出所有使用telephonenumber的地方,讓它們使用person的介面。於是,下列**:

person martin=new

person();

martin.getofficetelephonenumber().officeareacode = "

781";

就變成了:

person martin=new

person();

martin.officeareacode = "

781";

最後,反覆使用move method和move field,直到telephonenumber類不復存在。

如果乙個類無所事事,那麼這就是一種壞味道——lazy class。遇到這種類,我們應該毫不猶豫的為它舉行「葬禮」,將它塞進其他類中。

to be continued……

重構之在物件之間搬移特性

1.move method 搬移函式 你的程式中,有個函式與其所駐 class 之外的另乙個 class 2.move field 搬移值域 在 target class 建立乙個 new field 修改source field 的所有使用者,令它們改用 new field。3.extract c...

重構 在物件之間搬移特性

1 move method 搬移函式 有個函式與所在類之外的另乙個類進行更多的交流 呼叫或被呼叫 在該函式最常引用的類中建立乙個有著類似行為的新函式。將舊函式變為乙個單純的委託函式,或者將舊函式刪除。2 move field 搬移字段 某個欄位被其所屬類之外的另乙個類頻繁呼叫。3 extract c...

重構 在物件之間搬移特性

你的程式中,有個函式與其所駐類之外的另乙個類進行更多交流 呼叫後者,或被後者呼叫 則在該函式最常引用的類中建立乙個有著類似行為的新函式,將舊函式變成乙個單純的委託函式,或是將舊函式完全移除。動機 如果乙個類有太多行為,或如果乙個類與另乙個類有太多合作而形成高度耦合,就使用搬移函式,通過這種手段,可以...