重構、重新架構、再設計與重寫的區別

labazhou發表於2014-09-12

  在稍早的文章評論裡,Jon Eaves 表達了把重構做為動詞過度使用的憂慮。尤其是重構(refactoring)【注1】和重新架構(rearchitecting)之間的界線非常模糊,重構被用作在你回頭做第二遍的、任何行為的標籤。你明白嗎?Jon 是對的。

  被 Martin Fowler 定義的重構,是一個非常具體的術語,以數學上等同的具體術語為基礎【注2】。重構是關於小的、“行為保留”的增加的、安全步驟。重構不是在應用程式裡回頭去“填充空白”的藉口。

  讓我們給出一些具體的例子來說明什麼不是重構,下面的行為都不被視作重構:

  • “優化”(又稱作增加)錯誤處理。
  • 增加日誌
  • 勉強塞滿另一個功能
  • 提高測試覆蓋率(雖然它非常接近重構了)
  • 當老闆不在的時候,玩掃雷遊戲

  重構是“優化現有程式碼的設計”。在本文,優化意味著使之更加易於理解和/或更加靈活。下面的行為都被視作重構:

  • 把臃腫的方法拆分成較小的、功能集中的方法。
  • 重新命名變數和引數,使之更有意義。
  • 把功能從一個類移到另一個類(更加適當)。
  • 基於一個類的方法,產生一個介面,然後讓這個類實現該新介面。

  注意,我說的這些可以是重構的行為。決定它們是否屬於重構的大部分因素在於你是如何去做的。重申:重構行為,是小而安全的步驟,最好是可逆的步驟。如果你不得不考慮它是否可以執行,那麼它就不再是重構行為了。

  那麼如何區別重構與重新架構或再設計呢?重構是在鍵盤上完成的,接觸真正的程式碼。而重新架構,最好是在白板上(或最近的酒吧)完成的。重新架構涉及了較大的願景,考慮下一週/月/年的規劃。重構是你用來幫助自己達成目標的技巧之一。

  再設計(Redisigning)是一個術語,覆蓋了任何時候你正在重新考慮的設計決定。由於敲程式碼是設計行為,甚至到了打字階段,再設計肯定 包含重構。畢竟,如果你不稍微再設計,就不太容易提高設計。然而,在通常情況,“再設計”意味著放棄老的解決方案,提出新的解決方案,或多或少地從頭開 始。如果你在白板上做再設計,可能是沒問題的,與重新架構的舉動類似,你仍然可以通過重構達成目標。如果你在鍵盤上完成再設計,這就不是重構了。

  重寫(Re-writing)類似再設計,不過它只是在鍵盤上完成。重寫通常是受到了頭痛的傷害,但是它常常讓你丟掉惰性而到達一個更好的地方。類似拍賣和搬到了印度班加羅爾。

  在實戰中,會遇到混合的情況。重構應該是一個開發人員使用的日常程式的一部分,當你這樣看的時候,界線會變得模糊。比如:

  • 注意,你需要在業務邏輯裡為第二種部件增加支援,這是一個設計行為。
  • 從現有部件抽出一個新的介面類,在此過程中重新命名現有部件,這是一個重構的行為。
  • 用新介面代替部件類的所有適合的引用,是一個重構行為。
  • 開發第二個部件,增加到應用程式裡,是一個設計行為。

  如果你最初開發了兩個部件,後來才注意到公用的情況,該怎麼辦?好的,這是重構行為,可能要集中在以多型取代條件式的重構上。但是從外部看,這可能看起來非常像重寫;必定(相對地)大量程式碼要消除掉。但是,不管你用什麼方式削減,寫第二個部件就不是一個重構行為。

  重構更傾向於保持程式碼簡單、靈活,而不是做對事情。做對事情經常涉及到新增新程式碼,或再設計應用程式的大塊功能。使其靈活只是為了使其更加容易。這樣說的話,重構最好被看做是一項賦能(enabling)行為。

  如你所知,如果我寫這篇文章不是在深夜,或許本文會更加連貫:) 如果你想更多瞭解重構,去看看 Fowler 的書。

  原文:Software is too expensive to build cheaply…. 來自: labazhou

相關文章