重構與收拾屋子


爲什麼收拾屋子?

住酒店,有服務生幫我們收拾房間,在家需要自己收拾,因爲自己還要住很長時間。屋子乾淨了,還是有好處的,東西就好找了,哪些東西放的位置不對,也更容易識別出來。

我們看看《[重構][refactor]》中Martin Fowler對“重構”的定義:

名詞定義:對軟件內部結構的一種調整,目的是在不改變軟件可觀察行爲的前提下,提高其可理解性,降低其修改成本

定義中給出了重構的兩個目的(收益):

  1. 提高可理解性
  2. 降低修改成本

代碼編寫完成後,自己或者他人還會維護較長一段時間。重構,是期望代碼可以更多的被複用,有更長的服役時間。

如何收拾屋子?

根據屋子的佈置(結構),每件物品都有它應該放置的位置,發現不在位置上,就調整調整。

重構是對軟件內部結構的一種調整。好的軟件在滿足系統功能正確性、性能等要素同時,還需考慮軟件的擴展性、伸縮性和可讀性。所以它應該是有架構的,體現爲橫向切分的不同層次和縱向切分的不同模塊,及更細粒度的類、方法、函數。重構就是根據軟件本身應該的結構,對代碼元素進行調整,放到合適的位置。

什麼時候收拾?

發現屋子髒了、亂了就收拾收拾,工作忙,就週末收拾,工作輕鬆些就每天順手收拾。但是房子髒,那是欠的債,遲早需要還的。

伴隨着開發的過程,重構應該是個習慣,發現代碼有壞味道了,就及時消除掉。交付壓力太大時,就稍微緩緩,等稍能喘口氣,就趕緊把債還掉,不然積少成多,可能就很難收拾了。

Martin Fowler給出了四個重構時機:

  • 產生重複代碼時,
  • 新增功能之
  • 修改故障之
  • 代碼走查之

Kent Beck提出的XP(eXtreme Programming)中,TDD實踐更是把重構作爲開發過程中的一部分:


大掃除

逢年過節,你會來個大掃除,徹底把屋子調整調整。

時間久了,新人多了,交付壓力大了,代碼難免會產生一些腐化,這些可以通過集中重構,徹底清洗清洗。

裝修
發現房間佈置,格調有點跟不上時代,需要整的大些,就是裝修了。要看自己有沒有地兒住,有沒有時間折騰。

當系統新增功能改動很大;當系統性能成爲瓶頸,無法忍受;當代碼穿着一層層補丁貼成的外衣,仍到處漏風時,此時縫縫補補此時已無濟於事,需要更大的調整,才能根除這些問題。當然此時系統已經上線,用戶嗷嗷待哺,你需要有替代方案過度,需要爭取時間調整。

另一則小故事:

一個建築隊,全國各地到處跑,住的是一個茅草屋。遮風避雨是沒有問題的,只是每到一地都要重蓋,一到下大雨還到處漏水。修修補補的辦法總有的,但總是很狼狽。有一天,有人告訴工程隊,可以用可組合的鐵框爲骨架,彩鋼爲夾層,這樣既可以連續拆裝,節省成本,房子也結實牢固。

工人們開始擔心了:“怎麼組裝啊,看上去好麻煩!”。工程隊的老人也替工頭擔心,“那得花多少錢啊”,“會不會住不習慣”,工頭出去考察了一番,回來一狠心,整了一套,雖然過程有些費勁,結果收益還是槓槓的。後來大家幾乎都忘了曾經住過茅草屋。

當然,這裏講的不再是重構了,這種推倒重來的做法,我們叫它再工程(re-engineering)。與重構相比,他的風險更大,成本更高。但所謂高風險,高回報,如果它能帶來更大的收益,甚至顛覆性創新,我們也值得去做。

再工程不是本文討論的重點,打住!

對於最具挑戰性的遺留代碼重構,請移步到《淺談遺留代碼的重構
[refactor]:https://book.douban.com/subject/4262627

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章