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

jopen 10年前發布 | 13K 次閱讀 重構

英文原文:Software is too expensive to build cheaply….

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

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

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

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

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

    • 把臃腫的方法拆分成較小的、功能集中的方法。
    • 重新命名變量和參數,使之更有意義。
    • 把功能從一個類移到另一個類(更加適當)。
    • 基于一個類的方法,產生一個接口,然后讓這個類實現該新接口。
    • </ul>

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

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

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

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

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

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

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

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

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

        • 注1:代碼重構(英語:Code refactoring)指對軟件代碼做任何更動以增加可讀性或者簡化結構而不影響輸出結果。http://zh.wikipedia.org/wiki/%E4%BB%A3%E7%A0%81%E9%87%8D%E6%9E%84
        • 注2:重構這個術語是從數字與多項式的因式分解類比而來[1]。如,x2 ? 1 可以被分解為 (x + 1)(x ? 1), 這樣揭示了前面的形式不可見的內部結構(如兩個根 +1 和?1)。同樣,在軟件重構中,在可見結構上的改變通常會揭示原代碼中“隱藏”的內部結構。http://zh.wikipedia.org/wiki/%E4%BB%A3%E7%A0%81%E9%87%8D%E6%9E%84
        • </ul>

                              <span id="shareA4" class="fl">                            
                                  </span>
           本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
           轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
           本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!