[Books]重構-改善既有程式設計-Part2

重點整理第二Part

Chapter 2: 重構原則

何謂重構

  • 名詞:對軟體內部結構的一種調整,目的是在不改變”軟體之可察行為”前提下,提高其可理解性,降低其修改成本
  • 動詞:使用一系列重構準則(手法),在不改變”軟體之可察行為”前提下,調整其結構
  • 更高效且受控的程式碼整理技術
  • 重構目的
    1. 使軟體更容易理解且修改
    2. 效率最佳化
  • 重構不會改變軟體”可受觀察之行為”

為何重構

  • 重構是個工具,可以幫助你始終良好的控制自己的程式碼
    • 重構改進軟體設計 : 經常性的重構可以幫助程式碼維持該有的型態,改進設計的重要方向就是消除重複程式碼
    • 重構使軟體更易被理解 : 讓未來的開發者好理解,協助自己理解不熟悉的程式碼(擦掉窗戶上的污垢,使你看得更遠)
    • 重構助你找到Bugs : 對程式碼的理解可以幫助找到Bugs,更有效地寫出強固穩健的程式碼
    • 重構助你提高開發速度 : 良好設計是快速軟體開發的根本

何時重構

  • 重構應該隨時隨地進行
  • 三次法則 : 事不過三,三則重構
  • 添加功能時一併重構 : 增加理解要修改的程式碼,讓未來新增特性可以更輕鬆,最主要原因是這是最快速流暢的過程
  • 修補錯誤時一併重構 : 增加可讀性,更容易找到Bugs
  • Code Reviews時一併重構 : 有助於開發團隊傳播知識和理解大型軟體系統,和團隊進行設計複審和個別複審者進行程式碼複審
  • 為什麼重構有用
    • 程式困難修改的原因 :
      • 難以閱讀的程式,難以修改
      • 邏輯重複得程式,難以修改
      • 添加新行為時需要修改既有程式碼,難以修改
      • 帶複雜條件邏輯的程式,難以修改
    • 希望程式 :
      • 容易閱讀
      • 相同邏輯都只在唯一地點
      • 新的改動不會危及現有行為
      • 盡可能簡單表達條件邏輯
    • 它在一個可執行的程式上進行,企圖在”不改變程式行為”賦予上述美好性質,讓我們保持高速開發,增加程式價值

怎麼跟主管說

  • 品質驅動 : 技術複審是減少錯誤、提供開發速度的一條重要途徑,重構可以做為複審的一個方法
  • 進度驅動 : 不要跟長官說,能在時程內完工就行了,怎麼做就自己決定
  • 間接層價值
    • 允許邏輯共享
    • 分開解釋意圖和實作
    • 將變化加以隔離
    • 將條件邏輯加以編碼
  • 找出不值得的間接層(寄生式間接層)並拿掉

重構的難題

  • 資料庫 :
    • 大多數商用程式都與DB Schema緊密耦合
    • 資料遷移(Migration)
    • 解決辦法之一: 在物件模型和資料庫模型間插入一個分隔層,這樣就可以各自變化,會增加系統複雜度,但提高靈活度
  • 修改已發佈介面 :
    • 必須同時維護新舊兩個介面,直到所有用戶都改好
    • 讓舊介面呼叫新介面
    • 使用Obsolete Or Deprecation標記
    • 盡量不要發佈介面
  • 難以藉由重構手法完成的設計改動
  • 何時不該重構?
    • 程式碼不能正常運作 : 重寫
    • 先重構為”封裝良好的小型組件”,在判斷組件是要重構還是重寫
    • 專案已近最後期限,也避免重構

重構與設計

  • 彼此互補
  • 適當的預先設計節省回頭工的高額成本,再搭配重構
  • 持續重構可以應付變化帶來的風險,當下只需構築可執行的最簡化系統
  • 請實際測量效率,不要臆測,通常都是錯的
1
有了設計,可以我思考更快,但是其中充滿小漏洞 -- Alistair Cockburn

重構與效率/性能(Performance)

  • 時間預算法 : 用於效率要求極高的即時系統,分解設計時要做好預算,預先分配一定資源,資訊系統通常不用那麼高效
  • 持續關切法 : 任何人在任何時間做任何事都要設法保持系統高效率,通常會讓程式更複雜、難以維護,因而減緩開發速度
  • 關於效率 : 大半時間都耗在一小半程式碼,若所有程式碼都優化會有90%都是浪費時間
  • 以一種”良好的分解方式”建造自己的程式,再用工具找出效率熱點,並集中關切
  • 短程來看,重構會使軟體變慢,但軟體效率調整更容易

結論

  • 事不過三,三則重構
  • 相關技術 : UML示意圖,CRC卡,極限編程(Extreme Programming),搭檔編程(Pair Programming)
-------------The End-------------