為什么收拾屋子?
住酒店抄罕,有服務(wù)生幫我們收拾房間允蚣,在家需要自己收拾,因為自己還要住很長時間呆贿。屋子干凈了嚷兔,還是有好處的,東西就好找了做入,哪些東西放的位置不對冒晰,也更容易識別出來。
我們看看《[重構(gòu)][refactor]》中Martin Fowler對“重構(gòu)”的定義:
名詞定義:對軟件內(nèi)部結(jié)構(gòu)的一種調(diào)整竟块,目的是在不改變軟件可觀察行為的前提下壶运,提高其可理解性,降低其修改成本浪秘。
定義中給出了重構(gòu)的兩個目的(收益):
- 提高可理解性
- 降低修改成本
代碼編寫完成后蒋情,自己或者他人還會維護(hù)較長一段時間。重構(gòu)耸携,是期望代碼可以更多的被復(fù)用棵癣,有更長的服役時間。
如何收拾屋子违帆?
根據(jù)屋子的布置(結(jié)構(gòu))浙巫,每件物品都有它應(yīng)該放置的位置,發(fā)現(xiàn)不在位置上刷后,就調(diào)整調(diào)整的畴。
重構(gòu)是對軟件內(nèi)部結(jié)構(gòu)的一種調(diào)整。好的軟件在滿足系統(tǒng)功能正確性尝胆、性能等要素同時丧裁,還需考慮軟件的擴(kuò)展性、伸縮性和可讀性含衔。所以它應(yīng)該是有架構(gòu)的煎娇,體現(xiàn)為橫向切分的不同層次和縱向切分的不同模塊二庵,及更細(xì)粒度的類、方法缓呛、函數(shù)催享。重構(gòu)就是根據(jù)軟件本身應(yīng)該的結(jié)構(gòu),對代碼元素進(jìn)行調(diào)整哟绊,放到合適的位置因妙。
什么時候收拾?
發(fā)現(xiàn)屋子臟了票髓、亂了就收拾收拾攀涵,工作忙,就周末收拾洽沟,工作輕松些就每天順手收拾以故。但是房子臟,那是欠的債裆操,遲早需要還的怒详。
伴隨著開發(fā)的過程,重構(gòu)應(yīng)該是個習(xí)慣跷车,發(fā)現(xiàn)代碼有壞味道了棘利,就及時消除掉。交付壓力太大時朽缴,就稍微緩緩善玫,等稍能喘口氣,就趕緊把債還掉密强,不然積少成多茅郎,可能就很難收拾了。
Martin Fowler給出了四個重構(gòu)時機:
- 產(chǎn)生重復(fù)代碼時或渤,
- 新增功能之前
- 修改故障之前
- 代碼走查之后
Kent Beck提出的XP(eXtreme Programming)中系冗,TDD實踐更是把重構(gòu)作為開發(fā)過程中的一部分:
大掃除
逢年過節(jié),你會來個大掃除薪鹦,徹底把屋子調(diào)整調(diào)整掌敬。
時間久了,新人多了池磁,交付壓力大了奔害,代碼難免會產(chǎn)生一些腐化,這些可以通過集中重構(gòu)地熄,徹底清洗清洗华临。
裝修
發(fā)現(xiàn)房間布置,格調(diào)有點跟不上時代端考,需要整的大些雅潭,就是裝修了揭厚。要看自己有沒有地兒住,有沒有時間折騰扶供。
當(dāng)系統(tǒng)新增功能改動很大筛圆;當(dāng)系統(tǒng)性能成為瓶頸,無法忍受椿浓;當(dāng)代碼穿著一層層補丁貼成的外衣顽染,仍到處漏風(fēng)時,此時縫縫補補此時已無濟(jì)于事轰绵,需要更大的調(diào)整,才能根除這些問題尼荆。當(dāng)然此時系統(tǒng)已經(jīng)上線左腔,用戶嗷嗷待哺,你需要有替代方案過度捅儒,需要爭取時間調(diào)整液样。
另一則小故事:
一個建筑隊,全國各地到處跑巧还,住的是一個茅草屋鞭莽。遮風(fēng)避雨是沒有問題的,只是每到一地都要重蓋麸祷,一到下大雨還到處漏水澎怒。修修補補的辦法總有的,但總是很狼狽阶牍。有一天喷面,有人告訴工程隊,可以用可組合的鐵框為骨架走孽,彩鋼為夾層惧辈,這樣既可以連續(xù)拆裝,節(jié)省成本磕瓷,房子也結(jié)實牢固盒齿。
工人們開始擔(dān)心了:“怎么組裝啊,看上去好麻煩困食!”边翁。工程隊的老人也替工頭擔(dān)心,“那得花多少錢啊”陷舅,“會不會住不習(xí)慣”倒彰,工頭出去考察了一番,回來一狠心莱睁,整了一套待讳,雖然過程有些費勁芒澜,結(jié)果收益還是杠杠的。后來大家?guī)缀醵纪嗽?jīng)住過茅草屋创淡。
當(dāng)然痴晦,這里講的不再是重構(gòu)了,這種推倒重來的做法琳彩,我們叫它再工程(re-engineering)誊酌。與重構(gòu)相比,他的風(fēng)險更大露乏,成本更高碧浊。但所謂高風(fēng)險,高回報瘟仿,如果它能帶來更大的收益箱锐,甚至顛覆性創(chuàng)新,我們也值得去做劳较。
再工程不是本文討論的重點驹止,打住观蜗!
對于最具挑戰(zhàn)性的遺留代碼重構(gòu)臊恋,請移步到《淺談遺留代碼的重構(gòu)》
[refactor]:https://book.douban.com/subject/4262627