06-03
2021對(duì)于重構(gòu)一詞,很多人對(duì)它還停留在模糊的概念上,,摸不清重構(gòu)是什么,,于是害怕影響項(xiàng)目進(jìn)度或質(zhì)量就會(huì)讓人“談重構(gòu)色變”。下面我們從重構(gòu)中獲得什么,,重構(gòu)會(huì)不會(huì)造成嚴(yán)重的影響,,有沒(méi)有什么原則等角度即探討一下重構(gòu)的本質(zhì)。
1,、重構(gòu)的目的
“代碼結(jié)構(gòu)的流失有累積效應(yīng),,當(dāng)人們只為短期目的而修改代碼時(shí),他們經(jīng)常沒(méi)有完全理解架構(gòu)的整體設(shè)計(jì),,于是代碼逐漸失去了自己的結(jié)構(gòu),,程序員越來(lái)越難通過(guò)閱讀源碼來(lái)理解原來(lái)的設(shè)計(jì)。”
重構(gòu)這件事想解決的就是上述問(wèn)題,,把難懂的代碼變得容易理解,,使得后續(xù)開(kāi)發(fā)的人(極有可能這個(gè)人是自己)很容易在原來(lái)的基礎(chǔ)上修改,重構(gòu)是純粹從經(jīng)濟(jì)利益角度出發(fā)的,而不是一味追求整潔光亮的代碼,,不要掉入“整潔的代碼”“良好的工程實(shí)踐”之類道德理由的陷阱,。選擇重構(gòu)的唯一理由就是能讓我們更快,開(kāi)發(fā)功能變快,、修復(fù) bug 變快,、交接代碼變快。
2,、軟件開(kāi)發(fā)如同行軍
我們用左腿右腿來(lái)描述軟件開(kāi)發(fā),。在軟件開(kāi)發(fā)時(shí),添加新功能先邁出了左腿,,但之后發(fā)現(xiàn)修改一部分設(shè)計(jì)會(huì)好添加很多,,花上十分鐘進(jìn)行重構(gòu)邁出右腿,再繼續(xù)添加功能…如此往復(fù),,我們的左右腿邁開(kāi)了,,唰唰唰快速而穩(wěn)健地向前走。
在這個(gè)過(guò)程中我們左腿要邁,,右腿也要邁,。當(dāng)然,不是說(shuō)只邁一條腿就走不動(dòng)路,,完全可以拖著走嘛,,只是那樣不夠穩(wěn)健,就像一個(gè)瘸了腿的人,。
3,、士兵不是體育運(yùn)動(dòng)員
重構(gòu)是一種小步快跑的行為,是我們開(kāi)發(fā)過(guò)程中持續(xù)的,、不起眼但無(wú)比重要的邁步,。
當(dāng)然有時(shí)團(tuán)隊(duì)會(huì)專門(mén)花幾個(gè)星期甚至幾個(gè)月的時(shí)間進(jìn)行重構(gòu),以彌補(bǔ)他們之前對(duì)重構(gòu)的忽視,。這種急行軍的行為確實(shí)會(huì)發(fā)生,,但不可能一直發(fā)生,大部分的重構(gòu)應(yīng)該是不起眼的,、伴隨開(kāi)發(fā)同步去做,。這些重構(gòu)的工作往往是立竿見(jiàn)影,給幾個(gè)變量重命名,、調(diào)整函數(shù)的功能——這些看似微小的改變就能在開(kāi)發(fā)前讓我們看清之前的設(shè)計(jì),改造之前的設(shè)計(jì),,更好地敲代碼,。
“如果不做前面的重構(gòu),我可能永遠(yuǎn)都看不見(jiàn)這些設(shè)計(jì)問(wèn)題,因?yàn)槲也粔蚵斆?,無(wú)法在腦海中推演所有這些變化,。Ralph Johnson 說(shuō),這些初步的重構(gòu)就像掃去窗上的塵埃,,使我們得以看到窗外的風(fēng)景,。”
4、令行禁止
如果有一塊丑陋的代碼能被隱藏在一個(gè)完全不需要改造/接觸的API之下,,就繼續(xù)容忍它的丑陋,。記住我們的目的,為了經(jīng)濟(jì)利益,,只有需要理解其工作原理時(shí),,對(duì)其重構(gòu)才有價(jià)值。漂亮的代碼也需要很多重構(gòu),,有時(shí)過(guò)度的設(shè)計(jì)會(huì)干擾現(xiàn)在的功能,,或者當(dāng)時(shí)很漂亮的設(shè)計(jì)并不容易修改代碼,這些漂亮的石頭需要從道路上搬開(kāi),。
5,、你們的隊(duì)伍有指導(dǎo)員么?
一份重構(gòu)的代碼要如何才能保證與原來(lái)的軟件行為不偏離呢,?答案是也需要被指導(dǎo)——被測(cè)試指導(dǎo),。
“自測(cè)試的代碼不僅使重構(gòu)成為可能,而且使添加新功能更加安全,,因?yàn)槲铱梢院芸彀l(fā)現(xiàn)并干掉新近引入的 bug,。”
最后,重構(gòu)不是包治百病的靈丹,,也絕對(duì)不是所謂的“銀彈”,。它更像是一把鉗子,在搭建新管道時(shí)發(fā)現(xiàn)舊管道的問(wèn)題就修修補(bǔ)補(bǔ),,把控住我們的代碼,。一艘船被造出來(lái)是因?yàn)殚_(kāi)始的良好設(shè)計(jì),在海上航行不沉是因?yàn)槿粘5谋pB(yǎng),。