$30 off During Our Annual Pro Sale. View Details »

Go Ahead, Make a Mess - Sandi Metz

Sandi Metz
September 15, 2012

Go Ahead, Make a Mess - Sandi Metz

This talk shows how to use Object-Oriented Design to create the best kinds of messes, those that let you get software out the door today without regretting your actions tomorrow.

This is the 45 minute version, given at GoGaRuCo, Sept. 15 2012.

Sandi Metz

September 15, 2012
Tweet

More Decks by Sandi Metz

Other Decks in Programming

Transcript

  1. @sandimetz Sept 2012
    Go Ahead
    Make a Mess
    Sandi Metz
    1
    Friday, September 14, 2012

    View Slide

  2. @sandimetz Sept 2012
    Life Cycle
    of a
    Rails Project
    2
    Friday, September 14, 2012

    View Slide

  3. @sandimetz Sept 2012
    Start Beta 1.0 2.0 Today
    Satisfaction
    Timeline
    3
    Friday, September 14, 2012

    View Slide

  4. @sandimetz Sept 2012
    Start Beta 1.0 2.0 Today
    Satisfaction
    Timeline
    4
    Friday, September 14, 2012

    View Slide

  5. @sandimetz Sept 2012
    Satisfaction
    5
    Friday, September 14, 2012

    View Slide

  6. @sandimetz Sept 2012
    Satisfaction
    Those who cannot remember the past
    are condemned to repeat it.
    5
    Friday, September 14, 2012

    View Slide

  7. @sandimetz Sept 2012
    6
    Friday, September 14, 2012

    View Slide

  8. @sandimetz Sept 2012
    Satisfaction
    7
    Friday, September 14, 2012

    View Slide

  9. @sandimetz Sept 2012
    The Mess
    8
    Friday, September 14, 2012

    View Slide

  10. @sandimetz Sept 2012
    9
    Friday, September 14, 2012

    View Slide

  11. 10
    Friday, September 14, 2012

    View Slide

  12. @sandimetz Sept 2012
    Knowledge
    11
    Friday, September 14, 2012

    View Slide

  13. 12
    Friday, September 14, 2012

    View Slide

  14. 13
    Friday, September 14, 2012

    View Slide

  15. @sandimetz Sept 2012
    Dependencies
    14
    Friday, September 14, 2012

    View Slide

  16. 15
    Friday, September 14, 2012

    View Slide

  17. 16
    Friday, September 14, 2012

    View Slide

  18. @sandimetz Sept 2012
    Stability
    17
    Friday, September 14, 2012

    View Slide

  19. 18
    Friday, September 14, 2012

    View Slide

  20. 19
    Friday, September 14, 2012

    View Slide

  21. 20
    Friday, September 14, 2012

    View Slide

  22. @sandimetz Sept 2012
    Hope
    21
    Friday, September 14, 2012

    View Slide

  23. 22
    Friday, September 14, 2012

    View Slide

  24. @sandimetz Sept 2012
    Start Beta 1.0 2.0 Today
    Satisfaction
    Timeline
    23
    Friday, September 14, 2012

    View Slide

  25. @sandimetz Sept 2012
    Object-Oriented Design
    Stop worrying
    and
    learn to love the mess
    24
    Friday, September 14, 2012

    View Slide

  26. 25
    Friday, September 14, 2012

    View Slide

  27. Label the Knowledge
    26
    Friday, September 14, 2012

    View Slide

  28. Label the Knowledge
    Complicate the Code
    27
    Friday, September 14, 2012

    View Slide

  29. Label the Knowledge
    Complicate the Code
    Isolate the Instability
    28
    Friday, September 14, 2012

    View Slide

  30. Label the Knowledge
    Complicate the Code
    Isolate the Instability
    Manage the Mess
    29
    Friday, September 14, 2012

    View Slide

  31. @sandimetz Sept 2012
    Example #1
    Label the Knowledge
    30
    Friday, September 14, 2012

    View Slide

  32. @sandimetz Sept 2012
    Example #1
    class  Game
       def  shock_cost
           Shock.new.cost
       end
    end
    class  Shock
       def  cost
               #  lines  of  messy  math
           #  ...
               #  which  eventually  return
           cost
       end
       
    31
    Friday, September 14, 2012

    View Slide

  33. @sandimetz Sept 2012
    Example #1
    class  Game
       def  shock_cost
           Shock.new.cost
       end
    end
    class  Shock
       def  cost
               #  lines  of  messy  math
           #  ...
               #  which  eventually  return
           cost
       end
       
    31
    Friday, September 14, 2012

    View Slide

  34. @sandimetz Sept 2012
    Example #1
    class  Game
       def  shock_cost
           Shock.new.cost
       end
    end
    class  Shock
       def  cost
               #  lines  of  messy  math
           #  ...
               #  which  eventually  return
           cost
       end
       
    31
    Friday, September 14, 2012

    View Slide

  35. @sandimetz Sept 2012
    Example #1
    class  Game
       def  shock_cost
           Shock.new.cost
       end
    end
    class  Shock
       def  cost
               #  lines  of  messy  math
           #  ...
               #  which  eventually  return
           cost
       end
       
    31
    Friday, September 14, 2012

    View Slide

  36. @sandimetz Sept 2012
    Example #1
    class  Game
       def  shock_cost
           Shock.new.cost
       end
    end
    class  Shock
       def  cost
               #  lines  of  messy  math
           #  ...
               #  which  eventually  return
           cost
       end
       
    31
    Friday, September 14, 2012

    View Slide

  37. @sandimetz Sept 2012
    Example #1
    class  Game
       def  shock_cost
           Shock.new.cost
       end
    end
    class  Shock
       def  cost
               #  lines  of  messy  math
           #  ...
               #  which  eventually  return
           cost
       end
       
    MESS
    31
    Friday, September 14, 2012

    View Slide

  38. @sandimetz Sept 2012
    Example #1
    class  Game
       def  shock_cost
           Shock.new.cost
       end
    end
    class  Shock
       def  cost
               #  lines  of  messy  math
           #  ...
               #  which  eventually  return
           cost
       end
       
    Omega Mess
    31
    Friday, September 14, 2012

    View Slide

  39. 32
    Friday, September 14, 2012

    View Slide

  40. Omega Mess
    32
    Friday, September 14, 2012

    View Slide

  41. Omega Mess
    End of the Line
    32
    Friday, September 14, 2012

    View Slide

  42. Omega Mess
    End of the Line
    No Dependencies
    32
    Friday, September 14, 2012

    View Slide

  43. Omega Mess
    End of the Line
    No Dependencies
    No Dependents
    32
    Friday, September 14, 2012

    View Slide

  44. @sandimetz Sept 2012
    33
    Friday, September 14, 2012

    View Slide

  45. @sandimetz Sept 2012
    33
    Friday, September 14, 2012

    View Slide

  46. @sandimetz Sept 2012
    33
    Friday, September 14, 2012

    View Slide

  47. @sandimetz Sept 2012
    33
    Friday, September 14, 2012

    View Slide

  48. @sandimetz Sept 2012
    33
    Friday, September 14, 2012

    View Slide

  49. @sandimetz Sept 2012
    33
    Friday, September 14, 2012

    View Slide

  50. @sandimetz Sept 2012
    33
    Friday, September 14, 2012

    View Slide

  51. @sandimetz Sept 2012
    34
    Friday, September 14, 2012

    View Slide

  52. @sandimetz Sept 2012
    Knowledge Stability
    34
    Friday, September 14, 2012

    View Slide

  53. @sandimetz Sept 2012
    External
    Knowledge Stability
    34
    Friday, September 14, 2012

    View Slide

  54. @sandimetz Sept 2012
    Internal
    External
    Knowledge Stability
    34
    Friday, September 14, 2012

    View Slide

  55. @sandimetz Sept 2012
    Internal
    External
    Knowledge Stability Low
    High
    34
    Friday, September 14, 2012

    View Slide

  56. @sandimetz Sept 2012
    Internal
    External
    Knowledge Stability Low
    High
    34
    Friday, September 14, 2012

    View Slide

  57. @sandimetz Sept 2012
    Internal
    External
    Knowledge Stability Low
    High
    34
    Friday, September 14, 2012

    View Slide

  58. @sandimetz Sept 2012
    Internal
    External
    Knowledge Stability Low
    High
    34
    Friday, September 14, 2012

    View Slide

  59. @sandimetz Sept 2012
    Internal
    External
    Knowledge Stability Low
    High
    34
    Friday, September 14, 2012

    View Slide

  60. @sandimetz Sept 2012
    Internal
    External
    Knowledge Stability Low
    High
    34
    Friday, September 14, 2012

    View Slide

  61. @sandimetz Sept 2012
    Internal
    External
    Knowledge Stability Low
    High
    34
    Friday, September 14, 2012

    View Slide

  62. @sandimetz Sept 2012
    Dependencies
    Shock
    35
    Friday, September 14, 2012

    View Slide

  63. @sandimetz Sept 2012
    Dependencies
    Shock
    Game
    35
    Friday, September 14, 2012

    View Slide

  64. @sandimetz Sept 2012
    36
    Friday, September 14, 2012

    View Slide

  65. @sandimetz Sept 2012
    Omega
    36
    Friday, September 14, 2012

    View Slide

  66. @sandimetz Sept 2012
    Omega
    36
    Friday, September 14, 2012

    View Slide

  67. 37
    Friday, September 14, 2012

    View Slide

  68. Omega Mess
    37
    Friday, September 14, 2012

    View Slide

  69. Omega Mess
    Hides behind
    the message
    37
    Friday, September 14, 2012

    View Slide

  70. @sandimetz Sept 2012
    class  Game
       def  shock_cost
           Shock.new.cost
       end
    end
    class  Shock
       def  cost
               #  lines  of  messy  math
               #  ...
               #  which  eventually  return
           cost
       end
       
    end
    Example #1
    38
    Friday, September 14, 2012

    View Slide

  71. @sandimetz Sept 2012
    class  Game
       def  shock_cost
           Shock.new.cost
       end
    end
    class  Shock
       def  cost
               #  lines  of  messy  math
               #  ...
               #  which  eventually  return
           cost
       end
       
    end
    It’s not about
    the code
    Example #1
    38
    Friday, September 14, 2012

    View Slide

  72. @sandimetz Sept 2012
    39
    Friday, September 14, 2012

    View Slide

  73. @sandimetz Sept 2012
    It’s about
    the message
    39
    Friday, September 14, 2012

    View Slide

  74. 40
    Friday, September 14, 2012

    View Slide

  75. 41
    Friday, September 14, 2012

    View Slide

  76. Interlude
    42
    Friday, September 14, 2012

    View Slide

  77. @sandimetz Sept 2012
    Knowledge Plot
    Stable Unstable
    Within My Purpose
    Outside of My Purpose
    43
    Friday, September 14, 2012

    View Slide

  78. @sandimetz Sept 2012
    Knowledge Plot
    Stable Unstable
    Within My Purpose
    Outside of My Purpose
    43
    Friday, September 14, 2012

    View Slide

  79. @sandimetz Sept 2012
    Knowledge Plot
    Stable Unstable
    Within My Purpose
    Outside of My Purpose
    43
    Friday, September 14, 2012

    View Slide

  80. @sandimetz Sept 2012
    Knowledge Plot
    Stable Unstable
    Within My Purpose
    Outside of My Purpose
    Public
    API
    43
    Friday, September 14, 2012

    View Slide

  81. @sandimetz Sept 2012
    Knowledge Plot
    Stable Unstable
    Within My Purpose
    Outside of My Purpose
    Public
    API
    Private
    Behavior
    43
    Friday, September 14, 2012

    View Slide

  82. @sandimetz Sept 2012
    Knowledge Plot
    Stable Unstable
    Within My Purpose
    Outside of My Purpose
    Public
    API
    Private
    Behavior
    Dependencies
    43
    Friday, September 14, 2012

    View Slide

  83. @sandimetz Sept 2012
    Knowledge Plot
    Stable Unstable
    Within My Purpose
    Outside of My Purpose
    Public
    API
    Private
    Behavior
    Dependencies
    Expose
    43
    Friday, September 14, 2012

    View Slide

  84. @sandimetz Sept 2012
    Knowledge Plot
    Stable Unstable
    Within My Purpose
    Outside of My Purpose
    Public
    API
    Private
    Behavior
    Dependencies
    Expose Hide
    43
    Friday, September 14, 2012

    View Slide

  85. @sandimetz Sept 2012
    Knowledge Plot
    Stable Unstable
    Within My Purpose
    Outside of My Purpose
    Public
    API
    Private
    Behavior
    Dependencies
    Expose Hide
    Minimize
    43
    Friday, September 14, 2012

    View Slide

  86. @sandimetz Sept 2012
    Knowledge Plot
    Stable Unstable
    Within My Purpose
    Outside of My Purpose
    Public
    API
    Private
    Behavior
    Dependencies
    Expose Hide
    Minimize Move
    43
    Friday, September 14, 2012

    View Slide

  87. @sandimetz Sept 2012
    Knowledge
    Shock knows
    1. cost method
    2. cost calculation
    Game depends on
    3. cost message
    4. Shock class name
    5. cost receiver
    44
    Friday, September 14, 2012

    View Slide

  88. @sandimetz Sept 2012
    Knowledge
    Shock knows
    1. cost method
    2. cost calculation
    Game depends on
    3. cost message
    4. Shock class name
    5. cost receiver
    44
    Friday, September 14, 2012

    View Slide

  89. @sandimetz Sept 2012
    Knowledge
    Shock knows
    1. cost method
    2. cost calculation
    Game depends on
    3. cost message
    4. Shock class name
    5. cost receiver
    44
    Friday, September 14, 2012

    View Slide

  90. @sandimetz Sept 2012
    Knowledge
    Shock knows
    1. cost method
    2. cost calculation
    Game depends on
    3. cost message
    4. Shock class name
    5. cost receiver
    45
    Friday, September 14, 2012

    View Slide

  91. @sandimetz Sept 2012
    Knowledge Plot
    Stable Unstable
    Within My Purpose
    Outside of My Purpose
    Expose Hide
    Minimize Move
    46
    Friday, September 14, 2012

    View Slide

  92. @sandimetz Sept 2012
    Knowledge Plot
    Stable Unstable
    Within My Purpose
    Outside of My Purpose
    Expose Hide
    Minimize Move
    1
    46
    Friday, September 14, 2012

    View Slide

  93. @sandimetz Sept 2012
    Knowledge
    Shock knows
    1. cost method (expose)
    2. cost calculation
    Game depends on
    3. cost message
    4. Shock class name
    5. cost receiver
    47
    Friday, September 14, 2012

    View Slide

  94. @sandimetz Sept 2012
    Knowledge
    Shock knows
    1. cost method (expose)
    2. cost calculation
    Game depends on
    3. cost message
    4. Shock class name
    5. cost receiver
    47
    Friday, September 14, 2012

    View Slide

  95. @sandimetz Sept 2012
    Knowledge Plot
    Stable Unstable
    Within My Purpose
    Outside of My Purpose
    Expose Hide
    Minimize Move
    1
    48
    Friday, September 14, 2012

    View Slide

  96. @sandimetz Sept 2012
    Knowledge Plot
    Stable Unstable
    Within My Purpose
    Outside of My Purpose
    Expose Hide
    Minimize Move
    1
    2
    48
    Friday, September 14, 2012

    View Slide

  97. @sandimetz Sept 2012
    Knowledge
    Shock knows
    1. cost method (expose)
    2. cost calculation (hide)
    Game depends on
    3. cost message
    4. Shock class name
    5. cost receiver
    49
    Friday, September 14, 2012

    View Slide

  98. @sandimetz Sept 2012
    Knowledge
    Shock knows
    1. cost method (expose)
    2. cost calculation (hide)
    Game depends on
    3. cost message
    4. Shock class name
    5. cost receiver
    49
    Friday, September 14, 2012

    View Slide

  99. @sandimetz Sept 2012
    Knowledge
    Shock knows
    1. cost method (expose)
    2. cost calculation (hide)
    Game depends on
    3. cost message
    4. Shock class name
    5. cost receiver
    49
    Friday, September 14, 2012

    View Slide

  100. @sandimetz Sept 2012
    Knowledge Plot
    Stable Unstable
    Within My Purpose
    Outside of My Purpose
    Expose Hide
    Minimize Move
    50
    Friday, September 14, 2012

    View Slide

  101. @sandimetz Sept 2012
    Knowledge Plot
    Stable Unstable
    Within My Purpose
    Outside of My Purpose
    Expose Hide
    Minimize Move
    3
    50
    Friday, September 14, 2012

    View Slide

  102. @sandimetz Sept 2012
    Knowledge
    Shock knows
    1. cost method
    2. cost calculation
    Game depends on
    3. cost message (minimize)
    4. Shock class name
    5. cost receiver
    51
    Friday, September 14, 2012

    View Slide

  103. @sandimetz Sept 2012
    Knowledge
    Shock knows
    1. cost method
    2. cost calculation
    Game depends on
    3. cost message (minimize)
    4. Shock class name
    5. cost receiver
    51
    Friday, September 14, 2012

    View Slide

  104. @sandimetz Sept 2012
    Knowledge Plot
    Stable Unstable
    Within My Purpose
    Outside of My Purpose
    Expose Hide
    Minimize Move
    3
    52
    Friday, September 14, 2012

    View Slide

  105. @sandimetz Sept 2012
    Knowledge Plot
    Stable Unstable
    Within My Purpose
    Outside of My Purpose
    Expose Hide
    Minimize Move
    4 5
    3
    52
    Friday, September 14, 2012

    View Slide

  106. @sandimetz Sept 2012
    Knowledge Plot
    Stable Unstable
    Within My Purpose
    Outside of My Purpose
    Expose Hide
    Minimize Move
    4 5
    3
    52
    Friday, September 14, 2012

    View Slide

  107. @sandimetz Sept 2012
    Knowledge Plot
    Stable Unstable
    Within My Purpose
    Outside of My Purpose
    Expose Hide
    ?
    Minimize Move
    4 5
    3
    52
    Friday, September 14, 2012

    View Slide

  108. @sandimetz Sept 2012
    Knowledge
    Shock knows
    1. cost method
    2. cost calculation
    Game depends on
    3. cost message (minimize)
    4. Shock class name
    5. cost receiver
    ???
    53
    Friday, September 14, 2012

    View Slide

  109. @sandimetz Sept 2012
    class  Game
       def  shock_cost
           Shock.new.cost
       end
    end
    class  Shock
       def  cost
               #  lines  of  messy  math
               #  ...
               #  which  eventually  return
           cost
       end
       
    end
    Example #1
    54
    Friday, September 14, 2012

    View Slide

  110. @sandimetz Sept 2012
    What is the
    future cost of
    doing nothing
    now?
    55
    Friday, September 14, 2012

    View Slide

  111. @sandimetz Sept 2012
    class  Game
       def  shock_cost
           Shock.new.cost
       end
    end
    class  Shock
       def  cost
               #  lines  of  messy  math
               #  ...
               #  which  eventually  return
           cost
       end
       
    end
    Example #1
    56
    Friday, September 14, 2012

    View Slide

  112. @sandimetz Sept 2012
    class  Game
       def  shock_cost
           Shock.new.cost
       end
    end
    class  Shock
       def  cost
               #  lines  of  messy  math
               #  ...
               #  which  eventually  return
           cost
       end
       
    end
    I would inject this dependency
    Example #1
    56
    Friday, September 14, 2012

    View Slide

  113. @sandimetz Sept 2012
    class  Game
       def  shock_cost
           Shock.new.cost
       end
    end
    class  Shock
       def  cost
               #  lines  of  messy  math
               #  ...
               #  which  eventually  return
           cost
       end
       
    end
    I would inject this dependency
    I would neaten this mess
    Example #1
    56
    Friday, September 14, 2012

    View Slide

  114. @sandimetz Sept 2012
    class  Game
       def  shock_cost
           Shock.new.cost
       end
    end
    class  Shock
       def  cost
               #  lines  of  messy  math
               #  ...
               #  which  eventually  return
           cost
       end
       
    end
    I would inject this dependency
    I would neaten this mess
    You might not
    Example #1
    56
    Friday, September 14, 2012

    View Slide

  115. 57
    Friday, September 14, 2012

    View Slide

  116. 58
    Friday, September 14, 2012

    View Slide

  117. @sandimetz Sept 2012
    Example #2
    Complicate the code
    59
    Friday, September 14, 2012

    View Slide

  118. @sandimetz Sept 2012
    Example #2
    Complicate the code
    Shocks vary in cost
    59
    Friday, September 14, 2012

    View Slide

  119. @sandimetz Sept 2012
    Example #2
    class  Game
       def  shock_cost(type)
           Shock.new(type).cost
       end
    end
    60
    Friday, September 14, 2012

    View Slide

  120. @sandimetz Sept 2012
    Example #2
    class  Game
       def  shock_cost(type)
           Shock.new(type).cost
       end
    end
    60
    Friday, September 14, 2012

    View Slide

  121. @sandimetz Sept 2012
    Example #2
    class  Game
       def  shock_cost(type)
           Shock.new(type).cost
       end
    end
    60
    Friday, September 14, 2012

    View Slide

  122. @sandimetz Sept 2012
    Example #2
    class  Shock
       attr_reader  :type
       def  initialize(type)  #  ...
       def  cost
           case  type
           when  :front
               #  the  original  mess
           when  :rear
               #  a  slightly  different  mess
           when  :lefty
               #  another  variant
           else
               #  and  so  on.
           end
       end    
    61
    Friday, September 14, 2012

    View Slide

  123. @sandimetz Sept 2012
    Example #2
    class  Shock
       attr_reader  :type
       def  initialize(type)  #  ...
       def  cost
           case  type
           when  :front
               #  the  original  mess
           when  :rear
               #  a  slightly  different  mess
           when  :lefty
               #  another  variant
           else
               #  and  so  on.
           end
       end    
    61
    Friday, September 14, 2012

    View Slide

  124. @sandimetz Sept 2012
    Example #2
    class  Shock
       attr_reader  :type
       def  initialize(type)  #  ...
       def  cost
           case  type
           when  :front
               #  the  original  mess
           when  :rear
               #  a  slightly  different  mess
           when  :lefty
               #  another  variant
           else
               #  and  so  on.
           end
       end    
    61
    Friday, September 14, 2012

    View Slide

  125. @sandimetz Sept 2012
    Example #2
    class  Shock
       attr_reader  :type
       def  initialize(type)  #  ...
       def  cost
           case  type
           when  :front
               #  the  original  mess
           when  :rear
               #  a  slightly  different  mess
           when  :lefty
               #  another  variant
           else
               #  and  so  on.
           end
       end    
    61
    Friday, September 14, 2012

    View Slide

  126. @sandimetz Sept 2012
    Example #2
    class  Shock
       attr_reader  :type
       def  initialize(type)  #  ...
       def  cost
           case  type
           when  :front
               #  the  original  mess
           when  :rear
               #  a  slightly  different  mess
           when  :lefty
               #  another  variant
           else
               #  and  so  on.
           end
       end    
    61
    Friday, September 14, 2012

    View Slide

  127. @sandimetz Sept 2012
    62
    Friday, September 14, 2012

    View Slide

  128. @sandimetz Sept 2012
    62
    Friday, September 14, 2012

    View Slide

  129. @sandimetz Sept 2012
    Omega?
    62
    Friday, September 14, 2012

    View Slide

  130. @sandimetz Sept 2012
    Knowledge
    Shock knows
    1. cost method
    2. cost calculation
    3.
    4.
    63
    Friday, September 14, 2012

    View Slide

  131. @sandimetz Sept 2012
    Knowledge
    Shock knows
    1. cost method
    2. cost calculation
    3.
    4.
    63
    Friday, September 14, 2012

    View Slide

  132. @sandimetz Sept 2012
    Knowledge
    Shock knows
    1. cost method
    2. four shock cost calculations
    3. four shock types
    4. which type gets what calculation
    64
    Friday, September 14, 2012

    View Slide

  133. @sandimetz Sept 2012
    Knowledge
    Shock knows
    1. cost method
    2. four shock cost calculations
    3. four shock types
    4. which type gets what calculation
    64
    Friday, September 14, 2012

    View Slide

  134. @sandimetz Sept 2012
    Knowledge
    Shock knows
    1. cost method
    2. four shock cost calculations
    3. four shock types
    4. which type gets what calculation
    64
    Friday, September 14, 2012

    View Slide

  135. @sandimetz Sept 2012
    Knowledge
    Shock knows
    1. cost method
    2. four shock cost calculations
    3. four shock types
    4. which type gets what calculation
    65
    Friday, September 14, 2012

    View Slide

  136. @sandimetz Sept 2012
    Knowledge
    Shock knows
    1. cost method
    2. four shock cost calculations
    3. four shock types
    4. which type gets what calculation
    Omega
    Mess?
    66
    Friday, September 14, 2012

    View Slide

  137. @sandimetz Sept 2012
    Knowledge
    Shock knows
    1. cost method
    2. four shock cost calculations
    3. four shock types
    4. which type gets what calculation
    Omega
    Mess?
    66
    Friday, September 14, 2012

    View Slide

  138. @sandimetz Sept 2012
    Knowledge
    Shock knows
    1. cost method
    2. four shock cost calculations
    3. four shock types
    4. which type gets what calculation
    Meta
    Knowledge
    67
    Friday, September 14, 2012

    View Slide

  139. 68
    Friday, September 14, 2012

    View Slide

  140. Meta Knowledge
    68
    Friday, September 14, 2012

    View Slide

  141. Meta Knowledge
    Knowledge
    about
    Knowledge
    68
    Friday, September 14, 2012

    View Slide

  142. 69
    Friday, September 14, 2012

    View Slide

  143. Meta Knowledge
    69
    Friday, September 14, 2012

    View Slide

  144. Meta Knowledge
    The
    Domain of
    Design
    69
    Friday, September 14, 2012

    View Slide

  145. 70
    Friday, September 14, 2012

    View Slide

  146. Interlude
    71
    Friday, September 14, 2012

    View Slide

  147. @sandimetz Sept 2012
    Knowledge
    Shock knows
    1. cost method
    2. four shock cost calculations
    3. four shock types
    4. which type gets what calculation
    72
    Friday, September 14, 2012

    View Slide

  148. @sandimetz Sept 2012
    Knowledge
    Shock knows
    1. cost method
    2. four shock cost calculations
    3. four shock types
    4. which type gets what calculation
    72
    Friday, September 14, 2012

    View Slide

  149. @sandimetz Sept 2012
    Knowledge
    Shock knows
    1. cost method
    2. four shock cost calculations
    3. four shock types
    4. which type gets what calculation
    72
    Friday, September 14, 2012

    View Slide

  150. @sandimetz Sept 2012
    Knowledge Plot
    Stable Unstable
    Within My Purpose
    Outside of My Purpose
    Expose Hide
    Minimize Move
    2
    73
    Friday, September 14, 2012

    View Slide

  151. @sandimetz Sept 2012
    Knowledge Plot
    Stable Unstable
    Within My Purpose
    Outside of My Purpose
    Expose Hide
    Minimize Move
    2
    73
    Friday, September 14, 2012

    View Slide

  152. @sandimetz Sept 2012
    Knowledge
    Shock knows
    1. cost method
    2. four shock cost calculations (move)
    3. four shock types
    4. which type gets what calculation
    74
    Friday, September 14, 2012

    View Slide

  153. @sandimetz Sept 2012
    Knowledge
    Shock knows
    1. cost method
    2. four shock cost calculations (move)
    3. four shock types
    4. which type gets what calculation
    74
    Friday, September 14, 2012

    View Slide

  154. @sandimetz Sept 2012
    Knowledge Plot
    Stable Unstable
    Within My Purpose
    Outside of My Purpose
    Expose Hide
    Minimize Move
    75
    Friday, September 14, 2012

    View Slide

  155. @sandimetz Sept 2012
    Knowledge Plot
    Stable Unstable
    Within My Purpose
    Outside of My Purpose
    Expose Hide
    Minimize Move
    3
    75
    Friday, September 14, 2012

    View Slide

  156. @sandimetz Sept 2012
    Knowledge
    Shock knows
    1. cost method
    2. four shock cost calculations (move)
    3. four shock types (move)
    4. which type gets what calculation
    76
    Friday, September 14, 2012

    View Slide

  157. @sandimetz Sept 2012
    Knowledge
    Shock knows
    1. cost method
    2. four shock cost calculations (move)
    3. four shock types (move)
    4. which type gets what calculation
    76
    Friday, September 14, 2012

    View Slide

  158. @sandimetz Sept 2012
    Knowledge Plot
    Stable Unstable
    Within My Purpose
    Outside of My Purpose
    Expose Hide
    Minimize Move
    77
    Friday, September 14, 2012

    View Slide

  159. @sandimetz Sept 2012
    Knowledge Plot
    Stable Unstable
    Within My Purpose
    Outside of My Purpose
    Expose Hide
    Minimize Move
    4
    77
    Friday, September 14, 2012

    View Slide

  160. @sandimetz Sept 2012
    Knowledge
    Shock knows
    1. cost method
    2. four shock cost calculations (move)
    3. four shock types (move)
    4. which type gets what calculation (min)
    78
    Friday, September 14, 2012

    View Slide

  161. @sandimetz Sept 2012
    Preference
    79
    Friday, September 14, 2012

    View Slide

  162. @sandimetz Sept 2012
    Preference
    Send a message
    79
    Friday, September 14, 2012

    View Slide

  163. @sandimetz Sept 2012
    Preference
    Send a message
    rather than
    implement behavior
    79
    Friday, September 14, 2012

    View Slide

  164. @sandimetz Sept 2012
    Move it
    80
    Friday, September 14, 2012

    View Slide

  165. @sandimetz Sept 2012
    Move it
    Find the message
    80
    Friday, September 14, 2012

    View Slide

  166. @sandimetz Sept 2012
    Move it
    Find the message
    (Create the object)
    80
    Friday, September 14, 2012

    View Slide

  167. @sandimetz Sept 2012
    Move it
    Find the message
    (Create the object)
    Send the message
    80
    Friday, September 14, 2012

    View Slide

  168. 81
    Friday, September 14, 2012

    View Slide

  169. @sandimetz Sept 2012
    Example #3
    Composition
    82
    Friday, September 14, 2012

    View Slide

  170. @sandimetz Sept 2012
    #3 Composition
       def  cost
           case  type
           when  :front
               #  the  original  mess
           when  :rear
               #  a  slightly  different  mess
           when  :lefty
               #  another  variant
           else
               #  and  so  on.
           end
       end
    83
    Friday, September 14, 2012

    View Slide

  171. @sandimetz Sept 2012
    #3 Composition
       def  cost
           case  type
           when  :front
               #  the  original  mess
           when  :rear
               #  a  slightly  different  mess
           when  :lefty
               #  another  variant
           else
               #  and  so  on.
           end
       end
    83
    Friday, September 14, 2012

    View Slide

  172. @sandimetz Sept 2012
    #3 Composition
       def  cost
           case  type
           when  :front
               #  the  original  mess
           when  :rear
               #  a  slightly  different  mess
           when  :lefty
               #  another  variant
           else
               #  and  so  on.
           end
       end
    83
    Friday, September 14, 2012

    View Slide

  173. @sandimetz Sept 2012
    #3 Composition
       def  cost
           case  type
           when  :front
               #  the  original  mess
           when  :rear
               #  a  slightly  different  mess
           when  :lefty
               #  another  variant
           else
               #  and  so  on.
           end
       end
    What’s the message?
    83
    Friday, September 14, 2012

    View Slide

  174. @sandimetz Sept 2012
    #3 Composition
       def  cost
           case  type
           when  :front
               someObligingObj.compute
           when  :rear
               #  a  slightly  different  mess
           when  :lefty
               #  another  variant
           else
               #  and  so  on.
           end
       end
    84
    Friday, September 14, 2012

    View Slide

  175. @sandimetz Sept 2012
    #3 Composition
       def  cost
           case  type
           when  :front
               someObligingObj.compute
           when  :rear
               #  a  slightly  different  mess
           when  :lefty
               #  another  variant
           else
               #  and  so  on.
           end
       end
    ???
    84
    Friday, September 14, 2012

    View Slide

  176. @sandimetz Sept 2012
       def  cost
           case  type
           when  :front
               #  the  original  mess
           when  :rear
               #  a  slightly  different  mess
           when  :lefty
               #  another  variant
           else
               #  and  so  on.
           end
       end
    #3 Composition
    class  FrontShockCost
       def  compute
           #  the  original  mess
       end
    end
    85
    Friday, September 14, 2012

    View Slide

  177. @sandimetz Sept 2012
       def  cost
           case  type
           when  :front
               #  the  original  mess
           when  :rear
               #  a  slightly  different  mess
           when  :lefty
               #  another  variant
           else
               #  and  so  on.
           end
       end
    #3 Composition
    class  FrontShockCost
       def  compute
           #  the  original  mess
       end
    end
    85
    Friday, September 14, 2012

    View Slide

  178. @sandimetz Sept 2012
       def  cost
           case  type
           when  :front
               #  the  original  mess
           when  :rear
               #  a  slightly  different  mess
           when  :lefty
               #  another  variant
           else
               #  and  so  on.
           end
       end
    #3 Composition
    class  FrontShockCost
       def  compute
           #  the  original  mess
       end
    end
    Hide the
    Mess
    85
    Friday, September 14, 2012

    View Slide

  179. @sandimetz Sept 2012
       def  cost
           case  type
           when  :front
               FrontShockCost.new.compute
           when  :rear
               #  a  slightly  different  mess
           when  :lefty
               #  another  variant
           else
               #  and  so  on.
           end
       end
    #3 Composition
    class  FrontShockCost
       def  compute
           #  the  original  mess
       end
    end
    86
    Friday, September 14, 2012

    View Slide

  180. @sandimetz Sept 2012
       def  cost
           case  type
           when  :front
               FrontShockCost.new.compute
           when  :rear
               #  a  slightly  different  mess
           when  :lefty
               #  another  variant
           else
               #  and  so  on.
           end
       end
    #3 Composition
    class  FrontShockCost
       def  compute
           #  the  original  mess
       end
    end
    Send the
    Message
    86
    Friday, September 14, 2012

    View Slide

  181. @sandimetz Sept 2012
       def  cost
           case  type
           when  :front
               #  the  original  mess
           when  :rear
               #  a  slightly  different  mess
           when  :lefty
               #  another  variant
           else
               #  and  so  on.
           end
       end
    #3 Composition
    87
    Friday, September 14, 2012

    View Slide

  182. @sandimetz Sept 2012
       def  cost
           case  type
           when  :front
               #  the  original  mess
           when  :rear
               #  a  slightly  different  mess
           when  :lefty
               #  another  variant
           else
               #  and  so  on.
           end
       end
    #3 Composition
    87
    Friday, September 14, 2012

    View Slide

  183. @sandimetz Sept 2012
       def  cost
           case  type
           when  :front
               #  the  original  mess
           when  :rear
               #  a  slightly  different  mess
           when  :lefty
               #  another  variant
           else
               #  and  so  on.
           end
       end
    #3 Composition
    87
    Friday, September 14, 2012

    View Slide

  184. @sandimetz Sept 2012
       def  cost
           case  type
           when  :front
               #  the  original  mess
           when  :rear
               #  a  slightly  different  mess
           when  :lefty
               #  another  variant
           else
               #  and  so  on.
           end
       end
    #3 Composition
    Hide all
    of the
    Messes
    87
    Friday, September 14, 2012

    View Slide

  185. @sandimetz Sept 2012
    #3 Composition
    class  FrontShockCost
       def  compute
           #  the  original  mess
       end
    end
    class  RearShockCost
       def  compute
           #  slightly  changed  mess
       end
    end
    #  etc
    88
    Friday, September 14, 2012

    View Slide

  186. @sandimetz Sept 2012
    #3 Composition
    class  FrontShockCost
       def  compute
           #  the  original  mess
       end
    end
    class  RearShockCost
       def  compute
           #  slightly  changed  mess
       end
    end
    #  etc
    88
    Friday, September 14, 2012

    View Slide

  187. @sandimetz Sept 2012
    #3 Composition
    class  FrontShockCost
       def  compute
           #  the  original  mess
       end
    end
    class  RearShockCost
       def  compute
           #  slightly  changed  mess
       end
    end
    #  etc
    88
    Friday, September 14, 2012

    View Slide

  188. @sandimetz Sept 2012
    #3 Composition
    class  Shock
       def  cost(type)
           case  type
           when  :front
               FrontShockCost.new.compute
           when  :rear
               RearShockCost.new.compute
           when  :lefty
               LeftyShockCost.new.compute
           else
               ShockCost.new.compute
           end
       end
       #  ...
    end
    89
    Friday, September 14, 2012

    View Slide

  189. @sandimetz Sept 2012
    #3 Composition
    class  Shock
       def  cost(type)
           case  type
           when  :front
               FrontShockCost.new.compute
           when  :rear
               RearShockCost.new.compute
           when  :lefty
               LeftyShockCost.new.compute
           else
               ShockCost.new.compute
           end
       end
       #  ...
    end
    Send
    the
    Message
    89
    Friday, September 14, 2012

    View Slide

  190. @sandimetz Sept 2012
    #3 Composition
    class  Shock
       def  cost(type)
           case  type
           when  :front
               FrontShockCost.new.compute
           when  :rear
               RearShockCost.new.compute
           when  :lefty
               LeftyShockCost.new.compute
           else
               ShockCost.new.compute
           end
       end
       #  ...
    end
    90
    Friday, September 14, 2012

    View Slide

  191. @sandimetz Sept 2012
    #3 Composition
    class  Shock
       def  cost(type)
           case  type
           when  :front
               FrontShockCost.new.compute
           when  :rear
               RearShockCost.new.compute
           when  :lefty
               LeftyShockCost.new.compute
           else
               ShockCost.new.compute
           end
       end
       #  ...
    end
    90
    Friday, September 14, 2012

    View Slide

  192. @sandimetz Sept 2012
    #3 Composition
    class  Shock
       def  cost(type)
           case  type
           when  :front
               FrontShockCost.new.compute
           when  :rear
               RearShockCost.new.compute
           when  :lefty
               LeftyShockCost.new.compute
           else
               ShockCost.new.compute
           end
       end
       #  ...
    end
    Really?
    90
    Friday, September 14, 2012

    View Slide

  193. @sandimetz Sept 2012
    Meta Knowledge
    Shock knows
    1. cost method
    2. four shock cost calculations
    3. four shock types
    4. which type gets what calculation
    91
    Friday, September 14, 2012

    View Slide

  194. @sandimetz Sept 2012
    Meta Knowledge
    Shock knows
    1. cost method
    2. four shock cost calculations
    3. four shock types
    4. which type gets what calculation
    91
    Friday, September 14, 2012

    View Slide

  195. @sandimetz Sept 2012
    Meta Knowledge
    Shock knows
    1. cost method
    2. four ShockCostxx classes
    3. four shock types
    4. which type gets what calculation
    92
    Friday, September 14, 2012

    View Slide

  196. @sandimetz Sept 2012
    Meta Knowledge
    Shock knows
    1. cost method
    2. four ShockCostxx classes
    3. four shock types
    4. which type gets what calculation
    93
    Friday, September 14, 2012

    View Slide

  197. @sandimetz Sept 2012
    Meta Knowledge
    Shock knows
    1. cost method
    2. four ShockCostxx classes
    3. four shock types
    4. which type gets what class
    94
    Friday, September 14, 2012

    View Slide

  198. @sandimetz Sept 2012
    Good News
    Calculations are isolated
    95
    Friday, September 14, 2012

    View Slide

  199. @sandimetz Sept 2012
    Bad News
    Still have dependencies
    96
    Friday, September 14, 2012

    View Slide

  200. @sandimetz Sept 2012
    class  Shock
       def  cost(type)
           case  type
           when  :front
               FrontShockCost.new.compute
           when  :rear
               RearShockCost.new.compute
           when  :lefty
               LeftyShockCost.new.compute
           else
               ShockCost.new.compute
           end
       end
       #  ...
    end
    #3 Composition
    97
    Friday, September 14, 2012

    View Slide

  201. @sandimetz Sept 2012
    class  Shock
       def  cost(type)
           case  type
           when  :front
               FrontShockCost.new.compute
           when  :rear
               RearShockCost.new.compute
           when  :lefty
               LeftyShockCost.new.compute
           else
               ShockCost.new.compute
           end
       end
       #  ...
    end
    #3 Composition
    97
    Friday, September 14, 2012

    View Slide

  202. @sandimetz Sept 2012
    class  Shock
       def  cost(type)
           case  type
           when  :front
               FrontShockCost.new.compute
           when  :rear
               RearShockCost.new.compute
           when  :lefty
               LeftyShockCost.new.compute
           else
               ShockCost.new.compute
           end
       end
       #  ...
    end
    when  :front
       FrontShockCost.new.compute
    #3 Composition
    98
    Friday, September 14, 2012

    View Slide

  203. @sandimetz Sept 2012
    class  Shock
       def  cost(type)
           case  type
           when  :front
               FrontShockCost.new.compute
           when  :rear
               RearShockCost.new.compute
           when  :lefty
               LeftyShockCost.new.compute
           else
               ShockCost.new.compute
           end
       end
       #  ...
    end
    when  :foo
       FooShockCost.new.compute
    #3 Composition
    98
    Friday, September 14, 2012

    View Slide

  204. @sandimetz Sept 2012
    class  Shock
       def  cost(type)
           case  type
           when  :front
               FrontShockCost.new.compute
           when  :rear
               RearShockCost.new.compute
           when  :lefty
               LeftyShockCost.new.compute
           else
               ShockCost.new.compute
           end
       end
       #  ...
    end
    when  :foo
       FooShockCost.new.compute
    #3 Composition
    98
    Friday, September 14, 2012

    View Slide

  205. @sandimetz Sept 2012
    class  Shock
       def  cost(type)
           case  type
           when  :front
               FrontShockCost.new.compute
           when  :rear
               RearShockCost.new.compute
           when  :lefty
               LeftyShockCost.new.compute
           else
               ShockCost.new.compute
           end
       end
       #  ...
    end
    when  :foo
       FooShockCost.new.compute
    #3 Composition
    Convention over con guration
    98
    Friday, September 14, 2012

    View Slide

  206. @sandimetz Sept 2012
    class  Shock
       def  cost(type)
           case  type
           when  :front
               FrontShockCost.new.compute
           when  :rear
               RearShockCost.new.compute
           when  :lefty
               LeftyShockCost.new.compute
           else
               ShockCost.new.compute
           end
       end
       #  ...
    end
    when  :foo
       FooShockCost.new.compute
    class_name  =  type.to_s.titleize  +  "ShockCost"
    #3 Composition
    Convention over con guration
    98
    Friday, September 14, 2012

    View Slide

  207. @sandimetz Sept 2012
    class  Shock
       def  cost(type)
           case  type
           when  :front
               FrontShockCost.new.compute
           when  :rear
               RearShockCost.new.compute
           when  :lefty
               LeftyShockCost.new.compute
           else
               ShockCost.new.compute
           end
       end
       #  ...
    end
    class_name  =  type.to_s.titleize  +  "ShockCost"
    eval(class_name).new.compute
    #3 Composition
    Convention over con guration
    when  :foo
       FooShockCost.new.compute
    99
    Friday, September 14, 2012

    View Slide

  208. @sandimetz Sept 2012
    class  Shock
       def  cost(type)
           case  type
           when  :front
               FrontShockCost.new.compute
           when  :rear
               RearShockCost.new.compute
           when  :lefty
               LeftyShockCost.new.compute
           else
               ShockCost.new.compute
           end
       end
       #  ...
    end
    class_name  =  type.to_s.titleize  +  "ShockCost"
    eval(class_name).new.compute
    Object.const_get(class_name).new.compute
    #3 Composition
    Convention over con guration
    when  :foo
       FooShockCost.new.compute
    100
    Friday, September 14, 2012

    View Slide

  209. @sandimetz Sept 2012
    class  Shock
       def  cost(type)
           case  type
           when  :front
               FrontShockCost.new.compute
           when  :rear
               RearShockCost.new.compute
           when  :lefty
               LeftyShockCost.new.compute
           else
               ShockCost.new.compute
           end
       end
       #  ...
    end
    class_name  =  type.to_s.titleize  +  "ShockCost"
    eval(class_name).new.compute
    Object.const_get(class_name).new.compute
    class_name.constantize.new.compute
    #3 Composition
    Convention over con guration
    when  :foo
       FooShockCost.new.compute
    101
    Friday, September 14, 2012

    View Slide

  210. @sandimetz Sept 2012
    Example #3
    class  Shock
       def  cost(type)
         class_name  =  (type.to_s.titleize  +  "ShockCost")
         class_name.constantize.new.compute
       end
    end
    102
    Friday, September 14, 2012

    View Slide

  211. @sandimetz Sept 2012
    Example #3
    class  Shock
       def  cost(type)
         class_name  =  (type.to_s.titleize  +  "ShockCost")
         class_name.constantize.new.compute
       end
    end
    102
    Friday, September 14, 2012

    View Slide

  212. @sandimetz Sept 2012
    Example #3
    class  Shock
       def  cost(type)
         class_name  =  (type.to_s.titleize  +  "ShockCost")
         class_name.constantize.new.compute
       end
    end
    Factory
    102
    Friday, September 14, 2012

    View Slide

  213. @sandimetz Sept 2012
    We
    <3
    Factories
    103
    Friday, September 14, 2012

    View Slide

  214. @sandimetz Sept 2012
    Meta Knowledge
    Shock knows
    1. cost method
    2. four ShockCostxx classes
    3. four shock types
    4. which type gets what class
    104
    Friday, September 14, 2012

    View Slide

  215. @sandimetz Sept 2012
    Meta Knowledge
    Shock knows
    1. cost method
    2. four ShockCostxx classes
    3. four shock types
    4. which type gets what class
    104
    Friday, September 14, 2012

    View Slide

  216. @sandimetz Sept 2012
    Meta Knowledge
    Shock knows
    1. cost method
    2. four ShockCostxx classes
    3. four shock types
    4. which type gets what class
    104
    Friday, September 14, 2012

    View Slide

  217. @sandimetz Sept 2012
    Meta Knowledge
    Shock knows
    1. cost method
    2. four ShockCostxx classes
    3. four shock types
    4. which type gets what class
    104
    Friday, September 14, 2012

    View Slide

  218. @sandimetz Sept 2012
    Meta Knowledge
    Shock knows
    1. cost method
    2. the convention
    105
    Friday, September 14, 2012

    View Slide

  219. @sandimetz Sept 2012
    Before
    #3 Composition
       def  cost
           case  type
           when  :front
               #  the  original  mess
           when  :rear
               #  a  slightly  
               #    different  mess
           when  :lefty
               #  another  variant
           else
               #  and  so  on.
           end
       end
    106
    Friday, September 14, 2012

    View Slide

  220. @sandimetz Sept 2012
    Before
    #3 Composition
       def  cost
           case  type
           when  :front
               #  the  original  mess
           when  :rear
               #  a  slightly  
               #    different  mess
           when  :lefty
               #  another  variant
           else
               #  and  so  on.
           end
       end
    Many changes
    affect this code
    106
    Friday, September 14, 2012

    View Slide

  221. @sandimetz Sept 2012
    After
    Example #3
    class  Shock
       def  cost(type)
         class_name  =  (type.to_s.titleize  +  "ShockCost")
         class_name.constantize.new.compute
       end
    end
    107
    Friday, September 14, 2012

    View Slide

  222. @sandimetz Sept 2012
    After
    Example #3
    class  Shock
       def  cost(type)
           to_class(type).new.compute
       end
       def  to_class(type)
           (type.to_s.titleize  +  "ShockCost").constantize
       end
    end
    108
    Friday, September 14, 2012

    View Slide

  223. @sandimetz Sept 2012
    After
    Example #3
    class  Shock
       def  cost(type)
           to_class(type).new.compute
       end
       def  to_class(type)
           (type.to_s.titleize  +  "ShockCost").constantize
       end
    end
    Few changes
    affect this code
    109
    Friday, September 14, 2012

    View Slide

  224. @sandimetz Sept 2012
    After
    Example #3
    class  FrontShockCost
       def  compute
           #  the  original  mess
       end
    end
    class  Shock
       def  cost(type)
           to_class(type).new.compute
       end
       def  to_class(type)
           (type.to_s.titleize  +  "ShockCost").constantize
       end
    end
    Few changes
    affect this code
    109
    Friday, September 14, 2012

    View Slide

  225. @sandimetz Sept 2012
    After
    Example #3
    class  FrontShockCost
       def  compute
           #  the  original  mess
       end
    end
    class  Shock
       def  cost(type)
           to_class(type).new.compute
       end
       def  to_class(type)
           (type.to_s.titleize  +  "ShockCost").constantize
       end
    end
    class  RearShockCost
       def  compute
           #  slightly  changed  mess
       end
    end
    Few changes
    affect this code
    109
    Friday, September 14, 2012

    View Slide

  226. @sandimetz Sept 2012
    After
    Example #3
    class  FrontShockCost
       def  compute
           #  the  original  mess
       end
    end
    class  Shock
       def  cost(type)
           to_class(type).new.compute
       end
       def  to_class(type)
           (type.to_s.titleize  +  "ShockCost").constantize
       end
    end
    class  RearShockCost
       def  compute
           #  slightly  changed  mess
       end
    end
    Etc...
    Few changes
    affect this code
    109
    Friday, September 14, 2012

    View Slide

  227. @sandimetz Sept 2012
    After
    Example #3
    class  FrontShockCost
       def  compute
           #  the  original  mess
       end
    end
    class  Shock
       def  cost(type)
           to_class(type).new.compute
       end
       def  to_class(type)
           (type.to_s.titleize  +  "ShockCost").constantize
       end
    end
    class  RearShockCost
       def  compute
           #  slightly  changed  mess
       end
    end
    Etc...
    Few changes
    affect this code
    Need a new one?
    Follow the
    convention!
    109
    Friday, September 14, 2012

    View Slide

  228. @sandimetz Sept 2012
    Composition
    110
    Friday, September 14, 2012

    View Slide

  229. @sandimetz Sept 2012
    Shock
    ?
    111
    Friday, September 14, 2012

    View Slide

  230. @sandimetz Sept 2012
    Shock
    111
    Friday, September 14, 2012

    View Slide

  231. @sandimetz Sept 2012
    Shock
    112
    Friday, September 14, 2012

    View Slide

  232. @sandimetz Sept 2012
    Shock
    112
    Friday, September 14, 2012

    View Slide

  233. @sandimetz Sept 2012
    Shock
    113
    Friday, September 14, 2012

    View Slide

  234. @sandimetz Sept 2012
    Shock
    114
    Friday, September 14, 2012

    View Slide

  235. @sandimetz Sept 2012
    Shock
    115
    Friday, September 14, 2012

    View Slide

  236. @sandimetz Sept 2012
    Shock
    115
    Friday, September 14, 2012

    View Slide

  237. @sandimetz Sept 2012
    Shock
    116
    Friday, September 14, 2012

    View Slide

  238. @sandimetz Sept 2012
    Shock
    116
    Friday, September 14, 2012

    View Slide

  239. @sandimetz Sept 2012
    The Role
    117
    Friday, September 14, 2012

    View Slide

  240. @sandimetz Sept 2012
    118
    Friday, September 14, 2012

    View Slide

  241. @sandimetz Sept 2012
    118
    Friday, September 14, 2012

    View Slide

  242. @sandimetz Sept 2012
    Reprise
    Find the message
    (Create the object)
    Send the message
    119
    Friday, September 14, 2012

    View Slide

  243. @sandimetz Sept 2012
    Omega Mess
    120
    Friday, September 14, 2012

    View Slide

  244. @sandimetz Sept 2012
    Omega Mess
    Hide It
    120
    Friday, September 14, 2012

    View Slide

  245. @sandimetz Sept 2012
    Meta Knowledge
    121
    Friday, September 14, 2012

    View Slide

  246. @sandimetz Sept 2012
    Meta Knowledge
    Organize It
    121
    Friday, September 14, 2012

    View Slide

  247. 122
    Friday, September 14, 2012

    View Slide

  248. 123
    Friday, September 14, 2012

    View Slide

  249. 124
    Friday, September 14, 2012

    View Slide

  250. Depend on Stability
    125
    Friday, September 14, 2012

    View Slide

  251. Depend on Stability
    Find the Message
    126
    Friday, September 14, 2012

    View Slide

  252. Isolate Uncertainty
    127
    Friday, September 14, 2012

    View Slide

  253. Isolate Uncertainty
    Hide the Mess
    128
    Friday, September 14, 2012

    View Slide

  254. We Stand on the
    Shoulders of Giants
    129
    Friday, September 14, 2012

    View Slide

  255. 130
    Friday, September 14, 2012

    View Slide

  256. 131
    Friday, September 14, 2012

    View Slide

  257. 132
    Friday, September 14, 2012

    View Slide

  258. 133
    Friday, September 14, 2012

    View Slide

  259. 134
    Friday, September 14, 2012

    View Slide

  260. 135
    Friday, September 14, 2012

    View Slide

  261. Thanks
    Sandi Metz
    136
    Friday, September 14, 2012

    View Slide

  262. http://www.flickr.com/photos/slumadridcampus/5736110401/
    http://www.flickr.com/photos/jennifermarquez/4441957235/
    http://www.flickr.com/photos/58789412@N00/4106497024/
    http://www.flickr.com/photos/27927484@N00/264072199/
    http://www.flickr.com/photos/alexindigo/2572565946/in/photostream/
    http://www.flickr.com/photos/moje_moje/4500967490/
    http://www.flickr.com/photos/dr_nixon/4366089630/
    http://www.flickr.com/photos/question_everything/4778500858/
    http://www.flickr.com/photos/thegforcers/6202236364/in/photostream/
    http://www.flickr.com/photos/jeffhester/2785524078/
    http://www.flickr.com/photos/thegforcers/6040964794/in/photostream/
    http://www.flickr.com/photos/magnus_akselvoll/4741056713/
    http://www.flickr.com/photos/chiotsrun/6553699405/
    http://www.flickr.com/photos/45682148@N05/7943889710/
    http://www.flickr.com/photos/piper/393928412/
    http://www.flickr.com/photos/thegforcers/6202237588/in/photostream/
    http://www.flickr.com/photos/juju2nantes/5895167252/
    Credits
    137
    Friday, September 14, 2012

    View Slide

  263. http://www.flickr.com/photos/harlequeen/3323992902/
    http://www.flickr.com/photos/thegforcers/6114852991/in/photostream/
    http://www.flickr.com/photos/qatarperegrine/5040119481/
    http://www.flickr.com/photos/reneeanddolan/6152499201/
    http://www.flickr.com/photos/tchelseat/7628965564/
    http://www.flickr.com/photos/clappstar/1064543301/
    http://www.flickr.com/photos/nycarthur/2482218423/
    http://www.flickr.com/photos/oliverlaumann/5525877007/
    http://www.websequencediagrams.com/
    Credits
    138
    Friday, September 14, 2012

    View Slide

  264. http://bit.ly/
    poodr-combo
    139
    Friday, September 14, 2012

    View Slide

  265. Hot
    off
    the
    press
    http://bit.ly/
    poodr-combo
    139
    Friday, September 14, 2012

    View Slide

  266. Questions?
    140
    Friday, September 14, 2012

    View Slide