Advertisement

漫談重構

teddysoft
Sep. 15, 2020
Advertisement

More Related Content

Advertisement

Recently uploaded(20)

Advertisement

漫談重構

  1. Teddy Chen teddy@teddysoft.tw http://teddy-chen-tw.blogspot.tw/ 2020/09/15
  2. Copyright@2020 Teddysoft
  3. • Part 1: 什麼是重構? • Part 2: 從定義看重構 • Part 3: 重構的定位 – Refactoring and Patterns • Part 4: 重構與設計方法 – TDD/BDD/SBE vs OOAD vs DDD • Part 5: 重構範例討論 Copyright@2020 Teddysoft
  4. Copyright@2020 Teddysoft
  5. 在不改變程式外在行為的前提之下, 改變程式內部結構以提升設計品質的方法 Copyright@2020 Teddysoft Before refactoring After refactoring
  6. Copyright@2020 Teddysoft http://goo.gl/6uqzes B A
  7. Copyright@2020 Teddysoft
  8. Copyright@2020 Teddysoft
  9. Copyright@2020 Teddysoft 《Extreme Programming explained》 好的軟體設計,其改變的成本應該與改變的範圍有關, 與改變發生的時間點無關《Clean Architecture》
  10. Copyright@2012-2016 Teddysoft Source http://goo.gl/roc09w
  11. • Refactoring (Noun ) – A change made to the internal structure of software to make it easier to understand and cheaper to modify without changing its observable behavior. (對軟體內部結構的一種改變,目的在不改動軟體可察覺行 為的前提之下,提高其可理解性並降低修改成本。) • Refactor (Verb) – To restructure software by applying a series of refactoring without changing its observable behavior. (在不改變軟體可察覺行為的前提之下使用一系列重構方法 調整軟體結構 。) Copyright@2020 Teddysoft Source:《Refactoring》
  12. Copyright@2020 Teddysoft Source:《Refactoring》
  13. Copyright@2019 Teddysoft 確定所有測試 都通過 發現怪味道 決定如何簡化 簡化程式 (重構) 確定所有測試 都依舊通過
  14. • 隨時 • 事不過三原則 • 當增加新功能很困難時 • 當你對程式更了解時 • 當你修正bug時 • 當程式碼發臭時 Copyright@2020 Teddysoft
  15. • 沒有測試案例 • 測試案例失敗時 • 當你應該重寫而非重構時 • 當你的截止日期迫在眉睫時 Copyright@2020 Teddysoft
  16. • Shared code • Coding standards • Pair programming • Simple design – Passes the tests, Reveals intention, No duplication, Fewest elements • Tests • Continuous integration • Rested programmers Copyright@2020 Teddysoft 《Extreme Programming Explained》
  17. Copyright@2020 Teddysoft
  18. Copyright@2020 Teddysoft
  19. Copyright@2020 Teddysoft Source:《Refactoring》
  20. Copyright@2020 Teddysoft
  21. Copyright@2020 Teddysoft Data Class Feature Envy
  22. Copyright@2020 Teddysoft
  23. Copyright@2020 Teddysoft 5 2 4 在不改變程式外在行為的前提之下, 改變程式內部結構以提升設計品質 1 6 如何確認? 如何定義? 怎麼改? 哪些結構可以改? 品質的提升目標為何? 3 為什麼要以不改變程 式外在行為當作前提?
  24. Copyright@2020 Teddysoft 在不改變程式外在行為的前提之下, 改變程式內部結構以提升設計品質 1
  25. if 1 == 1 then S1 else S2 Copyright@2020 Teddysoft 開什麼玩笑! 太難 Ref. : https://goo.gl/sBYyAg • Denotational semantics • Operational semantics • Axiomatic semantics
  26. Copyright@2020 Teddysoft
  27. • Normal behavior – 一般重構 • Exceptional behavior – 例外處理重構 Copyright@2020 Teddysoft
  28. Copyright@2020 Teddysoft Replace semantics proven with scenario-based tests
  29. 思考問題1: 用測試定義行為有何優缺點? 有無替代方案? Copyright@2020 Teddysoft
  30. Copyright@2020 Teddysoft 在不改變程式外在行為的前提之下, 改變程式內部結構以提升設計品質 2
  31. • 使用工具 – 編譯器 – 重構工具 • 執行測試案例 – Local Build – CI Build Copyright@2020 Teddysoft IntelliJ 的重構選項
  32. • Normal behavior – 一般重構 – 不改變程式的正常行為 • Exceptional behavior – 例外處理重構 – 可能會改變程式的例外行為 Copyright@2020 Teddysoft
  33. Copyright@2020 Teddysoft 重構最常用執行測試驗 證程式行為有無改變
  34. Copyright@2020 Teddysoft 在不改變程式外在行為的前提之下, 改變程式內部結構以提升設計品質 3
  35. • 開發的兩頂帽子 – 實作功能性需求 (do the right thing) – 改善設計(do the thing right; 寫出clean code) • 呼應軟體設計原則 – Separation of Concerns – Single Responsibility Principle – One Pattern at a Time Copyright@2020 Teddysoft
  36. Copyright@2020 Teddysoft 思考do the thing right 的時候不要管do the right thing
  37. Copyright@2020 Teddysoft 在不改變程式外在行為的前提之下, 改變程式內部結構以提升設計品質 4
  38. Copyright@2020 Teddysoft Package Class Method Block Statement Variable 作用在不同結構上的重構, 產生不同層次的設計改善 Common program constructs to be coded & refactored • Rename • Introduce Assertion • Extract Method • Move Method • Extract Class • Form Template Method • Separate Domain from Presentation
  39. Copyright@2020 Teddysoft 程式結構有大有小, 重構亦然
  40. Copyright@2020 Teddysoft 在不改變程式外在行為的前提之下, 改變程式內部結構以提升設計品質 5
  41. Copyright@2019 Teddysoft 確定所有測試 都通過 發現怪味道 決定如何簡化 簡化程式 (重構) 確定所有測試 都依舊通過
  42. • Dispensable – Comments, Duplicated Code, Lazy Class, Data Class, Speculative Generality • Bloater – Long Method, Long Parameter List, Large Class, Data Clumps, Primitive Obsession • OO Abuser – Switch Statement Repeated Switches, Temporary Field, Alternative Classes with Different Interfaces, Refused Bequest • Coupler – Feature Envy, Message Chains, Middle Man, Inappropriate Intimacy, Incomplete Library Class • Change Preventer – Divergent Change, Shotgun Surgery, Parallel Inheritance Hierarchies Copyright@2020 Teddysoft
  43. Copyright@2020 Teddysoft Parameter Object
  44. Copyright@2020 Teddysoft
  45. Copyright@2020 Teddysoft
  46. Copyright@2020 Teddysoft
  47. Copyright@2020 Teddysoft 在不改變程式外在行為的前提之下, 改變程式內部結構以提升設計品質 6
  48. A change made to the internal structure of software to make it easier to understand and cheaper to modify without changing its observable behavior. 較易理解,較低修改成本 Copyright@2020 Teddysoft
  49. Understandability Modifiability Low Coupling High Cohesion OO Concept OO Principle Design Pattern Architecture ⚫ Abstraction ⚫ Information hiding ⚫ Polymorphism ⚫ Responsibility assignment ⚫ Indirection ⚫ Separation of concerns ⚫ Program to an interface, not an implementation ⚫ Favor object composition over class inheritance ⚫ Single-responsibility ⚫ Open-closed ⚫ Liskov substitution ⚫ Interface-segregation ⚫ Dependency-inversion ⚫ Don't repeat yourself, Single choice, One and only once Copyright@2020 Teddysoft
  50. Copyright@2020 Teddysoft 重構有大有小, 重構目標亦然
  51. Copyright@2020 Teddysoft
  52. 民意調查: 重構是一種模式(Pattern)嗎? Copyright@2020 Teddysoft
  53. • 設計模式 – Singleton, Command, Proxy, Adapter, Model- View-Controller, etc. • 重構 – Rename, Introduce Assertion, Extract Method, Move Method, Extract Class, Form Template Method, Separate Domain from Presentation, etc. Copyright@2020 Teddysoft
  54. • 名詞片語 (Noun-phrase) – 描述模式所建立或產生的結果 – 例子:Singleton, Command, Model-View- Controller • 動詞片語 (Verb-phrase) – 給定一個指令,描述如何達到模式解決方案所要 求的狀態 – 例子:Don’t Talk to Strangers, Separate Material Preparation from Integration Copyright@2020 Teddysoft
  55. Copyright@2020 Teddysoft Source:《The Timeless Way of Building》 http://goo.gl/tS13cE
  56. 思考問題2: 如果重構是一種模式,為什麼重構用動詞而 不像大部份設計模式採用名詞? Copyright@2020 Teddysoft Rename VS Intention Revealing Names
  57. • Make you instant expert • Eliminate the need for intelligence and taste • Eliminate the need to think • Tell you how exactly how to adapt the solution to your context Copyright@2020 Teddysoft Source: Asian PLoP 2016 by Joseph Yoder and Rebecca Wirfs-Brock
  58. Copyright@2020 Teddysoft 重構 相反重構 Extract Method Inline Method Add Parameter Remove Parameter Collapse Hierarchy Extract Superclass, Extract Subclass Extract Class Inline Class Hide Delegate Remove Middle Man Pull Up Field Push Down Field Replace Inheritance with Delegation Replace Delegation with Inheritance
  59. Copyright@2020 Teddysoft Source: 電影《星際大戰第四集》
  60. Copyright@2020 Teddysoft 設計就是決定Context與Form的邊界 Source:《Notes on the Synthesis of Form》 Context Before MachineProblem force force Worl d Resulting Context Solution force force force After force
  61. Copyright@2020 Teddysoft
  62. Copyright@2020 Teddysoft
  63. Copyright@2020 Teddysoft 重構是一種模式, 套用模式要觀察 Context與Forces
  64. Copyright@2020 Teddysoft
  65. Copyright@2020 Teddysoft
  66. Copyright@2020 Teddysoft
  67. Copyright@2020 Teddysoft Top-down Bottom-up
  68. • OOAD (傳統模式) – Code-First – Top-down • TDD (原始模式) – Test-First – Bottom-up Copyright@2020 Teddysoft
  69. Copyright@2020 Teddysoft Domain Model Design Model Implementation Model Refactoring After ImplementationUse Case Model
  70. Copyright@2020 Teddysoft Design Model Implementation Model After Implementation Refactoring Test & Code OOAD TDD Domain Model Use Case Model Most design happens here Refactoring https://goo.gl/8AZQUQ
  71. Copyright@2020 Teddysoft https://goo.gl/8AZQUQ
  72. Copyright@2020 Teddysoft
  73. Copyright@2020 Teddysoft Source:《Test-Driven Development》
  74. Design Model Copyright@2020 Teddysoft Implementation Model After Implementation Refactoring Test & Code OOAD BDD/SBE + TDD Test cases as specification Domain Model Use Case Model Most design happens here Refactoring
  75. Design Model Copyright@2020 Teddysoft Implementation Model After Implementation Refactoring Test & Code OOAD TDD Test cases as specification Domain Model Use Case Model Domain Model DDD can help. Design happens here And design happens here Refactoring
  76. 思考問題3: DDD+BDD/SBE+TDD之後,傳統bottom- up形式的test-first開發,還算是bottom- up嗎? Copyright@2020 Teddysoft
  77. Copyright@2020 Teddysoft Source:《禪的世界01--冥想》
  78. Copyright@2020 Teddysoft Source:《禪的世界01--冥想》
  79. Copyright@2020 Teddysoft
  80. Copyright@2020 Teddysoft 部分的加總不等於 全部,體驗整體的 感覺有其必要性
  81. Copyright@2020 Teddysoft
  82. Copyright@2020 Teddysoft CreateBoardController CreateBoardUseCase Board BoardRepository Middle Man?
  83. Copyright@2020 Teddysoft CreateBoardController CreateBoardUseCase Board BoardRepository Middle Man? 《Clean Architecture》
  84. All problems in computer science can be solved by another level of indirection Copyright@2020 Teddysoft by David Wheeler
  85. Copyright@2020 Teddysoft
  86. Copyright@2020 Teddysoft
  87. Copyright@2020 Teddysoft
  88. Copyright@2020 Teddysoft public record Person (String name, String address) {}
  89. Copyright@2020 Teddysoft Package by Layer Package by Feature
  90. Copyright@2020 Teddysoft 1. Card 2. Work Item 3. Task 4. Ticket 哪個名字好?
  91. Copyright@2020 Teddysoft
  92. Copyright@2020 Teddysoft
  93. • 程式結構有大有小,重構亦然。 • 重構是一種模式,套用模式要觀察Context 與Forces。 • 設計是一種由上而下的過程,部分的加總不 等於全部,先體驗整體的感覺有其必要性。 – 事後諸葛亮,事前豬一樣 VS 事前諸葛亮 Copyright@2020 Teddysoft
  94. • 搞笑談軟工部落格 – http://teddy-chen-tw.blogspot.com • 搞笑談軟工Facebook – https://www.facebook.com/groups/teddy.tw • 泰迪軟體官方網站 – http://teddysoft.tw Copyright@2020 Teddysoft
Advertisement