作法(Mechanics)
- 檢查source class定義之source method所使用的一切特性(features),考慮它們是否也該被搬移。
- ==》如果某個(gè)特性只被你打算搬移的那個(gè)函數(shù)用到,你應(yīng)該將它一并搬移。如果另有其他函數(shù)使用了這個(gè)特性,你可以考慮將使用該特性的所有函數(shù)全部一并搬移。有時(shí)侯搬移一組函數(shù)比逐一搬移簡(jiǎn)單些。
- 檢查source class的subclass和superclass,看看是否有該函數(shù)的其他聲明。
- ==》如果出現(xiàn)其他聲明,你或許無(wú)法進(jìn)行搬移,除非target class也同樣表現(xiàn)出多態(tài)性(polymorphism)。
- 在target class中聲明這個(gè)函數(shù)。
- ==》你可以為此函數(shù)選擇一個(gè)新名稱(chēng) -- 對(duì)target class更有意義的名稱(chēng)。
- 將source method的代碼拷貝到target method中。調(diào)整后者,使其能在新家中正常運(yùn)行。
- ==》如果target method使用了source特性,你得決定如何從target method引用source
object。如果target class中沒(méi)有相應(yīng)的引用機(jī)制,就把source object
reference當(dāng)作參數(shù),轉(zhuǎn)給新建立的target method。
- ==》如果source method包含異常處理式(exception handler),你得判斷邏輯上應(yīng)該由哪個(gè)class來(lái)處理這一異常。如果應(yīng)該由source class來(lái)負(fù)責(zé),就把異常處理式留在原地。
- 編譯target class。
- 決定如何從source正確引用target object。
- ==》可能會(huì)有一個(gè)現(xiàn)成的值域或函數(shù)幫助你取得target
object。如果沒(méi)有,就看能否輕松建立一個(gè)這樣的函數(shù)。如果還是不行,你得在source class中新建一個(gè)新值域來(lái)保存target
object。這可能是一個(gè)永久性修改,但你也可以讓它保持暫時(shí)的地位,因?yàn)楹罄^的其他重構(gòu)項(xiàng)目可能會(huì)把這個(gè)新建值域去掉。
- 修改source method,使之成為一個(gè)delegating method(純委托函數(shù))。
- 編譯,測(cè)試。
- 決定[刪除source method]或?qū)⑺?dāng)作一個(gè)delegating method保留下來(lái)。
- ==》如果你經(jīng)常要在source object中引用target method,那么將source method作為delegating method保留下來(lái)會(huì)比較簡(jiǎn)單。
- 如果你移除source method,請(qǐng)將source class中對(duì)source method的所有引用動(dòng)作,替換為[對(duì)target method的引用動(dòng)作]。
- ==》你可以每修改一個(gè)引用點(diǎn)就編譯并測(cè)試一次。也可以通過(guò)一次[查找/替換]改掉所有引用點(diǎn),這通常簡(jiǎn)單一些。
- 編譯,測(cè)試。
|