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