|
從定義上看,重構(gòu)意味著改變程序的內(nèi)部結(jié)構(gòu),而不改變外部的功能行為。這樣做大多是為了提高程序的非功能性屬性,從而提高代碼的質(zhì)量。然而,即便是經(jīng)驗(yàn)豐富的敏捷開發(fā)者,在進(jìn)行大規(guī)模的重構(gòu)時(shí)也是如履薄冰。社區(qū)中的成員對掌控大規(guī)模重構(gòu)的幾種方式進(jìn)行了討論。
在最近的討論中,Andreas想要知道三種可能完成大規(guī)模重構(gòu)的方法中哪種最好。他的方式包括,
- 一次完成——定義最終狀態(tài)的結(jié)構(gòu),然后將代碼一次完成。
- 分而治之——將一大團(tuán)亂七八糟的代碼分為兩段,然后重復(fù)這樣的操作,直至完成……
- 壓制(Strangling)——壓制類
大多數(shù)回應(yīng)者都認(rèn)為“一次完成”幾乎不會(huì)成功的。Aaron Digulla指出他在整個(gè)職業(yè)生涯中一直使用壓制的方法。這種想法是要慢慢地將不好的代碼變?yōu)閸湫碌膬?yōu)質(zhì)代碼,并在過程中用測試來保證轉(zhuǎn)換的正確性。這種策略的優(yōu)勢在于,因?yàn)槟闶菑男∑温_始的,因此風(fēng)險(xiǎn)很小。David Hall和Shane MacLaughlin強(qiáng)調(diào)了分而治之方法的重要性,但也要針對程序所有修改的部分編寫充分的測試。一些人建議完全推倒重寫,但是正如InfoQ之前的一篇文章所說的,那會(huì)讓你面臨一系列的挑戰(zhàn)。
Sibylle Peter和Sven Ehrke提到,他們使用的方法是,先對工作進(jìn)行評估,然后為大規(guī)模的重構(gòu)制定主要計(jì)劃。對于每個(gè)重構(gòu)步驟,他們都會(huì)遵循以下三步:
- 分析:定義想要的結(jié)果,并找到達(dá)到目的的方法。
- 實(shí)現(xiàn):應(yīng)用重構(gòu)技術(shù)來相應(yīng)地改變代碼。
- 穩(wěn)定:應(yīng)用一些方法,確保實(shí)現(xiàn)的結(jié)果是持久的。
另一種讓大規(guī)模重構(gòu)得以進(jìn)行的方法是“天皇牌”(Mikado)方法。回顧天皇牌方法的歷史,我們會(huì)發(fā)現(xiàn)它與Daniel Brolund和Ola Ellnestam所做的工作有關(guān),而它的名字來自于天皇牌游戲。根據(jù)這個(gè)方法,
修改代碼就像進(jìn)行天皇牌游戲一樣。當(dāng)你想要對代碼庫做出修改時(shí),幾乎無法以正確的方式做出準(zhǔn)確的修改你需要做些準(zhǔn)備、移動(dòng)代碼、抽取類等等。我們很少會(huì)第一次就抓到天皇牌。更多的是,在“重構(gòu)天皇”可用之前,你需要做一系列的變動(dòng),有條不紊地向你的牌堆的底部進(jìn)發(fā),以達(dá)到目的。
使用天皇牌方法,首先要記住最終的目的。對于任何需要重構(gòu)的代碼,我們首先要?jiǎng)?chuàng)建一幅依賴圖,在上面寫下最終的目標(biāo)。下一步是識(shí)別出想要達(dá)到目標(biāo)所需要的直接前提,然后以這種方式繼續(xù)識(shí)別依賴關(guān)系,直到達(dá)到?jīng)]有任何前提或者依賴的葉子節(jié)點(diǎn)。這可能是開始重構(gòu)最好的方式。一旦有了依賴關(guān)系圖,那么核心思想就是從葉子節(jié)點(diǎn)一步一步回溯,直到達(dá)到目標(biāo)。
這種方法強(qiáng)調(diào)了撤銷操作的重要性,團(tuán)隊(duì)不應(yīng)該害怕因?yàn)榛赝硕鴴仐壱恍└淖儭K€建議不要停止分析,而應(yīng)該從最基本步驟開始,然后理解順序。現(xiàn)在他們已經(jīng)提供了關(guān)于“天皇牌”方法的書的草稿版本。
因此,大規(guī)模重構(gòu)很難做,做好這項(xiàng)工作的關(guān)鍵在于要識(shí)別出起點(diǎn),然后沿著路線小步前進(jìn)。
查看英文原文:How To Do Large Scale Refactoring
it知識(shí)庫:如何進(jìn)行大規(guī)模重構(gòu),轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時(shí)間聯(lián)系我們修改或刪除,多謝。