作法(Mechanics)
- 創(chuàng)造一個(gè)新函數(shù),根據(jù)這個(gè)函數(shù)的意圖來(lái)給它命名(以它[做什么]來(lái)命名,而不是以它[怎么做]命名)。 --》即使你想要提煉(extract)的代碼非常簡(jiǎn)單,例如只是一條消息或一個(gè)函數(shù)調(diào)用,只要新函數(shù)的名稱(chēng)能夠以更好方式昭示代碼意圖,你也應(yīng)該提煉 它。但如果你想不出一個(gè)更有意義的名稱(chēng),就別動(dòng)。
- 將提煉出的代碼從源函數(shù)(source)拷貝到新建的目標(biāo)函數(shù)(target)中。
- 仔細(xì)檢查提煉出的代碼,看看其中是否引用了[作用域(scope)限于源函數(shù)]的變量(包括局部變量和源函數(shù)參數(shù))。
- 檢查是否有[僅用于被提煉碼]的臨時(shí)變量(temporary variables)。如果有,在目標(biāo)函數(shù)中將它們聲明為臨時(shí)變量。
- 檢查被提煉碼,看看是否有任何局部變量(local-scope variables)的值被它改變。如果一個(gè)臨時(shí)變量值被修改了,看看是否可以被提煉碼處理為一個(gè)查詢(xún)(query),并將結(jié)果賦值給相關(guān)變量。如果很難 這樣做,或如果被修改的變量不止一個(gè),你就不能僅僅將這段代碼原封不動(dòng)地提煉出來(lái)。你可能需要先使用Split Temporary Variable(128),然后再?lài)L試提煉。也可以使用Replace Temp with Query(120)將臨時(shí)變量消滅掉。
- 將被提煉碼中需要讀取的局部變量,當(dāng)作參數(shù)傳給目標(biāo)函數(shù)。
- 處理完所有局部變量之后,進(jìn)行編譯。
- 在源函數(shù)中,將被提煉碼替換為[對(duì)目標(biāo)函數(shù)的調(diào)用]。--》如果你將任何臨時(shí)變量移到目標(biāo)函數(shù)中,請(qǐng)檢查它們?cè)镜穆暶魇绞欠裨诒惶釤挻a的外圍。如果是,現(xiàn)在你可以刪除這些聲明式了。
- 編譯,測(cè)試。