返回總目錄
本小節目錄
某個類做了應該由兩個類做的事。
建立乙個新類,將相關的字段和函式從舊類搬移到新類。
如果乙個類中有大量的函式和資料,這個類往往太大而且不易理解。這時候就需要考慮哪些部分可以分離出去,並將它們分離到乙個單獨的類中。
如果發現子類化只影響類的部分特性,或如果某些特性需要以一種方式來子類化,某些特性則需要以另一種方式子類化,這也意味著需要分解原來的類。
先看乙個簡單的person類。
classperson
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類中。
classperson
public
string
gettelephonenumber()
}
classtelephonenumber
public
string officenumber
public
string
gettelephonenumber()
)-";
}}
類的單一原則表示:乙個類應該是乙個清楚的抽象,處理一些明確的責任。如果乙個類做了兩個類的事,那它就該被提煉了。
某個類沒有做太多事情。
將這個類的所有特性搬移到另乙個類中,然後移除原類。
inline class和extract class正好相反。如果乙個類不再承擔足夠責任、不再有單獨存在的理由,那麼就將其塞進另乙個類中。
第3節中我們提煉出乙個telephonenumber類,現在我們將其塞回person中。
classperson
public
string
gettelephonenumber()
}class
telephonenumber
public
string officenumber
public
string
gettelephonenumber()
)-";
}}
首先,在person中宣告telephonenumber的所有public的函式。
classperson
public
string officeareacode
public
string officenumber
public
string
gettelephonenumber()
public
telephonenumber getofficetelephonenumber()
}
現在,我們要做的就是:找出所有使用telephonenumber的地方,讓它們使用person的介面。於是,下列**:
person martin=newperson();
martin.getofficetelephonenumber().officeareacode = "
781";
就變成了:
person martin=newperson();
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...
重構 在物件之間搬移特性
你的程式中,有個函式與其所駐類之外的另乙個類進行更多交流 呼叫後者,或被後者呼叫 則在該函式最常引用的類中建立乙個有著類似行為的新函式,將舊函式變成乙個單純的委託函式,或是將舊函式完全移除。動機 如果乙個類有太多行為,或如果乙個類與另乙個類有太多合作而形成高度耦合,就使用搬移函式,通過這種手段,可以...