Upgrade to Pro — share decks privately, control downloads, hide ads and more …

all the little things (railsconf)

all the little things (railsconf)

Turning conditionals into objects....

Sandi Metz

April 24, 2014
Tweet

More Decks by Sandi Metz

Other Decks in Programming

Transcript

  1. @sandimetz Apr 2014
    sandi metz
    all the little things
    1
    Thursday, April 24, 14

    View Slide

  2. @sandimetz Apr 2014
    Want better apps?
    2
    Thursday, April 24, 14

    View Slide

  3. @sandimetz Apr 2014
    make smaller things
    3
    Thursday, April 24, 14

    View Slide

  4. @sandimetz Apr 2014
    The Gilded Rose Kata
    4
    Thursday, April 24, 14

    View Slide

  5. @sandimetz Apr 2014
    class  GildedRose
       attr_reader  :name,  :quality,  :days_remaining
       def  initialize(name,  quality,  days_remaining)
           @name,  @quality,  @days_remaining  =  name,  quality,  days_remaining
       end
       def  tick
           #  ...
       end
    end
    5
    Thursday, April 24, 14

    View Slide

  6. @sandimetz Apr 2014
    class  GildedRose
       attr_reader  :name,  :quality,  :days_remaining
       def  initialize(name,  quality,  days_remaining)
           @name,  @quality,  @days_remaining  =  name,  quality,  days_remaining
       end
       def  tick
           #  ...
       end
    end
    5
    Thursday, April 24, 14

    View Slide

  7. @sandimetz Apr 2014
    class  GildedRose
       attr_reader  :name,  :quality,  :days_remaining
       def  initialize(name,  quality,  days_remaining)
           @name,  @quality,  @days_remaining  =  name,  quality,  days_remaining
       end
       def  tick
           #  ...
       end
    end
    5
    Thursday, April 24, 14

    View Slide

  8. @sandimetz Apr 2014
    class  GildedRose
       attr_reader  :name,  :quality,  :days_remaining
       def  initialize(name,  quality,  days_remaining)
           @name,  @quality,  @days_remaining  =  name,  quality,  days_remaining
       end
       def  tick
           #  ...
       end
    end
    5
    Thursday, April 24, 14

    View Slide

  9. @sandimetz Apr 2014
       def  tick
           if  @name  !=  'Aged  Brie'  &&  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  c
               if  @quality  >  0
                   if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                       @quality  -­‐=  1
                   end
               end
           else
               if  @quality  <  50
                     @quality  +=  1
                   if  @name  ==  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  @days_remaining  <  11
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                       if  @days_remaining  <  6
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                   end
               end
           end
           #  21  more  lines
       def  tick
           if  name  !=  'Aged  Brie'  &&  name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               if  quality  >  0
                   if  name  !=  'Sulfuras,  Hand  of  Ragnaros'
                       @quality  -­‐=  1
                   end
               end
           else
               if  quality  <  50
                     @quality  +=  1
                   if  name  ==  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  days_remaining  <  11
                           if  quality  <  50
                               @quality  +=  1
                           end
                       end
                       if  days_remaining  <  6
                           if  quality  <  50
                               @quality  +=  1
                           end
                       end
                   end
               end
           end
           if  name  !=  'Sulfuras,  Hand  of  Ragnaros'
               @days_remaining  -­‐=  1
           end
           if  days_remaining  <  0
               if  name  !=  "Aged  Brie"
                   if  name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  quality  >  0
                           if  name  !=  'Sulfuras,  Hand  of  Ragnaros'
                               @quality  -­‐=  1
                           end
                       end
                   else
                       @quality  =  quality  -­‐  quality
                   end
               else
                   if  quality  <  50
                       @quality  +=  1
                   end
               end
           end
       end
    end
    6
    Thursday, April 24, 14

    View Slide

  10. @sandimetz Apr 2014
       def  tick
           #  22  previous  lines
           if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
               @days_remaining  -­‐=  1
           end
           if  @days_remaining  <  0
               if  @name  !=  "Aged  Brie"
                   if  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  @quality  >  0
                           if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                               @quality  -­‐=  1
                           end
                       end
                   else
                       @quality  =  @quality  -­‐  @quality
                   end
               else
                   if  @quality  <  50
                       @quality  +=  1
                   end
               end
           end
       end
       def  tick
           if  name  !=  'Aged  Brie'  &&  name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               if  quality  >  0
                   if  name  !=  'Sulfuras,  Hand  of  Ragnaros'
                       @quality  -­‐=  1
                   end
               end
           else
               if  quality  <  50
                     @quality  +=  1
                   if  name  ==  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  days_remaining  <  11
                           if  quality  <  50
                               @quality  +=  1
                           end
                       end
                       if  days_remaining  <  6
                           if  quality  <  50
                               @quality  +=  1
                           end
                       end
                   end
               end
           end
           if  name  !=  'Sulfuras,  Hand  of  Ragnaros'
               @days_remaining  -­‐=  1
           end
           if  days_remaining  <  0
               if  name  !=  "Aged  Brie"
                   if  name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  quality  >  0
                           if  name  !=  'Sulfuras,  Hand  of  Ragnaros'
                               @quality  -­‐=  1
                           end
                       end
                   else
                       @quality  =  quality  -­‐  quality
                   end
               else
                   if  quality  <  50
                       @quality  +=  1
                   end
               end
           end
       end
    end
    7
    Thursday, April 24, 14

    View Slide

  11. @sandimetz Apr 2014
       def  tick
           if  @name  !=  'Aged  Brie'  &&  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               if  @quality  >  0
                   if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                       @quality  -­‐=  1
                   end
               end
           else
               if  @quality  <  50
                     @quality  +=  1
                   if  @name  ==  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  @days_remaining  <  11
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                       if  @days_remaining  <  6
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                   end
               end
           end
           if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
               @days_remaining  -­‐=  1
           end
           if  @days_remaining  <  0
               if  @name  !=  "Aged  Brie"
                   if  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  @quality  >  0
                           if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                               @quality  -­‐=  1
                           end
                       end
                   else
                       @quality  =  @quality  -­‐  @quality
                   end
               else
                   if  @quality  <  50
                       @quality  +=  1
                   end
               end
           end
       end
    8
    Thursday, April 24, 14

    View Slide

  12. @sandimetz Apr 2014
       def  tick
           if  @name  !=  'Aged  Brie'  &&  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               if  @quality  >  0
                   if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                       @quality  -­‐=  1
                   end
               end
           else
               if  @quality  <  50
                     @quality  +=  1
                   if  @name  ==  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  @days_remaining  <  11
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                       if  @days_remaining  <  6
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                   end
               end
           end
           if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
               @days_remaining  -­‐=  1
           end
           if  @days_remaining  <  0
               if  @name  !=  "Aged  Brie"
                   if  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  @quality  >  0
                           if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                               @quality  -­‐=  1
                           end
                       end
                   else
                       @quality  =  @quality  -­‐  @quality
                   end
               else
                   if  @quality  <  50
                       @quality  +=  1
                   end
               end
           end
       end
    44.7
    0
    25
    50
    big conditional
    Complexity (Flog)
    9
    Thursday, April 24, 14

    View Slide

  13. @sandimetz Apr 2014
       def  tick
           if  @name  !=  'Aged  Brie'  &&  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               if  @quality  >  0
                   if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                       @quality  -­‐=  1
                   end
               end
           else
               if  @quality  <  50
                     @quality  +=  1
                   if  @name  ==  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  @days_remaining  <  11
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                       if  @days_remaining  <  6
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                   end
               end
           end
           if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
               @days_remaining  -­‐=  1
           end
           if  @days_remaining  <  0
               if  @name  !=  "Aged  Brie"
                   if  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  @quality  >  0
                           if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                               @quality  -­‐=  1
                           end
                       end
                   else
                       @quality  =  @quality  -­‐  @quality
                   end
               else
                   if  @quality  <  50
                       @quality  +=  1
                   end
               end
           end
       end
    44.7
    0
    25
    50
    big conditional
    Complexity (Flog)
    50
    9
    Thursday, April 24, 14

    View Slide

  14. @sandimetz Apr 2014
       def  tick
           if  @name  !=  'Aged  Brie'  &&  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               if  @quality  >  0
                   if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                       @quality  -­‐=  1
                   end
               end
           else
               if  @quality  <  50
                     @quality  +=  1
                   if  @name  ==  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  @days_remaining  <  11
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                       if  @days_remaining  <  6
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                   end
               end
           end
           if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
               @days_remaining  -­‐=  1
           end
           if  @days_remaining  <  0
               if  @name  !=  "Aged  Brie"
                   if  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  @quality  >  0
                           if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                               @quality  -­‐=  1
                           end
                       end
                   else
                       @quality  =  @quality  -­‐  @quality
                   end
               else
                   if  @quality  <  50
                       @quality  +=  1
                   end
               end
           end
       end
    44.7
    0
    25
    50
    big conditional
    Complexity (Flog)
    45
    tick
    50
    9
    Thursday, April 24, 14

    View Slide

  15. @sandimetz Apr 2014
       def  tick
           if  @name  !=  'Aged  Brie'  &&  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               if  @quality  >  0
                   if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                       @quality  -­‐=  1
                   end
               end
           else
               if  @quality  <  50
                     @quality  +=  1
                   if  @name  ==  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  @days_remaining  <  11
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                       if  @days_remaining  <  6
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                   end
               end
           end
           if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
               @days_remaining  -­‐=  1
           end
           if  @days_remaining  <  0
               if  @name  !=  "Aged  Brie"
                   if  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  @quality  >  0
                           if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                               @quality  -­‐=  1
                           end
                       end
                   else
                       @quality  =  @quality  -­‐  @quality
                   end
               else
                   if  @quality  <  50
                       @quality  +=  1
                   end
               end
           end
       end
    10
    Thursday, April 24, 14

    View Slide

  16. @sandimetz Apr 2014
    11
    Thursday, April 24, 14

    View Slide

  17. @sandimetz Apr 2014
       def  tick
           if  @name  !=  'Aged  Brie'  &&  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               if  @quality  >  0
                   if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                       @quality  -­‐=  1
                   end
               end
           else
               if  @quality  <  50
                     @quality  +=  1
                   if  @name  ==  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  @days_remaining  <  11
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                       if  @days_remaining  <  6
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                   end
               end
           end
           if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
               @days_remaining  -­‐=  1
           end
           if  @days_remaining  <  0
               if  @name  !=  "Aged  Brie"
                   if  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  @quality  >  0
                           if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                               @quality  -­‐=  1
                           end
                       end
                   else
                       @quality  =  @quality  -­‐  @quality
                   end
               else
                   if  @quality  <  50
                       @quality  +=  1
                   end
               end
           end
       end
    12
    Thursday, April 24, 14

    View Slide

  18. @sandimetz Apr 2014
       def  tick
           if  @name  !=  'Aged  Brie'  &&  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               if  @quality  >  0
                   if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                       @quality  -­‐=  1
                   end
               end
           else
               if  @quality  <  50
                     @quality  +=  1
                   if  @name  ==  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  @days_remaining  <  11
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                       if  @days_remaining  <  6
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                   end
               end
           end
           if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
               @days_remaining  -­‐=  1
           end
           if  @days_remaining  <  0
               if  @name  !=  "Aged  Brie"
                   if  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  @quality  >  0
                           if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                               @quality  -­‐=  1
                           end
                       end
                   else
                       @quality  =  @quality  -­‐  @quality
                   end
               else
                   if  @quality  <  50
                       @quality  +=  1
                   end
               end
           end
       end
    Squint Test
    12
    Thursday, April 24, 14

    View Slide

  19. @sandimetz Apr 2014
       def  tick
           if  @name  !=  'Aged  Brie'  &&  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               if  @quality  >  0
                   if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                       @quality  -­‐=  1
                   end
               end
           else
               if  @quality  <  50
                     @quality  +=  1
                   if  @name  ==  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  @days_remaining  <  11
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                       if  @days_remaining  <  6
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                   end
               end
           end
           if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
               @days_remaining  -­‐=  1
           end
           if  @days_remaining  <  0
               if  @name  !=  "Aged  Brie"
                   if  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  @quality  >  0
                           if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                               @quality  -­‐=  1
                           end
                       end
                   else
                       @quality  =  @quality  -­‐  @quality
                   end
               else
                   if  @quality  <  50
                       @quality  +=  1
                   end
               end
           end
       end
    changes in shape
    13
    Thursday, April 24, 14

    View Slide

  20. @sandimetz Apr 2014
       def  tick
           if  @name  !=  'Aged  Brie'  &&  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               if  @quality  >  0
                   if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                       @quality  -­‐=  1
                   end
               end
           else
               if  @quality  <  50
                     @quality  +=  1
                   if  @name  ==  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  @days_remaining  <  11
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                       if  @days_remaining  <  6
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                   end
               end
           end
           if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
               @days_remaining  -­‐=  1
           end
           if  @days_remaining  <  0
               if  @name  !=  "Aged  Brie"
                   if  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  @quality  >  0
                           if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                               @quality  -­‐=  1
                           end
                       end
                   else
                       @quality  =  @quality  -­‐  @quality
                   end
               else
                   if  @quality  <  50
                       @quality  +=  1
                   end
               end
           end
       end
    2
    14
    Thursday, April 24, 14

    View Slide

  21. @sandimetz Apr 2014
       def  tick
           if  @name  !=  'Aged  Brie'  &&  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               if  @quality  >  0
                   if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                       @quality  -­‐=  1
                   end
               end
           else
               if  @quality  <  50
                     @quality  +=  1
                   if  @name  ==  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  @days_remaining  <  11
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                       if  @days_remaining  <  6
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                   end
               end
           end
           if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
               @days_remaining  -­‐=  1
           end
           if  @days_remaining  <  0
               if  @name  !=  "Aged  Brie"
                   if  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  @quality  >  0
                           if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                               @quality  -­‐=  1
                           end
                       end
                   else
                       @quality  =  @quality  -­‐  @quality
                   end
               else
                   if  @quality  <  50
                       @quality  +=  1
                   end
               end
           end
       end
    changes in color
    15
    Thursday, April 24, 14

    View Slide

  22. @sandimetz Apr 2014
       def  tick
           if  @name  !=  'Aged  Brie'  &&  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               if  @quality  >  0
                   if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                       @quality  -­‐=  1
                   end
               end
           else
               if  @quality  <  50
                     @quality  +=  1
                   if  @name  ==  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  @days_remaining  <  11
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                       if  @days_remaining  <  6
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                   end
               end
           end
           if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
               @days_remaining  -­‐=  1
           end
           if  @days_remaining  <  0
               if  @name  !=  "Aged  Brie"
                   if  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  @quality  >  0
                           if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                               @quality  -­‐=  1
                           end
                       end
                   else
                       @quality  =  @quality  -­‐  @quality
                   end
               else
                   if  @quality  <  50
                       @quality  +=  1
                   end
               end
           end
       end
    16
    Thursday, April 24, 14

    View Slide

  23. @sandimetz Apr 2014
       def  tick
           if  @name  !=  'Aged  Brie'  &&  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               if  @quality  >  0
                   if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                       @quality  -­‐=  1
                   end
               end
           else
               if  @quality  <  50
                     @quality  +=  1
                   if  @name  ==  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  @days_remaining  <  11
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                       if  @days_remaining  <  6
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                   end
               end
           end
           if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
               @days_remaining  -­‐=  1
           end
           if  @days_remaining  <  0
               if  @name  !=  "Aged  Brie"
                   if  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  @quality  >  0
                           if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                               @quality  -­‐=  1
                           end
                       end
                   else
                       @quality  =  @quality  -­‐  @quality
                   end
               else
                   if  @quality  <  50
                       @quality  +=  1
                   end
               end
           end
       end
    17
    Thursday, April 24, 14

    View Slide

  24. @sandimetz Apr 2014
       def  tick
           if  @name  !=  'Aged  Brie'  &&  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               if  @quality  >  0
                   if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                       @quality  -­‐=  1
                   end
               end
           else
               if  @quality  <  50
                     @quality  +=  1
                   if  @name  ==  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  @days_remaining  <  11
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                       if  @days_remaining  <  6
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                   end
               end
           end
           if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
               @days_remaining  -­‐=  1
           end
           if  @days_remaining  <  0
               if  @name  !=  "Aged  Brie"
                   if  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  @quality  >  0
                           if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                               @quality  -­‐=  1
                           end
                       end
                   else
                       @quality  =  @quality  -­‐  @quality
                   end
               else
                   if  @quality  <  50
                       @quality  +=  1
                   end
               end
           end
       end
    16 if statements
    17
    Thursday, April 24, 14

    View Slide

  25. @sandimetz Apr 2014
       def  tick
           if  @name  !=  'Aged  Brie'  &&  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               if  @quality  >  0
                   if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                       @quality  -­‐=  1
                   end
               end
           else
               if  @quality  <  50
                     @quality  +=  1
                   if  @name  ==  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  @days_remaining  <  11
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                       if  @days_remaining  <  6
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                   end
               end
           end
           if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
               @days_remaining  -­‐=  1
           end
           if  @days_remaining  <  0
               if  @name  !=  "Aged  Brie"
                   if  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  @quality  >  0
                           if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                               @quality  -­‐=  1
                           end
                       end
                   else
                       @quality  =  @quality  -­‐  @quality
                   end
               else
                   if  @quality  <  50
                       @quality  +=  1
                   end
               end
           end
       end
    16 if statements
    7 !=
    17
    Thursday, April 24, 14

    View Slide

  26. @sandimetz Apr 2014
       def  tick
           if  @name  !=  'Aged  Brie'  &&  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               if  @quality  >  0
                   if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                       @quality  -­‐=  1
                   end
               end
           else
               if  @quality  <  50
                     @quality  +=  1
                   if  @name  ==  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  @days_remaining  <  11
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                       if  @days_remaining  <  6
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                   end
               end
           end
           if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
               @days_remaining  -­‐=  1
           end
           if  @days_remaining  <  0
               if  @name  !=  "Aged  Brie"
                   if  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  @quality  >  0
                           if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                               @quality  -­‐=  1
                           end
                       end
                   else
                       @quality  =  @quality  -­‐  @quality
                   end
               else
                   if  @quality  <  50
                       @quality  +=  1
                   end
               end
           end
       end
    16 if statements
    7 !=
    2 != with &&
    17
    Thursday, April 24, 14

    View Slide

  27. @sandimetz Apr 2014
       def  tick
           if  @name  !=  'Aged  Brie'  &&  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               if  @quality  >  0
                   if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                       @quality  -­‐=  1
                   end
               end
           else
               if  @quality  <  50
                     @quality  +=  1
                   if  @name  ==  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  @days_remaining  <  11
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                       if  @days_remaining  <  6
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                   end
               end
           end
           if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
               @days_remaining  -­‐=  1
           end
           if  @days_remaining  <  0
               if  @name  !=  "Aged  Brie"
                   if  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  @quality  >  0
                           if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                               @quality  -­‐=  1
                           end
                       end
                   else
                       @quality  =  @quality  -­‐  @quality
                   end
               else
                   if  @quality  <  50
                       @quality  +=  1
                   end
               end
           end
       end
    16 if statements
    7 !=
    2 != with &&
    3 magic strings
    17
    Thursday, April 24, 14

    View Slide

  28. @sandimetz Apr 2014
       def  tick
           if  @name  !=  'Aged  Brie'  &&  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               if  @quality  >  0
                   if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                       @quality  -­‐=  1
                   end
               end
           else
               if  @quality  <  50
                     @quality  +=  1
                   if  @name  ==  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  @days_remaining  <  11
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                       if  @days_remaining  <  6
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                   end
               end
           end
           if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
               @days_remaining  -­‐=  1
           end
           if  @days_remaining  <  0
               if  @name  !=  "Aged  Brie"
                   if  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  @quality  >  0
                           if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                               @quality  -­‐=  1
                           end
                       end
                   else
                       @quality  =  @quality  -­‐  @quality
                   end
               else
                   if  @quality  <  50
                       @quality  +=  1
                   end
               end
           end
       end
    16 if statements
    7 !=
    2 != with &&
    3 magic strings
    ? magic numbers
    17
    Thursday, April 24, 14

    View Slide

  29. @sandimetz Apr 2014
       def  tick
           if  @name  !=  'Aged  Brie'  &&  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               if  @quality  >  0
                   if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                       @quality  -­‐=  1
                   end
               end
           else
               if  @quality  <  50
                     @quality  +=  1
                   if  @name  ==  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  @days_remaining  <  11
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                       if  @days_remaining  <  6
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                   end
               end
           end
           if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
               @days_remaining  -­‐=  1
           end
           if  @days_remaining  <  0
               if  @name  !=  "Aged  Brie"
                   if  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  @quality  >  0
                           if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                               @quality  -­‐=  1
                           end
                       end
                   else
                       @quality  =  @quality  -­‐  @quality
                   end
               else
                   if  @quality  <  50
                       @quality  +=  1
                   end
               end
           end
       end
    magic strings
    18
    Thursday, April 24, 14

    View Slide

  30. @sandimetz Apr 2014
       def  tick
           if  @name  !=  'Aged  Brie'  &&  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               if  @quality  >  0
                   if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                       @quality  -­‐=  1
                   end
               end
           else
               if  @quality  <  50
                     @quality  +=  1
                   if  @name  ==  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  @days_remaining  <  11
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                       if  @days_remaining  <  6
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                   end
               end
           end
           if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
               @days_remaining  -­‐=  1
           end
           if  @days_remaining  <  0
               if  @name  !=  "Aged  Brie"
                   if  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  @quality  >  0
                           if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                               @quality  -­‐=  1
                           end
                       end
                   else
                       @quality  =  @quality  -­‐  @quality
                   end
               else
                   if  @quality  <  50
                       @quality  +=  1
                   end
               end
           end
       end
    ‘Aged  Brie’
    magic strings
    18
    Thursday, April 24, 14

    View Slide

  31. @sandimetz Apr 2014
       def  tick
           if  @name  !=  'Aged  Brie'  &&  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               if  @quality  >  0
                   if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                       @quality  -­‐=  1
                   end
               end
           else
               if  @quality  <  50
                     @quality  +=  1
                   if  @name  ==  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  @days_remaining  <  11
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                       if  @days_remaining  <  6
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                   end
               end
           end
           if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
               @days_remaining  -­‐=  1
           end
           if  @days_remaining  <  0
               if  @name  !=  "Aged  Brie"
                   if  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  @quality  >  0
                           if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                               @quality  -­‐=  1
                           end
                       end
                   else
                       @quality  =  @quality  -­‐  @quality
                   end
               else
                   if  @quality  <  50
                       @quality  +=  1
                   end
               end
           end
       end
    ‘Aged  Brie’
    ‘Sulfuras,  Hand  of  Ragnaros’
    magic strings
    18
    Thursday, April 24, 14

    View Slide

  32. @sandimetz Apr 2014
       def  tick
           if  @name  !=  'Aged  Brie'  &&  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               if  @quality  >  0
                   if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                       @quality  -­‐=  1
                   end
               end
           else
               if  @quality  <  50
                     @quality  +=  1
                   if  @name  ==  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  @days_remaining  <  11
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                       if  @days_remaining  <  6
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                   end
               end
           end
           if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
               @days_remaining  -­‐=  1
           end
           if  @days_remaining  <  0
               if  @name  !=  "Aged  Brie"
                   if  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  @quality  >  0
                           if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                               @quality  -­‐=  1
                           end
                       end
                   else
                       @quality  =  @quality  -­‐  @quality
                   end
               else
                   if  @quality  <  50
                       @quality  +=  1
                   end
               end
           end
       end
    ‘Aged  Brie’
    ‘Sulfuras,  Hand  of  Ragnaros’
    ‘Backstage  passes  
     to  a  TAFKAL80ETC  concert’
    magic strings
    18
    Thursday, April 24, 14

    View Slide

  33. @sandimetz Apr 2014
       def  tick
           if  @name  !=  'Aged  Brie'  &&  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               if  @quality  >  0
                   if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                       @quality  -­‐=  1
                   end
               end
           else
               if  @quality  <  50
                     @quality  +=  1
                   if  @name  ==  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  @days_remaining  <  11
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                       if  @days_remaining  <  6
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                   end
               end
           end
           if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
               @days_remaining  -­‐=  1
           end
           if  @days_remaining  <  0
               if  @name  !=  "Aged  Brie"
                   if  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  @quality  >  0
                           if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                               @quality  -­‐=  1
                           end
                       end
                   else
                       @quality  =  @quality  -­‐  @quality
                   end
               else
                   if  @quality  <  50
                       @quality  +=  1
                   end
               end
           end
       end
    it has tests
    19
    Thursday, April 24, 14

    View Slide

  34. @sandimetz Apr 2014
    #  Running:
    S..S.S...S..........S....S.....
    Fabulous  run  in  0.002800s,  11071.4286  runs/s,  17857.1429  assertions/s.
    31  runs,  50  assertions,  0  failures,  0  errors,  6  skips
    20
    Thursday, April 24, 14

    View Slide

  35. @sandimetz Apr 2014
    #  Running:
    S..S.S...S..........S....S.....
    Fabulous  run  in  0.002800s,  11071.4286  runs/s,  17857.1429  assertions/s.
    31  runs,  50  assertions,  0  failures,  0  errors,  6  skips
    20
    Thursday, April 24, 14

    View Slide

  36. @sandimetz Apr 2014
    class  GildedRoseTest  <  Minitest::Test
       def  test_normal_item_before_sell_date
       def  test_normal_item_on_sell_date
       def  test_normal_item_after_sell_date
       def  test_normal_item_of_zero_quality
       def  test_brie_before_sell_date
       def  test_brie_before_sell_date_with_max_quality
       def  test_brie_on_sell_date
       def  test_brie_on_sell_date_near_max_quality
       def  test_brie_on_sell_date_with_max_quality
       def  test_brie_after_sell_date
       def  test_brie_after_sell_date_with_max_quality
       def  test_sulfuras_before_sell_date
       def  test_sulfuras_on_sell_date
       def  test_sulfuras_after_sell_date
       def  test_backstage_pass_long_before_sell_date
       def  test_backstage_pass_medium_close_to_sell_date_upper_bound
       def  test_backstage_pass_medium_close_to_sell_date_upper_bound_at_max_quality
       def  test_backstage_pass_medium_close_to_sell_date_lower_bound
       def  test_backstage_pass_medium_close_to_sell_date_lower_bound_at_max_quality
       def  test_backstage_pass_very_close_to_sell_date_upper_bound
       def  test_backstage_pass_very_close_to_sell_date_upper_bound_at_max_quality
       def  test_backstage_pass_very_close_to_sell_date_lower_bound
       def  test_backstage_pass_very_close_to_sell_date_lower_bound_at_max_quality
       def  test_backstage_pass_on_sell_date
       def  test_backstage_pass_after_sell_date
    21
    Thursday, April 24, 14

    View Slide

  37. @sandimetz Apr 2014
    class  GildedRoseTest  <  Minitest::Test
       def  test_normal_item_before_sell_date
       def  test_normal_item_on_sell_date
       def  test_normal_item_after_sell_date
       def  test_normal_item_of_zero_quality
       def  test_brie_before_sell_date
       def  test_brie_before_sell_date_with_max_quality
       def  test_brie_on_sell_date
       def  test_brie_on_sell_date_near_max_quality
       def  test_brie_on_sell_date_with_max_quality
       def  test_brie_after_sell_date
       def  test_brie_after_sell_date_with_max_quality
       def  test_sulfuras_before_sell_date
       def  test_sulfuras_on_sell_date
       def  test_sulfuras_after_sell_date
       def  test_backstage_pass_long_before_sell_date
       def  test_backstage_pass_medium_close_to_sell_date_upper_bound
       def  test_backstage_pass_medium_close_to_sell_date_upper_bound_at_max_quality
       def  test_backstage_pass_medium_close_to_sell_date_lower_bound
       def  test_backstage_pass_medium_close_to_sell_date_lower_bound_at_max_quality
       def  test_backstage_pass_very_close_to_sell_date_upper_bound
       def  test_backstage_pass_very_close_to_sell_date_upper_bound_at_max_quality
       def  test_backstage_pass_very_close_to_sell_date_lower_bound
       def  test_backstage_pass_very_close_to_sell_date_lower_bound_at_max_quality
       def  test_backstage_pass_on_sell_date
       def  test_backstage_pass_after_sell_date
    brie
    21
    Thursday, April 24, 14

    View Slide

  38. @sandimetz Apr 2014
    class  GildedRoseTest  <  Minitest::Test
       def  test_normal_item_before_sell_date
       def  test_normal_item_on_sell_date
       def  test_normal_item_after_sell_date
       def  test_normal_item_of_zero_quality
       def  test_brie_before_sell_date
       def  test_brie_before_sell_date_with_max_quality
       def  test_brie_on_sell_date
       def  test_brie_on_sell_date_near_max_quality
       def  test_brie_on_sell_date_with_max_quality
       def  test_brie_after_sell_date
       def  test_brie_after_sell_date_with_max_quality
       def  test_sulfuras_before_sell_date
       def  test_sulfuras_on_sell_date
       def  test_sulfuras_after_sell_date
       def  test_backstage_pass_long_before_sell_date
       def  test_backstage_pass_medium_close_to_sell_date_upper_bound
       def  test_backstage_pass_medium_close_to_sell_date_upper_bound_at_max_quality
       def  test_backstage_pass_medium_close_to_sell_date_lower_bound
       def  test_backstage_pass_medium_close_to_sell_date_lower_bound_at_max_quality
       def  test_backstage_pass_very_close_to_sell_date_upper_bound
       def  test_backstage_pass_very_close_to_sell_date_upper_bound_at_max_quality
       def  test_backstage_pass_very_close_to_sell_date_lower_bound
       def  test_backstage_pass_very_close_to_sell_date_lower_bound_at_max_quality
       def  test_backstage_pass_on_sell_date
       def  test_backstage_pass_after_sell_date
    brie
    sulfuras
    21
    Thursday, April 24, 14

    View Slide

  39. @sandimetz Apr 2014
    class  GildedRoseTest  <  Minitest::Test
       def  test_normal_item_before_sell_date
       def  test_normal_item_on_sell_date
       def  test_normal_item_after_sell_date
       def  test_normal_item_of_zero_quality
       def  test_brie_before_sell_date
       def  test_brie_before_sell_date_with_max_quality
       def  test_brie_on_sell_date
       def  test_brie_on_sell_date_near_max_quality
       def  test_brie_on_sell_date_with_max_quality
       def  test_brie_after_sell_date
       def  test_brie_after_sell_date_with_max_quality
       def  test_sulfuras_before_sell_date
       def  test_sulfuras_on_sell_date
       def  test_sulfuras_after_sell_date
       def  test_backstage_pass_long_before_sell_date
       def  test_backstage_pass_medium_close_to_sell_date_upper_bound
       def  test_backstage_pass_medium_close_to_sell_date_upper_bound_at_max_quality
       def  test_backstage_pass_medium_close_to_sell_date_lower_bound
       def  test_backstage_pass_medium_close_to_sell_date_lower_bound_at_max_quality
       def  test_backstage_pass_very_close_to_sell_date_upper_bound
       def  test_backstage_pass_very_close_to_sell_date_upper_bound_at_max_quality
       def  test_backstage_pass_very_close_to_sell_date_lower_bound
       def  test_backstage_pass_very_close_to_sell_date_lower_bound_at_max_quality
       def  test_backstage_pass_on_sell_date
       def  test_backstage_pass_after_sell_date
    brie
    sulfuras
    backstage  pass
    21
    Thursday, April 24, 14

    View Slide

  40. @sandimetz Apr 2014
    class  GildedRoseTest  <  Minitest::Test
       def  test_normal_item_before_sell_date
       def  test_normal_item_on_sell_date
       def  test_normal_item_after_sell_date
       def  test_normal_item_of_zero_quality
       def  test_brie_before_sell_date
       def  test_brie_before_sell_date_with_max_quality
       def  test_brie_on_sell_date
       def  test_brie_on_sell_date_near_max_quality
       def  test_brie_on_sell_date_with_max_quality
       def  test_brie_after_sell_date
       def  test_brie_after_sell_date_with_max_quality
       def  test_sulfuras_before_sell_date
       def  test_sulfuras_on_sell_date
       def  test_sulfuras_after_sell_date
       def  test_backstage_pass_long_before_sell_date
       def  test_backstage_pass_medium_close_to_sell_date_upper_bound
       def  test_backstage_pass_medium_close_to_sell_date_upper_bound_at_max_quality
       def  test_backstage_pass_medium_close_to_sell_date_lower_bound
       def  test_backstage_pass_medium_close_to_sell_date_lower_bound_at_max_quality
       def  test_backstage_pass_very_close_to_sell_date_upper_bound
       def  test_backstage_pass_very_close_to_sell_date_upper_bound_at_max_quality
       def  test_backstage_pass_very_close_to_sell_date_lower_bound
       def  test_backstage_pass_very_close_to_sell_date_lower_bound_at_max_quality
       def  test_backstage_pass_on_sell_date
       def  test_backstage_pass_after_sell_date
    brie
    sulfuras
    backstage  pass
    normal
    21
    Thursday, April 24, 14

    View Slide

  41. @sandimetz Apr 2014
    class  GildedRoseTest  <  Minitest::Test
       def  test_normal_item_before_sell_date
           item  =  GildedRose.new('normal',  10,  5)
           item.tick
           assert_equal  9,  item.quality
           assert_equal  4,  item.days_remaining
       end
       def  test_normal_item_on_sell_date
       def  test_normal_item_after_sell_date
       def  test_normal_item_of_zero_quality
       def  test_brie_before_sell_date
       def  test_brie_before_sell_date_with_max_quality
       def  test_brie_on_sell_date
       def  test_brie_on_sell_date_near_max_quality
       def  test_brie_on_sell_date_with_max_quality
       def  test_brie_after_sell_date
       def  test_brie_after_sell_date_with_max_quality
       def  test_sulfuras_before_sell_date
       def  test_sulfuras_on_sell_date
       def  test_sulfuras_after_sell_date
       def  test_backstage_pass_long_before_sell_date
       def  test_backstage_pass_medium_close_to_sell_date_upper_bound
       def  test_backstage_pass_medium_close_to_sell_date_upper_bound_at_max_quality
       def  test_backstage_pass_medium_close_to_sell_date_lower_bound
       def  test_backstage_pass_medium_close_to_sell_date_lower_bound_at_max_quality
       def  test_backstage_pass_very_close_to_sell_date_upper_bound
    let’s look at a test
    22
    Thursday, April 24, 14

    View Slide

  42. @sandimetz Apr 2014
    class  GildedRoseTest  <  Minitest::Test
       def  test_normal_item_before_sell_date
           item  =  GildedRose.new('normal',  10,  5)
           item.tick
           assert_equal  9,  item.quality
           assert_equal  4,  item.days_remaining
       end
       def  test_normal_item_on_sell_date
       def  test_normal_item_after_sell_date
       def  test_normal_item_of_zero_quality
       def  test_brie_before_sell_date
       def  test_brie_before_sell_date_with_max_quality
       def  test_brie_on_sell_date
       def  test_brie_on_sell_date_near_max_quality
       def  test_brie_on_sell_date_with_max_quality
       def  test_brie_after_sell_date
       def  test_brie_after_sell_date_with_max_quality
       def  test_sulfuras_before_sell_date
       def  test_sulfuras_on_sell_date
       def  test_sulfuras_after_sell_date
       def  test_backstage_pass_long_before_sell_date
       def  test_backstage_pass_medium_close_to_sell_date_upper_bound
       def  test_backstage_pass_medium_close_to_sell_date_upper_bound_at_max_quality
       def  test_backstage_pass_medium_close_to_sell_date_lower_bound
       def  test_backstage_pass_medium_close_to_sell_date_lower_bound_at_max_quality
       def  test_backstage_pass_very_close_to_sell_date_upper_bound
    23
    Thursday, April 24, 14

    View Slide

  43. @sandimetz Apr 2014
    class  GildedRoseTest  <  Minitest::Test
       def  test_normal_item_before_sell_date
           item  =  GildedRose.new('normal',  10,  5)
           item.tick
           assert_equal  9,  item.quality
           assert_equal  4,  item.days_remaining
       end
       def  test_normal_item_on_sell_date
       def  test_normal_item_after_sell_date
       def  test_normal_item_of_zero_quality
       def  test_brie_before_sell_date
       def  test_brie_before_sell_date_with_max_quality
       def  test_brie_on_sell_date
       def  test_brie_on_sell_date_near_max_quality
       def  test_brie_on_sell_date_with_max_quality
       def  test_brie_after_sell_date
       def  test_brie_after_sell_date_with_max_quality
       def  test_sulfuras_before_sell_date
       def  test_sulfuras_on_sell_date
       def  test_sulfuras_after_sell_date
       def  test_backstage_pass_long_before_sell_date
       def  test_backstage_pass_medium_close_to_sell_date_upper_bound
       def  test_backstage_pass_medium_close_to_sell_date_upper_bound_at_max_quality
       def  test_backstage_pass_medium_close_to_sell_date_lower_bound
       def  test_backstage_pass_medium_close_to_sell_date_lower_bound_at_max_quality
       def  test_backstage_pass_very_close_to_sell_date_upper_bound
    23
    Thursday, April 24, 14

    View Slide

  44. @sandimetz Apr 2014
    class  GildedRoseTest  <  Minitest::Test
       def  test_normal_item_before_sell_date
           item  =  GildedRose.new('normal',  10,  5)
           item.tick
           assert_equal  9,  item.quality
           assert_equal  4,  item.days_remaining
       end
       def  test_normal_item_on_sell_date
       def  test_normal_item_after_sell_date
       def  test_normal_item_of_zero_quality
       def  test_brie_before_sell_date
       def  test_brie_before_sell_date_with_max_quality
       def  test_brie_on_sell_date
       def  test_brie_on_sell_date_near_max_quality
       def  test_brie_on_sell_date_with_max_quality
       def  test_brie_after_sell_date
       def  test_brie_after_sell_date_with_max_quality
       def  test_sulfuras_before_sell_date
       def  test_sulfuras_on_sell_date
       def  test_sulfuras_after_sell_date
       def  test_backstage_pass_long_before_sell_date
       def  test_backstage_pass_medium_close_to_sell_date_upper_bound
       def  test_backstage_pass_medium_close_to_sell_date_upper_bound_at_max_quality
       def  test_backstage_pass_medium_close_to_sell_date_lower_bound
       def  test_backstage_pass_medium_close_to_sell_date_lower_bound_at_max_quality
       def  test_backstage_pass_very_close_to_sell_date_upper_bound
    23
    Thursday, April 24, 14

    View Slide

  45. @sandimetz Apr 2014
    class  GildedRoseTest  <  Minitest::Test
       def  test_normal_item_before_sell_date
           item  =  GildedRose.new('normal',  10,  5)
           item.tick
           assert_equal  9,  item.quality
           assert_equal  4,  item.days_remaining
       end
       def  test_normal_item_on_sell_date
       def  test_normal_item_after_sell_date
       def  test_normal_item_of_zero_quality
       def  test_brie_before_sell_date
       def  test_brie_before_sell_date_with_max_quality
       def  test_brie_on_sell_date
       def  test_brie_on_sell_date_near_max_quality
       def  test_brie_on_sell_date_with_max_quality
       def  test_brie_after_sell_date
       def  test_brie_after_sell_date_with_max_quality
       def  test_sulfuras_before_sell_date
       def  test_sulfuras_on_sell_date
       def  test_sulfuras_after_sell_date
       def  test_backstage_pass_long_before_sell_date
       def  test_backstage_pass_medium_close_to_sell_date_upper_bound
       def  test_backstage_pass_medium_close_to_sell_date_upper_bound_at_max_quality
       def  test_backstage_pass_medium_close_to_sell_date_lower_bound
       def  test_backstage_pass_medium_close_to_sell_date_lower_bound_at_max_quality
       def  test_backstage_pass_very_close_to_sell_date_upper_bound
    name
    23
    Thursday, April 24, 14

    View Slide

  46. @sandimetz Apr 2014
    class  GildedRoseTest  <  Minitest::Test
       def  test_normal_item_before_sell_date
           item  =  GildedRose.new('normal',  10,  5)
           item.tick
           assert_equal  9,  item.quality
           assert_equal  4,  item.days_remaining
       end
       def  test_normal_item_on_sell_date
       def  test_normal_item_after_sell_date
       def  test_normal_item_of_zero_quality
       def  test_brie_before_sell_date
       def  test_brie_before_sell_date_with_max_quality
       def  test_brie_on_sell_date
       def  test_brie_on_sell_date_near_max_quality
       def  test_brie_on_sell_date_with_max_quality
       def  test_brie_after_sell_date
       def  test_brie_after_sell_date_with_max_quality
       def  test_sulfuras_before_sell_date
       def  test_sulfuras_on_sell_date
       def  test_sulfuras_after_sell_date
       def  test_backstage_pass_long_before_sell_date
       def  test_backstage_pass_medium_close_to_sell_date_upper_bound
       def  test_backstage_pass_medium_close_to_sell_date_upper_bound_at_max_quality
       def  test_backstage_pass_medium_close_to_sell_date_lower_bound
       def  test_backstage_pass_medium_close_to_sell_date_lower_bound_at_max_quality
       def  test_backstage_pass_very_close_to_sell_date_upper_bound
    name
    quality
    23
    Thursday, April 24, 14

    View Slide

  47. @sandimetz Apr 2014
    class  GildedRoseTest  <  Minitest::Test
       def  test_normal_item_before_sell_date
           item  =  GildedRose.new('normal',  10,  5)
           item.tick
           assert_equal  9,  item.quality
           assert_equal  4,  item.days_remaining
       end
       def  test_normal_item_on_sell_date
       def  test_normal_item_after_sell_date
       def  test_normal_item_of_zero_quality
       def  test_brie_before_sell_date
       def  test_brie_before_sell_date_with_max_quality
       def  test_brie_on_sell_date
       def  test_brie_on_sell_date_near_max_quality
       def  test_brie_on_sell_date_with_max_quality
       def  test_brie_after_sell_date
       def  test_brie_after_sell_date_with_max_quality
       def  test_sulfuras_before_sell_date
       def  test_sulfuras_on_sell_date
       def  test_sulfuras_after_sell_date
       def  test_backstage_pass_long_before_sell_date
       def  test_backstage_pass_medium_close_to_sell_date_upper_bound
       def  test_backstage_pass_medium_close_to_sell_date_upper_bound_at_max_quality
       def  test_backstage_pass_medium_close_to_sell_date_lower_bound
       def  test_backstage_pass_medium_close_to_sell_date_lower_bound_at_max_quality
       def  test_backstage_pass_very_close_to_sell_date_upper_bound
    name
    quality
    days_remaining
    23
    Thursday, April 24, 14

    View Slide

  48. @sandimetz Apr 2014
    class  GildedRoseTest  <  Minitest::Test
       def  test_normal_item_before_sell_date
           item  =  GildedRose.new('normal',  10,  5)
           item.tick
           assert_equal  9,  item.quality
           assert_equal  4,  item.days_remaining
       end
       def  test_normal_item_on_sell_date
       def  test_normal_item_after_sell_date
       def  test_normal_item_of_zero_quality
       def  test_brie_before_sell_date
       def  test_brie_before_sell_date_with_max_quality
       def  test_brie_on_sell_date
       def  test_brie_on_sell_date_near_max_quality
       def  test_brie_on_sell_date_with_max_quality
       def  test_brie_after_sell_date
       def  test_brie_after_sell_date_with_max_quality
       def  test_sulfuras_before_sell_date
       def  test_sulfuras_on_sell_date
       def  test_sulfuras_after_sell_date
       def  test_backstage_pass_long_before_sell_date
       def  test_backstage_pass_medium_close_to_sell_date_upper_bound
       def  test_backstage_pass_medium_close_to_sell_date_upper_bound_at_max_quality
       def  test_backstage_pass_medium_close_to_sell_date_lower_bound
       def  test_backstage_pass_medium_close_to_sell_date_lower_bound_at_max_quality
       def  test_backstage_pass_very_close_to_sell_date_upper_bound
    23
    Thursday, April 24, 14

    View Slide

  49. @sandimetz Apr 2014
    class  GildedRoseTest  <  Minitest::Test
       def  test_normal_item_before_sell_date
           item  =  GildedRose.new('normal',  10,  5)
           item.tick
           assert_equal  9,  item.quality
           assert_equal  4,  item.days_remaining
       end
       def  test_normal_item_on_sell_date
       def  test_normal_item_after_sell_date
       def  test_normal_item_of_zero_quality
       def  test_brie_before_sell_date
       def  test_brie_before_sell_date_with_max_quality
       def  test_brie_on_sell_date
       def  test_brie_on_sell_date_near_max_quality
       def  test_brie_on_sell_date_with_max_quality
       def  test_brie_after_sell_date
       def  test_brie_after_sell_date_with_max_quality
       def  test_sulfuras_before_sell_date
       def  test_sulfuras_on_sell_date
       def  test_sulfuras_after_sell_date
       def  test_backstage_pass_long_before_sell_date
       def  test_backstage_pass_medium_close_to_sell_date_upper_bound
       def  test_backstage_pass_medium_close_to_sell_date_upper_bound_at_max_quality
       def  test_backstage_pass_medium_close_to_sell_date_lower_bound
       def  test_backstage_pass_medium_close_to_sell_date_lower_bound_at_max_quality
       def  test_backstage_pass_very_close_to_sell_date_upper_bound
    23
    Thursday, April 24, 14

    View Slide

  50. @sandimetz Apr 2014
    class  GildedRoseTest  <  Minitest::Test
       def  test_normal_item_before_sell_date
           item  =  GildedRose.new('normal',  10,  5)
           item.tick
           assert_equal  9,  item.quality
           assert_equal  4,  item.days_remaining
       end
       def  test_normal_item_on_sell_date
       def  test_normal_item_after_sell_date
       def  test_normal_item_of_zero_quality
       def  test_brie_before_sell_date
       def  test_brie_before_sell_date_with_max_quality
       def  test_brie_on_sell_date
       def  test_brie_on_sell_date_near_max_quality
       def  test_brie_on_sell_date_with_max_quality
       def  test_brie_after_sell_date
       def  test_brie_after_sell_date_with_max_quality
       def  test_sulfuras_before_sell_date
       def  test_sulfuras_on_sell_date
       def  test_sulfuras_after_sell_date
       def  test_backstage_pass_long_before_sell_date
       def  test_backstage_pass_medium_close_to_sell_date_upper_bound
       def  test_backstage_pass_medium_close_to_sell_date_upper_bound_at_max_quality
       def  test_backstage_pass_medium_close_to_sell_date_lower_bound
       def  test_backstage_pass_medium_close_to_sell_date_lower_bound_at_max_quality
       def  test_backstage_pass_very_close_to_sell_date_upper_bound
    23
    Thursday, April 24, 14

    View Slide

  51. @sandimetz Apr 2014
    class  GildedRoseTest  <  Minitest::Test
       def  test_normal_item_before_sell_date
           item  =  GildedRose.new('normal',  10,  5)
           item.tick
           assert_equal  9,  item.quality
           assert_equal  4,  item.days_remaining
       end
       def  test_normal_item_on_sell_date
       def  test_normal_item_after_sell_date
       def  test_normal_item_of_zero_quality
       def  test_brie_before_sell_date
       def  test_brie_before_sell_date_with_max_quality
       def  test_brie_on_sell_date
       def  test_brie_on_sell_date_near_max_quality
       def  test_brie_on_sell_date_with_max_quality
       def  test_brie_after_sell_date
       def  test_brie_after_sell_date_with_max_quality
       def  test_sulfuras_before_sell_date
       def  test_sulfuras_on_sell_date
       def  test_sulfuras_after_sell_date
       def  test_backstage_pass_long_before_sell_date
       def  test_backstage_pass_medium_close_to_sell_date_upper_bound
       def  test_backstage_pass_medium_close_to_sell_date_upper_bound_at_max_quality
       def  test_backstage_pass_medium_close_to_sell_date_lower_bound
       def  test_backstage_pass_medium_close_to_sell_date_lower_bound_at_max_quality
       def  test_backstage_pass_very_close_to_sell_date_upper_bound
    23
    Thursday, April 24, 14

    View Slide

  52. @sandimetz Apr 2014
    class  GildedRoseTest  <  Minitest::Test
       def  test_normal_item_before_sell_date
           item  =  GildedRose.new('normal',  10,  5)
           item.tick
           assert_equal  9,  item.quality
           assert_equal  4,  item.days_remaining
       end
       def  test_normal_item_on_sell_date
       def  test_normal_item_after_sell_date
       def  test_normal_item_of_zero_quality
       def  test_brie_before_sell_date
       def  test_brie_before_sell_date_with_max_quality
       def  test_brie_on_sell_date
       def  test_brie_on_sell_date_near_max_quality
       def  test_brie_on_sell_date_with_max_quality
       def  test_brie_after_sell_date
       def  test_brie_after_sell_date_with_max_quality
       def  test_sulfuras_before_sell_date
       def  test_sulfuras_on_sell_date
       def  test_sulfuras_after_sell_date
       def  test_backstage_pass_long_before_sell_date
       def  test_backstage_pass_medium_close_to_sell_date_upper_bound
       def  test_backstage_pass_medium_close_to_sell_date_upper_bound_at_max_quality
       def  test_backstage_pass_medium_close_to_sell_date_lower_bound
       def  test_backstage_pass_medium_close_to_sell_date_lower_bound_at_max_quality
       def  test_backstage_pass_very_close_to_sell_date_upper_bound
    23
    Thursday, April 24, 14

    View Slide

  53. @sandimetz Apr 2014
    class  GildedRoseTest  <  Minitest::Test
       def  test_normal_item_before_sell_date
           item  =  GildedRose.new('normal',  10,  5)
           item.tick
           assert_equal  9,  item.quality
           assert_equal  4,  item.days_remaining
       end
       def  test_normal_item_on_sell_date
       def  test_normal_item_after_sell_date
       def  test_normal_item_of_zero_quality
       def  test_brie_before_sell_date
       def  test_brie_before_sell_date_with_max_quality
       def  test_brie_on_sell_date
       def  test_brie_on_sell_date_near_max_quality
       def  test_brie_on_sell_date_with_max_quality
       def  test_brie_after_sell_date
       def  test_brie_after_sell_date_with_max_quality
       def  test_sulfuras_before_sell_date
       def  test_sulfuras_on_sell_date
       def  test_sulfuras_after_sell_date
       def  test_backstage_pass_long_before_sell_date
       def  test_backstage_pass_medium_close_to_sell_date_upper_bound
       def  test_backstage_pass_medium_close_to_sell_date_upper_bound_at_max_quality
       def  test_backstage_pass_medium_close_to_sell_date_lower_bound
       def  test_backstage_pass_medium_close_to_sell_date_lower_bound_at_max_quality
       def  test_backstage_pass_very_close_to_sell_date_upper_bound
    reduced by 1
    24
    Thursday, April 24, 14

    View Slide

  54. @sandimetz Apr 2014
    class  GildedRoseTest  <  Minitest::Test
       def  test_conjured_item_before_sell_date
       def  test_conjured_item_at_zero_quality
       def  test_conjured_item_on_sell_date
       def  test_conjured_item_on_sell_date_at_zero_quality
       def  test_conjured_item_after_sell_date
       def  test_conjured_item_after_sell_date_at_zero_quality
    end
    25
    Thursday, April 24, 14

    View Slide

  55. @sandimetz Apr 2014
    class  GildedRoseTest  <  Minitest::Test
       def  test_conjured_item_before_sell_date
       def  test_conjured_item_at_zero_quality
       def  test_conjured_item_on_sell_date
       def  test_conjured_item_on_sell_date_at_zero_quality
       def  test_conjured_item_after_sell_date
       def  test_conjured_item_after_sell_date_at_zero_quality
    end
    6 skipped tests
    25
    Thursday, April 24, 14

    View Slide

  56. @sandimetz Apr 2014
    class  GildedRoseTest  <  Minitest::Test
       def  test_conjured_item_before_sell_date
       def  test_conjured_item_at_zero_quality
       def  test_conjured_item_on_sell_date
       def  test_conjured_item_on_sell_date_at_zero_quality
       def  test_conjured_item_after_sell_date
       def  test_conjured_item_after_sell_date_at_zero_quality
    end
    26
    Thursday, April 24, 14

    View Slide

  57. @sandimetz Apr 2014
    class  GildedRoseTest  <  Minitest::Test
       def  test_conjured_item_before_sell_date
       def  test_conjured_item_at_zero_quality
       def  test_conjured_item_on_sell_date
       def  test_conjured_item_on_sell_date_at_zero_quality
       def  test_conjured_item_after_sell_date
       def  test_conjured_item_after_sell_date_at_zero_quality
    end
    26
    Thursday, April 24, 14

    View Slide

  58. @sandimetz Apr 2014
    27
    Thursday, April 24, 14

    View Slide

  59. @sandimetz Apr 2014
    Task:
    27
    Thursday, April 24, 14

    View Slide

  60. @sandimetz Apr 2014
    Task:
    Implement Conjured
    27
    Thursday, April 24, 14

    View Slide

  61. @sandimetz Apr 2014
    class  GildedRoseTest  <  Minitest::Test
       def  test_conjured_item_before_sell_date
       def  test_conjured_item_at_zero_quality
       def  test_conjured_item_on_sell_date
       def  test_conjured_item_on_sell_date_at_zero_quality
       def  test_conjured_item_after_sell_date
       def  test_conjured_item_after_sell_date_at_zero_quality
    end
    28
    Thursday, April 24, 14

    View Slide

  62. @sandimetz Apr 2014
    class  GildedRoseTest  <  Minitest::Test
       def  test_conjured_item_before_sell_date
       def  test_conjured_item_at_zero_quality
       def  test_conjured_item_on_sell_date
       def  test_conjured_item_on_sell_date_at_zero_quality
       def  test_conjured_item_after_sell_date
       def  test_conjured_item_after_sell_date_at_zero_quality
    end
    I tried
    28
    Thursday, April 24, 14

    View Slide

  63. @sandimetz Apr 2014
    class  GildedRoseTest  <  Minitest::Test
       def  test_conjured_item_before_sell_date
       def  test_conjured_item_at_zero_quality
       def  test_conjured_item_on_sell_date
       def  test_conjured_item_on_sell_date_at_zero_quality
       def  test_conjured_item_after_sell_date
       def  test_conjured_item_after_sell_date_at_zero_quality
    end
    but failed
    29
    Thursday, April 24, 14

    View Slide

  64. @sandimetz Apr 2014
    class  GildedRoseTest  <  Minitest::Test
       def  test_conjured_item_before_sell_date
       def  test_conjured_item_at_zero_quality
       def  test_conjured_item_on_sell_date
       def  test_conjured_item_on_sell_date_at_zero_quality
       def  test_conjured_item_after_sell_date
       def  test_conjured_item_after_sell_date_at_zero_quality
    end
    miserably
    30
    Thursday, April 24, 14

    View Slide

  65. @sandimetz Apr 2014
    the pattern failed me
    31
    Thursday, April 24, 14

    View Slide

  66. @sandimetz Apr 2014
    32
    Thursday, April 24, 14

    View Slide

  67. @sandimetz Apr 2014
    Task:
    32
    Thursday, April 24, 14

    View Slide

  68. @sandimetz Apr 2014
    Task:
    Refactor code so I can
    Implement Conjured
    32
    Thursday, April 24, 14

    View Slide

  69. @sandimetz Apr 2014
    class  GildedRoseTest  <  Minitest::Test
       def  test_normal_item_before_sell_date
       def  test_normal_item_on_sell_date
       def  test_normal_item_after_sell_date
       def  test_normal_item_of_zero_quality
    normal
    33
    Thursday, April 24, 14

    View Slide

  70. @sandimetz Apr 2014
       def  tick
           if  @name  !=  'Aged  Brie'  &&  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  c
               if  @quality  >  0
                   if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                       @quality  -­‐=  1
                   end
               end
           else
               if  @quality  <  50
                     @quality  +=  1
                   if  @name  ==  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  @days_remaining  <  11
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                       if  @days_remaining  <  6
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                   end
               end
           end
           #  ....
       def  tick
           if  name  !=  'Aged  Brie'  &&  name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               if  quality  >  0
                   if  name  !=  'Sulfuras,  Hand  of  Ragnaros'
                       @quality  -­‐=  1
                   end
               end
           else
               if  quality  <  50
                     @quality  +=  1
                   if  name  ==  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  days_remaining  <  11
                           if  quality  <  50
                               @quality  +=  1
                           end
                       end
                       if  days_remaining  <  6
                           if  quality  <  50
                               @quality  +=  1
                           end
                       end
                   end
               end
           end
           if  name  !=  'Sulfuras,  Hand  of  Ragnaros'
               @days_remaining  -­‐=  1
           end
           if  days_remaining  <  0
               if  name  !=  "Aged  Brie"
                   if  name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  quality  >  0
                           if  name  !=  'Sulfuras,  Hand  of  Ragnaros'
                               @quality  -­‐=  1
                           end
                       end
                   else
                       @quality  =  quality  -­‐  quality
                   end
               else
                   if  quality  <  50
                       @quality  +=  1
                   end
               end
           end
       end
    end
    34
    Thursday, April 24, 14

    View Slide

  71. @sandimetz Apr 2014
       def  tick
           if  @name  !=  'Aged  Brie'  &&  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  c
               if  @quality  >  0
                   if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                       @quality  -­‐=  1
                   end
               end
           else
               if  @quality  <  50
                     @quality  +=  1
                   if  @name  ==  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  @days_remaining  <  11
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                       if  @days_remaining  <  6
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                   end
               end
           end
           #  ....
       def  tick
           if  name  !=  'Aged  Brie'  &&  name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               if  quality  >  0
                   if  name  !=  'Sulfuras,  Hand  of  Ragnaros'
                       @quality  -­‐=  1
                   end
               end
           else
               if  quality  <  50
                     @quality  +=  1
                   if  name  ==  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  days_remaining  <  11
                           if  quality  <  50
                               @quality  +=  1
                           end
                       end
                       if  days_remaining  <  6
                           if  quality  <  50
                               @quality  +=  1
                           end
                       end
                   end
               end
           end
           if  name  !=  'Sulfuras,  Hand  of  Ragnaros'
               @days_remaining  -­‐=  1
           end
           if  days_remaining  <  0
               if  name  !=  "Aged  Brie"
                   if  name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  quality  >  0
                           if  name  !=  'Sulfuras,  Hand  of  Ragnaros'
                               @quality  -­‐=  1
                           end
                       end
                   else
                       @quality  =  quality  -­‐  quality
                   end
               else
                   if  quality  <  50
                       @quality  +=  1
                   end
               end
           end
       end
    end
    34
    Thursday, April 24, 14

    View Slide

  72. @sandimetz Apr 2014
       def  tick
           if  @name  !=  'Aged  Brie'  &&  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  c
               if  @quality  >  0
                   if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                       @quality  -­‐=  1
                   end
               end
           else
               if  @quality  <  50
                     @quality  +=  1
                   if  @name  ==  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  @days_remaining  <  11
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                       if  @days_remaining  <  6
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                   end
       def  tick
           if  name  ==  'normal'
               return
           end
           if  name  !=  'Aged  Brie'  &&  name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               if  quality  >  0
                   if  name  !=  'Sulfuras,  Hand  of  Ragnaros'
                       @quality  -­‐=  1
                   end
               end
           else
               if  quality  <  50
                     @quality  +=  1
                   if  name  ==  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  days_remaining  <  11
                           if  quality  <  50
                               @quality  +=  1
                           end
                       end
                       if  days_remaining  <  6
                           if  quality  <  50
                               @quality  +=  1
                           end
                       end
                   end
               end
           end
           if  name  !=  'Sulfuras,  Hand  of  Ragnaros'
               @days_remaining  -­‐=  1
           end
           if  days_remaining  <  0
               if  name  !=  "Aged  Brie"
                   if  name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  quality  >  0
                           if  name  !=  'Sulfuras,  Hand  of  Ragnaros'
                               @quality  -­‐=  1
                           end
                       end
                   else
                       @quality  =  quality  -­‐  quality
                   end
               else
                   if  quality  <  50
                       @quality  +=  1
                   end
               end
           end
       end
    end
    35
    Thursday, April 24, 14

    View Slide

  73. @sandimetz Apr 2014
       def  tick
           if  name  ==  'normal'
               return
           end
           if  @name  !=  'Aged  Brie'  &&  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  c
               if  @quality  >  0
                   if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                       @quality  -­‐=  1
                   end
               end
           else
               if  @quality  <  50
                     @quality  +=  1
                   if  @name  ==  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  @days_remaining  <  11
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                       if  @days_remaining  <  6
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                   end
       def  tick
           if  name  ==  'normal'
               return
           end
           if  name  !=  'Aged  Brie'  &&  name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               if  quality  >  0
                   if  name  !=  'Sulfuras,  Hand  of  Ragnaros'
                       @quality  -­‐=  1
                   end
               end
           else
               if  quality  <  50
                     @quality  +=  1
                   if  name  ==  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  days_remaining  <  11
                           if  quality  <  50
                               @quality  +=  1
                           end
                       end
                       if  days_remaining  <  6
                           if  quality  <  50
                               @quality  +=  1
                           end
                       end
                   end
               end
           end
           if  name  !=  'Sulfuras,  Hand  of  Ragnaros'
               @days_remaining  -­‐=  1
           end
           if  days_remaining  <  0
               if  name  !=  "Aged  Brie"
                   if  name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  quality  >  0
                           if  name  !=  'Sulfuras,  Hand  of  Ragnaros'
                               @quality  -­‐=  1
                           end
                       end
                   else
                       @quality  =  quality  -­‐  quality
                   end
               else
                   if  quality  <  50
                       @quality  +=  1
                   end
               end
           end
       end
    end
    36
    Thursday, April 24, 14

    View Slide

  74. @sandimetz Apr 2014
    #  Running:
    .S...S...S..SFF....F.....SS.F..
    Fabulous  run  in  0.020340s,  1524.0905  runs/s,  2310.7178  assertions/s.
       1)  Failure:
    GildedRoseTest#test_normal_item_of_zero_quality  [gilded_rose_test.rb:37]:
    Expected:  4
       Actual:  5
       2)  Failure:
    GildedRoseTest#test_normal_item_before_sell_date  [gilded_rose_test.rb:12]:
    Expected:  9
       Actual:  10
       3)  Failure:
    GildedRoseTest#test_normal_item_on_sell_date  [gilded_rose_test.rb:20]:
    Expected:  8
       Actual:  10
       4)  Failure:
    GildedRoseTest#test_normal_item_after_sell_date  [gilded_rose_test.rb:28]:
    Expected:  8
       Actual:  10
    31  runs,  47  assertions,  4  failures,  0  errors,  6  skips
    37
    Thursday, April 24, 14

    View Slide

  75. @sandimetz Apr 2014
    #  Running:
    .S...S...S..SFF....F.....SS.F..
    Fabulous  run  in  0.020340s,  1524.0905  runs/s,  2310.7178  assertions/s.
       1)  Failure:
    GildedRoseTest#test_normal_item_of_zero_quality  [gilded_rose_test.rb:37]:
    Expected:  4
       Actual:  5
       2)  Failure:
    GildedRoseTest#test_normal_item_before_sell_date  [gilded_rose_test.rb:12]:
    Expected:  9
       Actual:  10
       3)  Failure:
    GildedRoseTest#test_normal_item_on_sell_date  [gilded_rose_test.rb:20]:
    Expected:  8
       Actual:  10
       4)  Failure:
    GildedRoseTest#test_normal_item_after_sell_date  [gilded_rose_test.rb:28]:
    Expected:  8
       Actual:  10
    31  runs,  47  assertions,  4  failures,  0  errors,  6  skips
    4 failures
    37
    Thursday, April 24, 14

    View Slide

  76. @sandimetz Apr 2014
    class  GildedRose
       def  tick
           if  name  ==  'normal'
               return
           end
           if  @name  !=  'Aged  Brie'  &&  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  c
               if  @quality  >  0
                   if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                       #  ...  40  more  lines
       end
    end
    38
    Thursday, April 24, 14

    View Slide

  77. @sandimetz Apr 2014
    class  GildedRose
       def  tick
           if  name  ==  'normal'
               return
           end
           if  @name  !=  'Aged  Brie'  &&  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  c
               if  @quality  >  0
                   if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                       #  ...  40  more  lines
       end
       def  normal_tick
       end
    end
    39
    Thursday, April 24, 14

    View Slide

  78. @sandimetz Apr 2014
    class  GildedRose
       def  tick
           if  name  ==  'normal'
               return  normal_tick
           end
           if  @name  !=  'Aged  Brie'  &&  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  c
               if  @quality  >  0
                   if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                       #  ...  40  more  lines
       end
       def  normal_tick
       end
    end
    40
    Thursday, April 24, 14

    View Slide

  79. @sandimetz Apr 2014
    #  Running:
    .S...S...S..SFF....F.....SS.F..
    Fabulous  run  in  0.020340s,  1524.0905  runs/s,  2310.7178  assertions/s.
       1)  Failure:
    GildedRoseTest#test_normal_item_of_zero_quality  [gilded_rose_test.rb:37]:
    Expected:  4
       Actual:  5
       2)  Failure:
    GildedRoseTest#test_normal_item_before_sell_date  [gilded_rose_test.rb:12]:
    Expected:  9
       Actual:  10
       3)  Failure:
    GildedRoseTest#test_normal_item_on_sell_date  [gilded_rose_test.rb:20]:
    Expected:  8
       Actual:  10
       4)  Failure:
    GildedRoseTest#test_normal_item_after_sell_date  [gilded_rose_test.rb:28]:
    Expected:  8
       Actual:  10
    31  runs,  47  assertions,  4  failures,  0  errors,  6  skips
    4 failures
    41
    Thursday, April 24, 14

    View Slide

  80. @sandimetz Apr 2014
       def  test_normal_item_before_sell_date
           item  =  GildedRose.new('normal',  10,  5)
           item.tick
           assert_equal  9,  item.quality
           assert_equal  4,  item.days_remaining
       end
    42
    Thursday, April 24, 14

    View Slide

  81. @sandimetz Apr 2014
       def  test_normal_item_before_sell_date
           item  =  GildedRose.new('normal',  10,  5)
           item.tick
           assert_equal  9,  item.quality
           assert_equal  4,  item.days_remaining
       end
    class  GildedRose
       #  ...
       def  normal_tick
       end
    end
    43
    Thursday, April 24, 14

    View Slide

  82. @sandimetz Apr 2014
       def  test_normal_item_before_sell_date
           item  =  GildedRose.new('normal',  10,  5)
           item.tick
           assert_equal  9,  item.quality
           assert_equal  4,  item.days_remaining
       end
    class  GildedRose
       #  ...
       def  normal_tick
       end
    end
    43
    Thursday, April 24, 14

    View Slide

  83. @sandimetz Apr 2014
       def  test_normal_item_before_sell_date
           item  =  GildedRose.new('normal',  10,  5)
           item.tick
           assert_equal  9,  item.quality
           assert_equal  4,  item.days_remaining
       end
    class  GildedRose
       #  ...
       def  normal_tick
           @quality  -­‐=  1
           @days_remaining  -­‐=  1
       end
    end
    44
    Thursday, April 24, 14

    View Slide

  84. @sandimetz Apr 2014
       def  test_normal_item_before_sell_date
           item  =  GildedRose.new('normal',  10,  5)
           item.tick
           assert_equal  9,  item.quality
           assert_equal  4,  item.days_remaining
       end
    class  GildedRose
       #  ...
       def  normal_tick
           @quality  -­‐=  1
           @days_remaining  -­‐=  1
       end
    end
    44
    Thursday, April 24, 14

    View Slide

  85. @sandimetz Apr 2014
       def  test_normal_item_before_sell_date
           item  =  GildedRose.new('normal',  10,  5)
           item.tick
           assert_equal  9,  item.quality
           assert_equal  4,  item.days_remaining
       end
    class  GildedRose
       #  ...
       def  normal_tick
           @quality  -­‐=  1
           @days_remaining  -­‐=  1
       end
    end
    44
    Thursday, April 24, 14

    View Slide

  86. @sandimetz Apr 2014
    #  Running:
    .....S...FS....FS.S...FS....S..
    Fabulous  run  in  0.029178s,  1062.4443  runs/s,  1713.6199  assertions/s.
       1)  Failure:
    GildedRoseTest#test_normal_item_of_zero_quality  [gilded_rose_test.rb:38]:
    Expected:  0
       Actual:  -­‐1
       2)  Failure:
    GildedRoseTest#test_normal_item_after_sell_date  [gilded_rose_test.rb:30]:
    Expected:  8
       Actual:  9
       3)  Failure:
    GildedRoseTest#test_normal_item_on_sell_date  [gilded_rose_test.rb:22]:
    Expected:  8
       Actual:  9
    31  runs,  50  assertions,  3  failures,  0  errors,  6  skips
    3 failures
    45
    Thursday, April 24, 14

    View Slide

  87. @sandimetz Apr 2014
       def  test_normal_item_on_sell_date
           item  =  GildedRose.new('normal',  10,  0)
           item.tick
           assert_equal    8,  item.quality
           assert_equal  -­‐1,  item.days_remaining
       end
    class  GildedRose
       #  ...
       def  normal_tick
           @quality  -­‐=  1
           @days_remaining  -­‐=  1
       end
    end
    46
    Thursday, April 24, 14

    View Slide

  88. @sandimetz Apr 2014
       def  test_normal_item_on_sell_date
           item  =  GildedRose.new('normal',  10,  0)
           item.tick
           assert_equal    8,  item.quality
           assert_equal  -­‐1,  item.days_remaining
       end
    class  GildedRose
       #  ...
       def  normal_tick
           @quality  -­‐=  1
           @days_remaining  -­‐=  1
       end
    end
    46
    Thursday, April 24, 14

    View Slide

  89. @sandimetz Apr 2014
       def  test_normal_item_on_sell_date
           item  =  GildedRose.new('normal',  10,  0)
           item.tick
           assert_equal    8,  item.quality
           assert_equal  -­‐1,  item.days_remaining
       end
    class  GildedRose
       #  ...
       def  normal_tick
           @quality  -­‐=  1
           @days_remaining  -­‐=  1
       end
    end
    46
    Thursday, April 24, 14

    View Slide

  90. @sandimetz Apr 2014
       def  test_normal_item_on_sell_date
           item  =  GildedRose.new('normal',  10,  0)
           item.tick
           assert_equal    8,  item.quality
           assert_equal  -­‐1,  item.days_remaining
       end
    class  GildedRose
       #  ...
       def  normal_tick
               @quality  -­‐=  1
           @days_remaining  -­‐=  1
       end
    end
    47
    Thursday, April 24, 14

    View Slide

  91. @sandimetz Apr 2014
       def  test_normal_item_on_sell_date
           item  =  GildedRose.new('normal',  10,  0)
           item.tick
           assert_equal    8,  item.quality
           assert_equal  -­‐1,  item.days_remaining
       end
    class  GildedRose
       #  ...
       def  normal_tick
           if  @days_remaining  >  0
               @quality  -­‐=  1
           end
           @days_remaining  -­‐=  1
       end
    end
    48
    Thursday, April 24, 14

    View Slide

  92. @sandimetz Apr 2014
       def  test_normal_item_on_sell_date
           item  =  GildedRose.new('normal',  10,  0)
           item.tick
           assert_equal    8,  item.quality
           assert_equal  -­‐1,  item.days_remaining
       end
    class  GildedRose
       #  ...
       def  normal_tick
           if  @days_remaining  >  0
               @quality  -­‐=  1
           end
           if  @days_remaining  <=  0
               @quality  -­‐=  2
           end
           @days_remaining  -­‐=  1
       end
    end
    49
    Thursday, April 24, 14

    View Slide

  93. @sandimetz Apr 2014
    #  Running:
    ...S.S.....S..S..SF.....S......
    Fabulous  run  in  0.019924s,  1555.9125  runs/s,  2459.3455  assertions/s.
       1)  Failure:
    GildedRoseTest#test_normal_item_of_zero_quality  [gilded_rose_test.rb:37]:
    Expected:  0
       Actual:  -­‐1
    31  runs,  49  assertions,  1  failures,  0  errors,  6  skips
    1 failure ??
    50
    Thursday, April 24, 14

    View Slide

  94. @sandimetz Apr 2014
    #  Running:
    ...S.S.....S..S..SF.....S......
    Fabulous  run  in  0.019924s,  1555.9125  runs/s,  2459.3455  assertions/s.
       1)  Failure:
    GildedRoseTest#test_normal_item_of_zero_quality  [gilded_rose_test.rb:37]:
    Expected:  0
       Actual:  -­‐1
    31  runs,  49  assertions,  1  failures,  0  errors,  6  skips
    1 failure ??
    50
    Thursday, April 24, 14

    View Slide

  95. @sandimetz Apr 2014
       def  test_normal_item_of_zero_quality
           item  =  GildedRose.new('normal',  0,  5)
           item.tick
           assert_equal  0,  item.quality
           assert_equal  4,  item.days_remaining
       end
    class  GildedRose
         #  ...
       def  normal_tick
           if  @days_remaining  >  0
               @quality  -­‐=  1
           end
           if  @days_remaining  <=  0
               @quality  -­‐=  2
           end
           @days_remaining  -­‐=  1
       end  
    end
    51
    Thursday, April 24, 14

    View Slide

  96. @sandimetz Apr 2014
       def  test_normal_item_of_zero_quality
           item  =  GildedRose.new('normal',  0,  5)
           item.tick
           assert_equal  0,  item.quality
           assert_equal  4,  item.days_remaining
       end
    class  GildedRose
         #  ...
       def  normal_tick
           if  @days_remaining  >  0
               @quality  -­‐=  1
           end
           if  @days_remaining  <=  0
               @quality  -­‐=  2
           end
           @days_remaining  -­‐=  1
       end  
    end
    51
    Thursday, April 24, 14

    View Slide

  97. @sandimetz Apr 2014
       def  test_normal_item_of_zero_quality
           item  =  GildedRose.new('normal',  0,  5)
           item.tick
           assert_equal  0,  item.quality
           assert_equal  4,  item.days_remaining
       end
    class  GildedRose
         #  ...
       def  normal_tick
           if  @days_remaining  >  0
               @quality  -­‐=  1
           end
           if  @days_remaining  <=  0
               @quality  -­‐=  2
           end
           @days_remaining  -­‐=  1
       end  
    end
    51
    Thursday, April 24, 14

    View Slide

  98. @sandimetz Apr 2014
       def  test_normal_item_of_zero_quality
           item  =  GildedRose.new('normal',  0,  5)
           item.tick
           assert_equal  0,  item.quality
           assert_equal  4,  item.days_remaining
       end
    class  GildedRose
         #  ...
       def  normal_tick
               if  @days_remaining  >  0
                   @quality  -­‐=  1
               end
               if  @days_remaining  <=  0
                   @quality  -­‐=  2
               end
           @days_remaining  -­‐=  1
       end  
    end
    52
    Thursday, April 24, 14

    View Slide

  99. @sandimetz Apr 2014
       def  test_normal_item_of_zero_quality
           item  =  GildedRose.new('normal',  0,  5)
           item.tick
           assert_equal  0,  item.quality
           assert_equal  4,  item.days_remaining
       end
    class  GildedRose
         #  ...
       def  normal_tick
           if  @quality  !=  0
               if  @days_remaining  >  0
                   @quality  -­‐=  1
               end
               if  @days_remaining  <=  0
                   @quality  -­‐=  2
               end
           end
           @days_remaining  -­‐=  1
       end
    end
    53
    Thursday, April 24, 14

    View Slide

  100. @sandimetz Apr 2014
    #  Running:
    S..S.S...S..........S....S.....
    Fabulous  run  in  0.002800s,  11071.4286  runs/s,  17857.1429  assertions/s.
    31  runs,  50  assertions,  0  failures,  0  errors,  6  skips
    54
    Thursday, April 24, 14

    View Slide

  101. @sandimetz Apr 2014
    refactor under green
    55
    Thursday, April 24, 14

    View Slide

  102. @sandimetz Apr 2014
    reach for the
    lowest hanging green
    56
    Thursday, April 24, 14

    View Slide

  103. @sandimetz Apr 2014
       def  normal_tick
           if  @quality  !=  0
               if  @days_remaining  >  0
                   @quality  -­‐=  1
               end
               if  @days_remaining  <=  0
                   @quality  -­‐=  2
               end
           end
           @days_remaining  -­‐=  1
       end
    57
    Thursday, April 24, 14

    View Slide

  104. @sandimetz Apr 2014
       def  normal_tick
       end
       def  normal_tick
           if  @quality  !=  0
               if  @days_remaining  >  0
                   @quality  -­‐=  1
               end
               if  @days_remaining  <=  0
                   @quality  -­‐=  2
               end
           end
           @days_remaining  -­‐=  1
       end
    58
    Thursday, April 24, 14

    View Slide

  105. @sandimetz Apr 2014
       def  normal_tick
           @days_remaining  -­‐=  1
       end
       def  normal_tick
           if  @quality  !=  0
               if  @days_remaining  >  0
                   @quality  -­‐=  1
               end
               if  @days_remaining  <=  0
                   @quality  -­‐=  2
               end
           end
           @days_remaining  -­‐=  1
       end
    59
    Thursday, April 24, 14

    View Slide

  106. @sandimetz Apr 2014
       def  normal_tick
           @days_remaining  -­‐=  1
       end
       def  normal_tick
           if  @quality  !=  0
               if  @days_remaining  >  0
                   @quality  -­‐=  1
               end
               if  @days_remaining  <=  0
                   @quality  -­‐=  2
               end
           end
       end
    60
    Thursday, April 24, 14

    View Slide

  107. @sandimetz Apr 2014
       def  normal_tick
           @days_remaining  -­‐=  1
           return  if  @quality  ==  0
       end
       def  normal_tick
           if  @quality  !=  0
               if  @days_remaining  >  0
                   @quality  -­‐=  1
               end
               if  @days_remaining  <=  0
                   @quality  -­‐=  2
               end
           end
       end
    61
    Thursday, April 24, 14

    View Slide

  108. @sandimetz Apr 2014
       def  normal_tick
           @days_remaining  -­‐=  1
           return  if  @quality  ==  0
       end
       def  normal_tick
               if  @days_remaining  >  0
                   @quality  -­‐=  1
               end
               if  @days_remaining  <=  0
                   @quality  -­‐=  2
               end
       end
    62
    Thursday, April 24, 14

    View Slide

  109. @sandimetz Apr 2014
       def  normal_tick
           @days_remaining  -­‐=  1
           return  if  @quality  ==  0
           @quality  -­‐=  1
       end
       def  normal_tick
               if  @days_remaining  >  0
                   @quality  -­‐=  1
               end
               if  @days_remaining  <=  0
                   @quality  -­‐=  2
               end
       end
    63
    Thursday, April 24, 14

    View Slide

  110. @sandimetz Apr 2014
       def  normal_tick
           @days_remaining  -­‐=  1
           return  if  @quality  ==  0
           @quality  -­‐=  1
           @quality  -­‐=  1  if  @days_remaining  <=  0
       end
       def  normal_tick
               if  @days_remaining  >  0
                   @quality  -­‐=  1
               end
               if  @days_remaining  <=  0
                   @quality  -­‐=  2
               end
       end
    64
    Thursday, April 24, 14

    View Slide

  111. @sandimetz Apr 2014
       def  normal_tick
           @days_remaining  -­‐=  1
           return  if  @quality  ==  0
           @quality  -­‐=  1
           @quality  -­‐=  1  if  @days_remaining  <=  0
       end
       def  normal_tick
       end
    65
    Thursday, April 24, 14

    View Slide

  112. @sandimetz Apr 2014
       def  normal_tick
           @days_remaining  -­‐=  1
           return  if  @quality  ==  0
           @quality  -­‐=  1
           @quality  -­‐=  1  if  @days_remaining  <=  0
       end
    66
    Thursday, April 24, 14

    View Slide

  113. @sandimetz Apr 2014
    #  Running:
    S..S.S...S..........S....S.....
    Fabulous  run  in  0.002800s,  11071.4286  runs/s,  17857.1429  assertions/s.
    31  runs,  50  assertions,  0  failures,  0  errors,  6  skips
    67
    Thursday, April 24, 14

    View Slide

  114. @sandimetz Apr 2014
    class  GildedRose
       def  tick
           if  name  ==  'normal'
               return  normal_tick
           end
           if  @name  !=  'Aged  Brie'  &&  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  c
               if  @quality  >  0
                   if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                       #  ...  40  more  lines
       end
    end
    Reprise
    68
    Thursday, April 24, 14

    View Slide

  115. @sandimetz Apr 2014
    class  GildedRose
       def  tick
           if  name  ==  'normal'
               return  normal_tick
           end
           if  @name  !=  'Aged  Brie'  &&  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  c
               if  @quality  >  0
                   if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                       #  ...  40  more  lines
       end
    end
    69
    Thursday, April 24, 14

    View Slide

  116. @sandimetz Apr 2014
    class  GildedRose
       def  tick
           if  name  ==  'normal'
               return  normal_tick
           end
           if  @name  !=  'Aged  Brie'  &&  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  c
               if  @quality  >  0
                   if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                       #  ...  40  more  lines
       end
       def  normal_tick
           @days_remaining  -­‐=  1
           return  if  @quality  ==  0
           @quality  -­‐=  1
           @quality  -­‐=  1  if  @days_remaining  <=  0
       end
    end
    70
    Thursday, April 24, 14

    View Slide

  117. @sandimetz Apr 2014
    class  GildedRose
       def  tick
           if  name  ==  'normal'
               return  normal_tick
           end
           if  @name  !=  'Aged  Brie'  &&  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  c
               if  @quality  >  0
                   if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                       #  ...  40  more  lines
       end
       def  normal_tick
           @days_remaining  -­‐=  1
           return  if  @quality  ==  0
           @quality  -­‐=  1
           @quality  -­‐=  1  if  @days_remaining  <=  0
       end
    end
    normal
    70
    Thursday, April 24, 14

    View Slide

  118. @sandimetz Apr 2014
    class  GildedRoseTest  <  Minitest::Test
    #  def  test_normal  ...  etc
       def  test_brie_before_sell_date
       def  test_brie_before_sell_date_with_max_quality
       def  test_brie_on_sell_date
       def  test_brie_on_sell_date_near_max_quality
       def  test_brie_on_sell_date_with_max_quality
       def  test_brie_after_sell_date
       def  test_brie_after_sell_date_with_max_quality
    #    def  test_sulfuras    ...  etc
    #    def  test_backstage  ...  etc
    end
    brie
    71
    Thursday, April 24, 14

    View Slide

  119. @sandimetz Apr 2014
       def  tick
         if  name  ==  'normal'
               return  normal_tick
           end
           #  ...
       end
    72
    Thursday, April 24, 14

    View Slide

  120. @sandimetz Apr 2014
       def  tick
           case  name
           when  'normal'
               return  normal_tick
           end
           #  ...
       end
    73
    Thursday, April 24, 14

    View Slide

  121. @sandimetz Apr 2014
       def  tick
           case  name
           when  'normal'
               return  normal_tick
           when  'Aged  Brie'
               return  brie_tick
           end
           #  ...
       end
    74
    Thursday, April 24, 14

    View Slide

  122. @sandimetz Apr 2014
       def  tick
           case  name
           when  'normal'
               return  normal_tick
           when  'Aged  Brie'
               return  brie_tick
           end
           #  ...
       end
       def  brie_tick
       end
    75
    Thursday, April 24, 14

    View Slide

  123. @sandimetz Apr 2014
    #  Running:
    .F...F.....S.S.F..S.FF.S.F.FS.S
    Fabulous  run  in  0.027410s,  1130.9741  runs/s,  1678.2196  assertions/s.
       1)  Failure:
    GildedRoseTest#test_brie_on_sell_date_with_max_quality  [gilded_rose_test.rb:78]:
    Expected:  4
       Actual:  5
       2)  Failure:
    GildedRoseTest#test_brie_on_sell_date_near_max_quality  [gilded_rose_test.rb:69]:
    Expected:  50
       Actual:  49
       3)  Failure:
    GildedRoseTest#test_brie_on_sell_date  [gilded_rose_test.rb:61]:
    Expected:  12
       Actual:  10
       4)  Failure:
    GildedRoseTest#test_brie_after_sell_date_with_max_quality  [gilded_rose_test.rb:94]:
    Expected:  -­‐11
       Actual:  -­‐10
       5)  Failure:
    GildedRoseTest#test_brie_before_sell_date_with_max_quality  [gilded_rose_test.rb:54]:
    Expected:  6
       Actual:  7
    7 failures
    76
    Thursday, April 24, 14

    View Slide

  124. @sandimetz Apr 2014
       def  tick
           case  name
           when  'normal'
               return  normal_tick
           when  'Aged  Brie'
               return  brie_tick
           end
           #  ...
       end
       def  brie_tick
       end
    77
    Thursday, April 24, 14

    View Slide

  125. @sandimetz Apr 2014
       def  tick
           case  name
           when  'normal'
               return  normal_tick
           when  'Aged  Brie'
               return  brie_tick
           end
           #  ...
       end
       def  brie_tick
       end
    fast forward...
    77
    Thursday, April 24, 14

    View Slide

  126. @sandimetz Apr 2014
       def  tick
           case  name
           when  'normal'
               return  normal_tick
           when  'Aged  Brie'
               return  brie_tick
           end
           #  ...
       end
       def  brie_tick
           @days_remaining  -­‐=  1
           return  if  @quality  >=  50
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <=  0
       end
    78
    Thursday, April 24, 14

    View Slide

  127. @sandimetz Apr 2014
       def  tick
           case  name
           when  'normal'
               return  normal_tick
           when  'Aged  Brie'
               return  brie_tick
           end
           #  ...
       end
       def  brie_tick
           @days_remaining  -­‐=  1
           return  if  @quality  >=  50
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <=  0
       end
    brie
    78
    Thursday, April 24, 14

    View Slide

  128. @sandimetz Apr 2014
    #  Running:
    ...S......S.....SS.....SS......
    Fabulous  run  in  0.003862s,  8026.9291  runs/s,  12946.6598  assertions/s.
    31  runs,  50  assertions,  0  failures,  0  errors,  6  skips
    79
    Thursday, April 24, 14

    View Slide

  129. @sandimetz Apr 2014
     def  normal_tick
           @days_remaining  -­‐=  1
           return  if  @quality  ==  0
           @quality  -­‐=  1
           @quality  -­‐=  1  if  @days_remaining  <=  0
       end
       def  brie_tick
           @days_remaining  -­‐=  1
           return  if  @quality  >=  50
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <=  0
       end
    Similarity
    80
    Thursday, April 24, 14

    View Slide

  130. @sandimetz Apr 2014
     def  normal_tick
           @days_remaining  -­‐=  1
           return  if  @quality  ==  0
           @quality  -­‐=  1
           @quality  -­‐=  1  if  @days_remaining  <=  0
       end
       def  brie_tick
           @days_remaining  -­‐=  1
           return  if  @quality  >=  50
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <=  0
       end
    81
    Thursday, April 24, 14

    View Slide

  131. @sandimetz Apr 2014
    duplication is far cheaper
    than the wrong abstraction
    82
    Thursday, April 24, 14

    View Slide

  132. @sandimetz Apr 2014
    class  GildedRoseTest  <  Minitest::Test
    #  def  test_normal  ...  etc
    #  def  test_brie      ...  etc
       def  test_sulfuras_before_sell_date
       def  test_sulfuras_on_sell_date
       def  test_sulfuras_after_sell_date
    #  def  test_backstage  ...  etc
    end
    sulfuras
    83
    Thursday, April 24, 14

    View Slide

  133. @sandimetz Apr 2014
       def  tick
           case  name
           when  'normal'
               return  normal_tick
           when  'Aged  Brie'
               return  brie_tick
           when  'Sulfuras,  Hand  of  Ragnaros'
               return  sulfuras_tick
           end
           #  ...
       end
       def  sulfuras_tick
       end
    84
    Thursday, April 24, 14

    View Slide

  134. @sandimetz Apr 2014
    #  Running:
    ...S......S.....SS.....SS......
    Fabulous  run  in  0.003862s,  8026.9291  runs/s,  12946.6598  assertions/s.
    31  runs,  50  assertions,  0  failures,  0  errors,  6  skips
    0 failures ?!?
    85
    Thursday, April 24, 14

    View Slide

  135. @sandimetz Apr 2014
       def  tick
           case  name
           when  'normal'
               return  normal_tick
           when  'Aged  Brie'
               return  brie_tick
           when  'Sulfuras,  Hand  of  Ragnaros'
               return  sulfuras_tick
           end
           #  ...
       end
       def  sulfuras_tick
       end
    86
    Thursday, April 24, 14

    View Slide

  136. @sandimetz Apr 2014
       def  tick
           case  name
           when  'normal'
               return  normal_tick
           when  'Aged  Brie'
               return  brie_tick
           when  'Sulfuras,  Hand  of  Ragnaros'
               return  sulfuras_tick
           end
           #  ...
       end
       def  sulfuras_tick
       end
    nothing changes
    86
    Thursday, April 24, 14

    View Slide

  137. @sandimetz Apr 2014
       def  tick
           case  name
           when  'normal'
               return  normal_tick
           when  'Aged  Brie'
               return  brie_tick
           when  'Sulfuras,  Hand  of  Ragnaros'
               return  sulfuras_tick
           end
           #  ...
       end
       def  sulfuras_tick
       end
    sulfuras
    86
    Thursday, April 24, 14

    View Slide

  138. @sandimetz Apr 2014
    class  GildedRoseTest  <  Minitest::Test
    #  def  test_normal      ...  etc
    #  def  test_brie          ...  etc
    #  def  test_sulfuras  ...  etc
       def  test_backstage_pass_long_before_sell_date
       def  test_backstage_pass_medium_close_to_sell_date_upper_bound
       def  test_backstage_pass_medium_close_to_sell_date_upper_bound_at_max_quality
       def  test_backstage_pass_medium_close_to_sell_date_lower_bound
       def  test_backstage_pass_medium_close_to_sell_date_lower_bound_at_max_quality
       def  test_backstage_pass_very_close_to_sell_date_upper_bound
       def  test_backstage_pass_very_close_to_sell_date_upper_bound_at_max_quality
       def  test_backstage_pass_very_close_to_sell_date_lower_bound
       def  test_backstage_pass_very_close_to_sell_date_lower_bound_at_max_quality
       def  test_backstage_pass_on_sell_date
       def  test_backstage_pass_after_sell_date
    end
    backstage
    87
    Thursday, April 24, 14

    View Slide

  139. @sandimetz Apr 2014
       def  tick
           case  name
           when  'normal'
           when  'Aged  Brie'
           when  'Sulfuras,  Hand  of  Ragnaros'
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               return  backstage_tick
           end
           #  ...
       end
       def  backstage_tick
           @days_remaining  -­‐=  1
           return                            if  @quality  >=  50
           return  @quality  =  0  if  @days_remaining  <  0
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <  10
           @quality  +=  1  if  @days_remaining  <  5
       end
    backstage
    88
    Thursday, April 24, 14

    View Slide

  140. @sandimetz Apr 2014
    #  Running:
    ...S......S.....SS.....SS......
    Fabulous  run  in  0.003472s,  8928.5714  runs/s,  14400.9217  assertions/s.
    31  runs,  50  assertions,  0  failures,  0  errors,  6  skips
    89
    Thursday, April 24, 14

    View Slide

  141. @sandimetz Apr 2014
       def  tick
           case  name
           when  'normal'
               return  normal_tick
           when  'Aged  Brie'
               return  brie_tick
           when  'Sulfuras,  Hand  of  Ragnaros'
               return  sulfuras_tick
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               return  backstage_tick
           end
           if  @name  !=  'Aged  Brie'  &&  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  c
               #  ...
       end
       def  normal_tick
           @days_remaining  -­‐=  1
           return  if  @quality  ==  0
           @quality  -­‐=  1
           @quality  -­‐=  1  if  @days_remaining  <=  0
       end
       def  brie_tick
       def  sulfuras_tick
       def  backstage_tick
    class  GildedRose
       attr_reader  :name,  :quality,  :days_remaining
       def  initialize(name,  quality,  days_remaining)
           @name,  @quality,  @days_remaining  =  name,  quality,  days_remai
       end
       def  tick
           case  name
           when  'normal'
               return  normal_tick
           when  'Aged  Brie'
               return  brie_tick
           when  'Sulfuras,  Hand  of  Ragnaros'
               return  sulfuras_tick
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               return  backstage_tick
           end
           if  name  !=  'Aged  Brie'  &&  name  !=  'Backstage  passes  to  a  TAF
               if  quality  >  0
                   if  name  !=  'Sulfuras,  Hand  of  Ragnaros'
                       @quality  -­‐=  1
                   end
               end
           else
               if  quality  <  50
                     @quality  +=  1
                   if  name  ==  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  days_remaining  <  11
                           if  quality  <  50
                               @quality  +=  1
                           end
                       end
                       if  days_remaining  <  6
                           if  quality  <  50
                               @quality  +=  1
                           end
                       end
                   end
               end
           end
           if  name  !=  'Sulfuras,  Hand  of  Ragnaros'
               @days_remaining  -­‐=  1
           end
           if  days_remaining  <  0
               if  name  !=  "Aged  Brie"
                   if  name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  quality  >  0
                           if  name  !=  'Sulfuras,  Hand  of  Ragnaros'
                               @quality  -­‐=  1
                           end
                       end
                   else
                       @quality  =  quality  -­‐  quality
                   end
               else
                   if  quality  <  50
                       @quality  +=  1
                   end
               end
           end
       end
       def  normal_tick
           @days_remaining  -­‐=  1
           return  if  @quality  ==  0
           @quality  -­‐=  1
           @quality  -­‐=  1  if  @days_remaining  <=  0
       end
       def  brie_tick
           @days_remaining  -­‐=  1
           return  if  @quality  >=  50
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <=  0
       end
       def  sulfuras_tick
       end
       def  backstage_tick
           @days_remaining  -­‐=  1
           return                            if  @quality  >=  50
           return  @quality  =  0  if  @days_remaining  <  0
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <  10
           @quality  +=  1  if  @days_remaining  <  5
       end
    end
    90
    Thursday, April 24, 14

    View Slide

  142. @sandimetz Apr 2014
       def  tick
           case  name
           when  'normal'
               return  normal_tick
           when  'Aged  Brie'
               return  brie_tick
           when  'Sulfuras,  Hand  of  Ragnaros'
               return  sulfuras_tick
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               return  backstage_tick
           end
           if  @name  !=  'Aged  Brie'  &&  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  c
               #  ...
       end
       def  normal_tick
           @days_remaining  -­‐=  1
           return  if  @quality  ==  0
           @quality  -­‐=  1
           @quality  -­‐=  1  if  @days_remaining  <=  0
       end
       def  brie_tick
       def  sulfuras_tick
       def  backstage_tick
    class  GildedRose
       attr_reader  :name,  :quality,  :days_remaining
       def  initialize(name,  quality,  days_remaining)
           @name,  @quality,  @days_remaining  =  name,  quality,  days_remai
       end
       def  tick
           case  name
           when  'normal'
               return  normal_tick
           when  'Aged  Brie'
               return  brie_tick
           when  'Sulfuras,  Hand  of  Ragnaros'
               return  sulfuras_tick
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               return  backstage_tick
           end
           if  name  !=  'Aged  Brie'  &&  name  !=  'Backstage  passes  to  a  TAF
               if  quality  >  0
                   if  name  !=  'Sulfuras,  Hand  of  Ragnaros'
                       @quality  -­‐=  1
                   end
               end
           else
               if  quality  <  50
                     @quality  +=  1
                   if  name  ==  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  days_remaining  <  11
                           if  quality  <  50
                               @quality  +=  1
                           end
                       end
                       if  days_remaining  <  6
                           if  quality  <  50
                               @quality  +=  1
                           end
                       end
                   end
               end
           end
           if  name  !=  'Sulfuras,  Hand  of  Ragnaros'
               @days_remaining  -­‐=  1
           end
           if  days_remaining  <  0
               if  name  !=  "Aged  Brie"
                   if  name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  quality  >  0
                           if  name  !=  'Sulfuras,  Hand  of  Ragnaros'
                               @quality  -­‐=  1
                           end
                       end
                   else
                       @quality  =  quality  -­‐  quality
                   end
               else
                   if  quality  <  50
                       @quality  +=  1
                   end
               end
           end
       end
       def  normal_tick
           @days_remaining  -­‐=  1
           return  if  @quality  ==  0
           @quality  -­‐=  1
           @quality  -­‐=  1  if  @days_remaining  <=  0
       end
       def  brie_tick
           @days_remaining  -­‐=  1
           return  if  @quality  >=  50
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <=  0
       end
       def  sulfuras_tick
       end
       def  backstage_tick
           @days_remaining  -­‐=  1
           return                            if  @quality  >=  50
           return  @quality  =  0  if  @days_remaining  <  0
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <  10
           @quality  +=  1  if  @days_remaining  <  5
       end
    end
    90
    Thursday, April 24, 14

    View Slide

  143. @sandimetz Apr 2014
       def  tick
           case  name
           when  'normal'
               return  normal_tick
           when  'Aged  Brie'
               return  brie_tick
           when  'Sulfuras,  Hand  of  Ragnaros'
               return  sulfuras_tick
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               return  backstage_tick
           end
           if  @name  !=  'Aged  Brie'  &&  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  c
               #  ...
       end
       def  normal_tick
           @days_remaining  -­‐=  1
           return  if  @quality  ==  0
           @quality  -­‐=  1
           @quality  -­‐=  1  if  @days_remaining  <=  0
       end
       def  brie_tick
       def  sulfuras_tick
       def  backstage_tick
    class  GildedRose
       attr_reader  :name,  :quality,  :days_remaining
       def  initialize(name,  quality,  days_remaining)
           @name,  @quality,  @days_remaining  =  name,  quality,  days_remai
       end
       def  tick
           case  name
           when  'normal'
               return  normal_tick
           when  'Aged  Brie'
               return  brie_tick
           when  'Sulfuras,  Hand  of  Ragnaros'
               return  sulfuras_tick
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               return  backstage_tick
           end
           if  name  !=  'Aged  Brie'  &&  name  !=  'Backstage  passes  to  a  TAF
               if  quality  >  0
                   if  name  !=  'Sulfuras,  Hand  of  Ragnaros'
                       @quality  -­‐=  1
                   end
               end
           else
               if  quality  <  50
                     @quality  +=  1
                   if  name  ==  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  days_remaining  <  11
                           if  quality  <  50
                               @quality  +=  1
                           end
                       end
                       if  days_remaining  <  6
                           if  quality  <  50
                               @quality  +=  1
                           end
                       end
                   end
               end
           end
           if  name  !=  'Sulfuras,  Hand  of  Ragnaros'
               @days_remaining  -­‐=  1
           end
           if  days_remaining  <  0
               if  name  !=  "Aged  Brie"
                   if  name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  quality  >  0
                           if  name  !=  'Sulfuras,  Hand  of  Ragnaros'
                               @quality  -­‐=  1
                           end
                       end
                   else
                       @quality  =  quality  -­‐  quality
                   end
               else
                   if  quality  <  50
                       @quality  +=  1
                   end
               end
           end
       end
       def  normal_tick
           @days_remaining  -­‐=  1
           return  if  @quality  ==  0
           @quality  -­‐=  1
           @quality  -­‐=  1  if  @days_remaining  <=  0
       end
       def  brie_tick
           @days_remaining  -­‐=  1
           return  if  @quality  >=  50
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <=  0
       end
       def  sulfuras_tick
       end
       def  backstage_tick
           @days_remaining  -­‐=  1
           return                            if  @quality  >=  50
           return  @quality  =  0  if  @days_remaining  <  0
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <  10
           @quality  +=  1  if  @days_remaining  <  5
       end
    end
    90
    Thursday, April 24, 14

    View Slide

  144. @sandimetz Apr 2014
       def  tick
           case  name
           when  'normal'
               return  normal_tick
           when  'Aged  Brie'
               return  brie_tick
           when  'Sulfuras,  Hand  of  Ragnaros'
               return  sulfuras_tick
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               return  backstage_tick
           end
           if  @name  !=  'Aged  Brie'  &&  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  c
               #  ...
       end
       def  normal_tick
           @days_remaining  -­‐=  1
           return  if  @quality  ==  0
           @quality  -­‐=  1
           @quality  -­‐=  1  if  @days_remaining  <=  0
       end
       def  brie_tick
       def  sulfuras_tick
       def  backstage_tick
    class  GildedRose
       attr_reader  :name,  :quality,  :days_remaining
       def  initialize(name,  quality,  days_remaining)
           @name,  @quality,  @days_remaining  =  name,  quality,  days_remai
       end
       def  tick
           case  name
           when  'normal'
               return  normal_tick
           when  'Aged  Brie'
               return  brie_tick
           when  'Sulfuras,  Hand  of  Ragnaros'
               return  sulfuras_tick
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               return  backstage_tick
           end
           if  name  !=  'Aged  Brie'  &&  name  !=  'Backstage  passes  to  a  TAF
               if  quality  >  0
                   if  name  !=  'Sulfuras,  Hand  of  Ragnaros'
                       @quality  -­‐=  1
                   end
               end
           else
               if  quality  <  50
                     @quality  +=  1
                   if  name  ==  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  days_remaining  <  11
                           if  quality  <  50
                               @quality  +=  1
                           end
                       end
                       if  days_remaining  <  6
                           if  quality  <  50
                               @quality  +=  1
                           end
                       end
                   end
               end
           end
           if  name  !=  'Sulfuras,  Hand  of  Ragnaros'
               @days_remaining  -­‐=  1
           end
           if  days_remaining  <  0
               if  name  !=  "Aged  Brie"
                   if  name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  quality  >  0
                           if  name  !=  'Sulfuras,  Hand  of  Ragnaros'
                               @quality  -­‐=  1
                           end
                       end
                   else
                       @quality  =  quality  -­‐  quality
                   end
               else
                   if  quality  <  50
                       @quality  +=  1
                   end
               end
           end
       end
       def  normal_tick
           @days_remaining  -­‐=  1
           return  if  @quality  ==  0
           @quality  -­‐=  1
           @quality  -­‐=  1  if  @days_remaining  <=  0
       end
       def  brie_tick
           @days_remaining  -­‐=  1
           return  if  @quality  >=  50
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <=  0
       end
       def  sulfuras_tick
       end
       def  backstage_tick
           @days_remaining  -­‐=  1
           return                            if  @quality  >=  50
           return  @quality  =  0  if  @days_remaining  <  0
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <  10
           @quality  +=  1  if  @days_remaining  <  5
       end
    end
    90
    Thursday, April 24, 14

    View Slide

  145. @sandimetz Apr 2014
       def  tick
           case  name
           when  'normal'
               return  normal_tick
           when  'Aged  Brie'
               return  brie_tick
           when  'Sulfuras,  Hand  of  Ragnaros'
               return  sulfuras_tick
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               return  backstage_tick
           end
           if  @name  !=  'Aged  Brie'  &&  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  c
               #  ...
       end
       def  normal_tick
           @days_remaining  -­‐=  1
           return  if  @quality  ==  0
           @quality  -­‐=  1
           @quality  -­‐=  1  if  @days_remaining  <=  0
       end
       def  brie_tick
       def  sulfuras_tick
       def  backstage_tick
    class  GildedRose
       attr_reader  :name,  :quality,  :days_remaining
       def  initialize(name,  quality,  days_remaining)
           @name,  @quality,  @days_remaining  =  name,  quality,  days_remai
       end
       def  tick
           case  name
           when  'normal'
               return  normal_tick
           when  'Aged  Brie'
               return  brie_tick
           when  'Sulfuras,  Hand  of  Ragnaros'
               return  sulfuras_tick
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               return  backstage_tick
           end
           if  name  !=  'Aged  Brie'  &&  name  !=  'Backstage  passes  to  a  TAF
               if  quality  >  0
                   if  name  !=  'Sulfuras,  Hand  of  Ragnaros'
                       @quality  -­‐=  1
                   end
               end
           else
               if  quality  <  50
                     @quality  +=  1
                   if  name  ==  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  days_remaining  <  11
                           if  quality  <  50
                               @quality  +=  1
                           end
                       end
                       if  days_remaining  <  6
                           if  quality  <  50
                               @quality  +=  1
                           end
                       end
                   end
               end
           end
           if  name  !=  'Sulfuras,  Hand  of  Ragnaros'
               @days_remaining  -­‐=  1
           end
           if  days_remaining  <  0
               if  name  !=  "Aged  Brie"
                   if  name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  quality  >  0
                           if  name  !=  'Sulfuras,  Hand  of  Ragnaros'
                               @quality  -­‐=  1
                           end
                       end
                   else
                       @quality  =  quality  -­‐  quality
                   end
               else
                   if  quality  <  50
                       @quality  +=  1
                   end
               end
           end
       end
       def  normal_tick
           @days_remaining  -­‐=  1
           return  if  @quality  ==  0
           @quality  -­‐=  1
           @quality  -­‐=  1  if  @days_remaining  <=  0
       end
       def  brie_tick
           @days_remaining  -­‐=  1
           return  if  @quality  >=  50
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <=  0
       end
       def  sulfuras_tick
       end
       def  backstage_tick
           @days_remaining  -­‐=  1
           return                            if  @quality  >=  50
           return  @quality  =  0  if  @days_remaining  <  0
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <  10
           @quality  +=  1  if  @days_remaining  <  5
       end
    end
    90
    Thursday, April 24, 14

    View Slide

  146. @sandimetz Apr 2014
       def  tick
           case  name
           when  'normal'
               return  normal_tick
           when  'Aged  Brie'
               return  brie_tick
           when  'Sulfuras,  Hand  of  Ragnaros'
               return  sulfuras_tick
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               return  backstage_tick
           end
           if  @name  !=  'Aged  Brie'  &&  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  c
               #  ...
       end
       def  normal_tick
           @days_remaining  -­‐=  1
           return  if  @quality  ==  0
           @quality  -­‐=  1
           @quality  -­‐=  1  if  @days_remaining  <=  0
       end
       def  brie_tick
       def  sulfuras_tick
       def  backstage_tick
    class  GildedRose
       attr_reader  :name,  :quality,  :days_remaining
       def  initialize(name,  quality,  days_remaining)
           @name,  @quality,  @days_remaining  =  name,  quality,  days_remai
       end
       def  tick
           case  name
           when  'normal'
               return  normal_tick
           when  'Aged  Brie'
               return  brie_tick
           when  'Sulfuras,  Hand  of  Ragnaros'
               return  sulfuras_tick
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               return  backstage_tick
           end
           if  name  !=  'Aged  Brie'  &&  name  !=  'Backstage  passes  to  a  TAF
               if  quality  >  0
                   if  name  !=  'Sulfuras,  Hand  of  Ragnaros'
                       @quality  -­‐=  1
                   end
               end
           else
               if  quality  <  50
                     @quality  +=  1
                   if  name  ==  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  days_remaining  <  11
                           if  quality  <  50
                               @quality  +=  1
                           end
                       end
                       if  days_remaining  <  6
                           if  quality  <  50
                               @quality  +=  1
                           end
                       end
                   end
               end
           end
           if  name  !=  'Sulfuras,  Hand  of  Ragnaros'
               @days_remaining  -­‐=  1
           end
           if  days_remaining  <  0
               if  name  !=  "Aged  Brie"
                   if  name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  quality  >  0
                           if  name  !=  'Sulfuras,  Hand  of  Ragnaros'
                               @quality  -­‐=  1
                           end
                       end
                   else
                       @quality  =  quality  -­‐  quality
                   end
               else
                   if  quality  <  50
                       @quality  +=  1
                   end
               end
           end
       end
       def  normal_tick
           @days_remaining  -­‐=  1
           return  if  @quality  ==  0
           @quality  -­‐=  1
           @quality  -­‐=  1  if  @days_remaining  <=  0
       end
       def  brie_tick
           @days_remaining  -­‐=  1
           return  if  @quality  >=  50
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <=  0
       end
       def  sulfuras_tick
       end
       def  backstage_tick
           @days_remaining  -­‐=  1
           return                            if  @quality  >=  50
           return  @quality  =  0  if  @days_remaining  <  0
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <  10
           @quality  +=  1  if  @days_remaining  <  5
       end
    end
    90
    Thursday, April 24, 14

    View Slide

  147. @sandimetz Apr 2014
       def  tick
           case  name
           when  'normal'
               return  normal_tick
           when  'Aged  Brie'
               return  brie_tick
           when  'Sulfuras,  Hand  of  Ragnaros'
               return  sulfuras_tick
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               return  backstage_tick
           end
           if  @name  !=  'Aged  Brie'  &&  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  c
               #  ...
       end
       def  normal_tick
           @days_remaining  -­‐=  1
           return  if  @quality  ==  0
           @quality  -­‐=  1
           @quality  -­‐=  1  if  @days_remaining  <=  0
       end
       def  brie_tick
       def  sulfuras_tick
       def  backstage_tick
    class  GildedRose
       attr_reader  :name,  :quality,  :days_remaining
       def  initialize(name,  quality,  days_remaining)
           @name,  @quality,  @days_remaining  =  name,  quality,  days_remai
       end
       def  tick
           case  name
           when  'normal'
               return  normal_tick
           when  'Aged  Brie'
               return  brie_tick
           when  'Sulfuras,  Hand  of  Ragnaros'
               return  sulfuras_tick
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               return  backstage_tick
           end
           if  name  !=  'Aged  Brie'  &&  name  !=  'Backstage  passes  to  a  TAF
               if  quality  >  0
                   if  name  !=  'Sulfuras,  Hand  of  Ragnaros'
                       @quality  -­‐=  1
                   end
               end
           else
               if  quality  <  50
                     @quality  +=  1
                   if  name  ==  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  days_remaining  <  11
                           if  quality  <  50
                               @quality  +=  1
                           end
                       end
                       if  days_remaining  <  6
                           if  quality  <  50
                               @quality  +=  1
                           end
                       end
                   end
               end
           end
           if  name  !=  'Sulfuras,  Hand  of  Ragnaros'
               @days_remaining  -­‐=  1
           end
           if  days_remaining  <  0
               if  name  !=  "Aged  Brie"
                   if  name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  quality  >  0
                           if  name  !=  'Sulfuras,  Hand  of  Ragnaros'
                               @quality  -­‐=  1
                           end
                       end
                   else
                       @quality  =  quality  -­‐  quality
                   end
               else
                   if  quality  <  50
                       @quality  +=  1
                   end
               end
           end
       end
       def  normal_tick
           @days_remaining  -­‐=  1
           return  if  @quality  ==  0
           @quality  -­‐=  1
           @quality  -­‐=  1  if  @days_remaining  <=  0
       end
       def  brie_tick
           @days_remaining  -­‐=  1
           return  if  @quality  >=  50
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <=  0
       end
       def  sulfuras_tick
       end
       def  backstage_tick
           @days_remaining  -­‐=  1
           return                            if  @quality  >=  50
           return  @quality  =  0  if  @days_remaining  <  0
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <  10
           @quality  +=  1  if  @days_remaining  <  5
       end
    end
    90
    Thursday, April 24, 14

    View Slide

  148. @sandimetz Apr 2014
    #  Running:
    ...S......S.....SS.....SS......
    Fabulous  run  in  0.003472s,  8928.5714  runs/s,  14400.9217  assertions/s.
    31  runs,  50  assertions,  0  failures,  0  errors,  6  skips
    91
    Thursday, April 24, 14

    View Slide

  149. @sandimetz Apr 2014
    small methods are simple
    92
    Thursday, April 24, 14

    View Slide

  150. @sandimetz Apr 2014
    class  GildedRose
       attr_reader  :name,  :quality,  :days_remaining
       def  initialize(name,  quality,  days_remaining)
           @name,  @quality,  @days_remaining  =  name,  quality,  days_remaining
       end
       def  tick
           case  name
           when  'normal'
               normal_tick
           when  'Aged  Brie'
               brie_tick
           when  'Sulfuras,  Hand  of  Ragnaros'
               sulfuras_tick
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               backstage_tick
           end
       end
       def  normal_tick
           @days_remaining  -­‐=  1
           return  if  @quality  ==  0
           @quality  -­‐=  1
           @quality  -­‐=  1  if  @days_remaining  <=  0
       end
       def  brie_tick
           @days_remaining  -­‐=  1
           return  if  @quality  >=  50
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <=  0
       end
       def  sulfuras_tick
       end
       def  backstage_tick
           @days_remaining  -­‐=  1
           return                            if  @quality  >=  50
           return  @quality  =  0  if  @days_remaining  <  0
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <  10
           @quality  +=  1  if  @days_remaining  <  5
       end
    end
    small methods
    93
    Thursday, April 24, 14

    View Slide

  151. @sandimetz Apr 2014
    class  GildedRose
       attr_reader  :name,  :quality,  :days_remaining
       def  initialize(name,  quality,  days_remaining)
           @name,  @quality,  @days_remaining  =  name,  quality,  days_remaining
       end
       def  tick
           case  name
           when  'normal'
               normal_tick
           when  'Aged  Brie'
               brie_tick
           when  'Sulfuras,  Hand  of  Ragnaros'
               sulfuras_tick
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               backstage_tick
           end
       end
       def  normal_tick
           @days_remaining  -­‐=  1
           return  if  @quality  ==  0
           @quality  -­‐=  1
           @quality  -­‐=  1  if  @days_remaining  <=  0
       end
       def  brie_tick
           @days_remaining  -­‐=  1
           return  if  @quality  >=  50
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <=  0
       end
       def  sulfuras_tick
       end
       def  backstage_tick
           @days_remaining  -­‐=  1
           return                            if  @quality  >=  50
           return  @quality  =  0  if  @days_remaining  <  0
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <  10
           @quality  +=  1  if  @days_remaining  <  5
       end
    end
    class  GildedRose
       attr_reader  :name,  :quality,  :days_remaining
       def  initialize(name,  quality,  days_remaining)
           @name,  @quality,  @days_remaining  =  name,  quality,  days_remaining
       end
       def  tick
           if  @name  !=  'Aged  Brie'  &&  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC
               if  @quality  >  0
                   if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                       @quality  -­‐=  1
                   end
               end
           else
               if  @quality  <  50
                     @quality  +=  1
                   if  @name  ==  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  @days_remaining  <  11
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                       if  @days_remaining  <  6
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                   end
               end
           end
           if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
               @days_remaining  -­‐=  1
           end
           if  @days_remaining  <  0
               if  @name  !=  "Aged  Brie"
                   if  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  @quality  >  0
                           if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                               @quality  -­‐=  1
                           end
                       end
                   else
                       @quality  =  @quality  -­‐  @quality
                   end
               else
                   if  @quality  <  50
                       @quality  +=  1
                   end
               end
           end
       end
    end
    big conditional small methods
    94
    Thursday, April 24, 14

    View Slide

  152. @sandimetz Apr 2014
    class  GildedRose
       attr_reader  :name,  :quality,  :days_remaining
       def  initialize(name,  quality,  days_remaining)
           @name,  @quality,  @days_remaining  =  name,  quality,  days_remaining
       end
       def  tick
           case  name
           when  'normal'
               normal_tick
           when  'Aged  Brie'
               brie_tick
           when  'Sulfuras,  Hand  of  Ragnaros'
               sulfuras_tick
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               backstage_tick
           end
       end
       def  normal_tick
           @days_remaining  -­‐=  1
           return  if  @quality  ==  0
           @quality  -­‐=  1
           @quality  -­‐=  1  if  @days_remaining  <=  0
       end
       def  brie_tick
           @days_remaining  -­‐=  1
           return  if  @quality  >=  50
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <=  0
       end
       def  sulfuras_tick
       end
       def  backstage_tick
           @days_remaining  -­‐=  1
           return                            if  @quality  >=  50
           return  @quality  =  0  if  @days_remaining  <  0
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <  10
           @quality  +=  1  if  @days_remaining  <  5
       end
    end
    0
    25
    50
    big conditional
    Total Complexity
    50
    95
    Thursday, April 24, 14

    View Slide

  153. @sandimetz Apr 2014
    class  GildedRose
       attr_reader  :name,  :quality,  :days_remaining
       def  initialize(name,  quality,  days_remaining)
           @name,  @quality,  @days_remaining  =  name,  quality,  days_remaining
       end
       def  tick
           case  name
           when  'normal'
               normal_tick
           when  'Aged  Brie'
               brie_tick
           when  'Sulfuras,  Hand  of  Ragnaros'
               sulfuras_tick
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               backstage_tick
           end
       end
       def  normal_tick
           @days_remaining  -­‐=  1
           return  if  @quality  ==  0
           @quality  -­‐=  1
           @quality  -­‐=  1  if  @days_remaining  <=  0
       end
       def  brie_tick
           @days_remaining  -­‐=  1
           return  if  @quality  >=  50
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <=  0
       end
       def  sulfuras_tick
       end
       def  backstage_tick
           @days_remaining  -­‐=  1
           return                            if  @quality  >=  50
           return  @quality  =  0  if  @days_remaining  <  0
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <  10
           @quality  +=  1  if  @days_remaining  <  5
       end
    end
    0
    25
    50
    big conditional small methods
    tick normal brie backstage other
    40
    Total Complexity
    50
    96
    Thursday, April 24, 14

    View Slide

  154. @sandimetz Apr 2014
    class  GildedRose
       attr_reader  :name,  :quality,  :days_remaining
       def  initialize(name,  quality,  days_remaining)
           @name,  @quality,  @days_remaining  =  name,  quality,  days_remaining
       end
       def  tick
           case  name
           when  'normal'
               normal_tick
           when  'Aged  Brie'
               brie_tick
           when  'Sulfuras,  Hand  of  Ragnaros'
               sulfuras_tick
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               backstage_tick
           end
       end
       def  normal_tick
           @days_remaining  -­‐=  1
           return  if  @quality  ==  0
           @quality  -­‐=  1
           @quality  -­‐=  1  if  @days_remaining  <=  0
       end
       def  brie_tick
           @days_remaining  -­‐=  1
           return  if  @quality  >=  50
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <=  0
       end
       def  sulfuras_tick
       end
       def  backstage_tick
           @days_remaining  -­‐=  1
           return                            if  @quality  >=  50
           return  @quality  =  0  if  @days_remaining  <  0
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <  10
           @quality  +=  1  if  @days_remaining  <  5
       end
    end
    0
    25
    50
    big conditional small methods
    tick normal brie backstage other
    12
    40
    45
    Total Complexity
    50
    96
    Thursday, April 24, 14

    View Slide

  155. @sandimetz Apr 2014
    class  GildedRose
       attr_reader  :name,  :quality,  :days_remaining
       def  initialize(name,  quality,  days_remaining)
           @name,  @quality,  @days_remaining  =  name,  quality,  days_remaining
       end
       def  tick
           case  name
           when  'normal'
               normal_tick
           when  'Aged  Brie'
               brie_tick
           when  'Sulfuras,  Hand  of  Ragnaros'
               sulfuras_tick
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               backstage_tick
           end
       end
       def  normal_tick
           @days_remaining  -­‐=  1
           return  if  @quality  ==  0
           @quality  -­‐=  1
           @quality  -­‐=  1  if  @days_remaining  <=  0
       end
       def  brie_tick
           @days_remaining  -­‐=  1
           return  if  @quality  >=  50
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <=  0
       end
       def  sulfuras_tick
       end
       def  backstage_tick
           @days_remaining  -­‐=  1
           return                            if  @quality  >=  50
           return  @quality  =  0  if  @days_remaining  <  0
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <  10
           @quality  +=  1  if  @days_remaining  <  5
       end
    end
    Complexity
    50
    big conditional
    97
    Thursday, April 24, 14

    View Slide

  156. @sandimetz Apr 2014
    class  GildedRose
       attr_reader  :name,  :quality,  :days_remaining
       def  initialize(name,  quality,  days_remaining)
           @name,  @quality,  @days_remaining  =  name,  quality,  days_remaining
       end
       def  tick
           case  name
           when  'normal'
               normal_tick
           when  'Aged  Brie'
               brie_tick
           when  'Sulfuras,  Hand  of  Ragnaros'
               sulfuras_tick
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               backstage_tick
           end
       end
       def  normal_tick
           @days_remaining  -­‐=  1
           return  if  @quality  ==  0
           @quality  -­‐=  1
           @quality  -­‐=  1  if  @days_remaining  <=  0
       end
       def  brie_tick
           @days_remaining  -­‐=  1
           return  if  @quality  >=  50
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <=  0
       end
       def  sulfuras_tick
       end
       def  backstage_tick
           @days_remaining  -­‐=  1
           return                            if  @quality  >=  50
           return  @quality  =  0  if  @days_remaining  <  0
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <  10
           @quality  +=  1  if  @days_remaining  <  5
       end
    end
    0
    45
    90
    Complexity
    50
    big conditional
    97
    Thursday, April 24, 14

    View Slide

  157. @sandimetz Apr 2014
    class  GildedRose
       attr_reader  :name,  :quality,  :days_remaining
       def  initialize(name,  quality,  days_remaining)
           @name,  @quality,  @days_remaining  =  name,  quality,  days_remaining
       end
       def  tick
           case  name
           when  'normal'
               normal_tick
           when  'Aged  Brie'
               brie_tick
           when  'Sulfuras,  Hand  of  Ragnaros'
               sulfuras_tick
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               backstage_tick
           end
       end
       def  normal_tick
           @days_remaining  -­‐=  1
           return  if  @quality  ==  0
           @quality  -­‐=  1
           @quality  -­‐=  1  if  @days_remaining  <=  0
       end
       def  brie_tick
           @days_remaining  -­‐=  1
           return  if  @quality  >=  50
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <=  0
       end
       def  sulfuras_tick
       end
       def  backstage_tick
           @days_remaining  -­‐=  1
           return                            if  @quality  >=  50
           return  @quality  =  0  if  @days_remaining  <  0
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <  10
           @quality  +=  1  if  @days_remaining  <  5
       end
    end
    0
    45
    90
    Complexity
    50
    84
    40
    small methods
    big conditional 10 Refactorings
    97
    Thursday, April 24, 14

    View Slide

  158. @sandimetz Apr 2014
    Task:
    Implement Conjured
    98
    Thursday, April 24, 14

    View Slide

  159. @sandimetz Apr 2014
       def  normal_tick
           @days_remaining  -­‐=  1
           return  if  @quality  ==  0
           @quality  -­‐=  1
           @quality  -­‐=  1  if  @days_remaining  <=  0
       end
       def  brie_tick
           @days_remaining  -­‐=  1
           return  if  @quality  >=  50
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <=  0
       end
       def  sulfuras_tick
       end
       def  backstage_tick
           @days_remaining  -­‐=  1
           return                            if  @quality  >=  50
           return  @quality  =  0  if  @days_remaining  <  0
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <  10
           @quality  +=  1  if  @days_remaining  <  5
       end
    99
    Thursday, April 24, 14

    View Slide

  160. @sandimetz Apr 2014
       def  normal_tick
           @days_remaining  -­‐=  1
           return  if  @quality  ==  0
           @quality  -­‐=  1
           @quality  -­‐=  1  if  @days_remaining  <=  0
       end
       def  brie_tick
           @days_remaining  -­‐=  1
           return  if  @quality  >=  50
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <=  0
       end
       def  sulfuras_tick
       end
       def  backstage_tick
           @days_remaining  -­‐=  1
           return                            if  @quality  >=  50
           return  @quality  =  0  if  @days_remaining  <  0
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <  10
           @quality  +=  1  if  @days_remaining  <  5
       end
    def  normal_tick
    99
    Thursday, April 24, 14

    View Slide

  161. @sandimetz Apr 2014
       def  normal_tick
           @days_remaining  -­‐=  1
           return  if  @quality  ==  0
           @quality  -­‐=  1
           @quality  -­‐=  1  if  @days_remaining  <=  0
       end
       def  brie_tick
           @days_remaining  -­‐=  1
           return  if  @quality  >=  50
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <=  0
       end
       def  sulfuras_tick
       end
       def  backstage_tick
           @days_remaining  -­‐=  1
           return                            if  @quality  >=  50
           return  @quality  =  0  if  @days_remaining  <  0
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <  10
           @quality  +=  1  if  @days_remaining  <  5
       end
    def  normal_tick
    def  brie_tick
    99
    Thursday, April 24, 14

    View Slide

  162. @sandimetz Apr 2014
       def  normal_tick
           @days_remaining  -­‐=  1
           return  if  @quality  ==  0
           @quality  -­‐=  1
           @quality  -­‐=  1  if  @days_remaining  <=  0
       end
       def  brie_tick
           @days_remaining  -­‐=  1
           return  if  @quality  >=  50
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <=  0
       end
       def  sulfuras_tick
       end
       def  backstage_tick
           @days_remaining  -­‐=  1
           return                            if  @quality  >=  50
           return  @quality  =  0  if  @days_remaining  <  0
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <  10
           @quality  +=  1  if  @days_remaining  <  5
       end
    def  normal_tick
    def  brie_tick
    def  sulfuras_tick
    99
    Thursday, April 24, 14

    View Slide

  163. @sandimetz Apr 2014
       def  normal_tick
           @days_remaining  -­‐=  1
           return  if  @quality  ==  0
           @quality  -­‐=  1
           @quality  -­‐=  1  if  @days_remaining  <=  0
       end
       def  brie_tick
           @days_remaining  -­‐=  1
           return  if  @quality  >=  50
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <=  0
       end
       def  sulfuras_tick
       end
       def  backstage_tick
           @days_remaining  -­‐=  1
           return                            if  @quality  >=  50
           return  @quality  =  0  if  @days_remaining  <  0
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <  10
           @quality  +=  1  if  @days_remaining  <  5
       end
    def  normal_tick
    def  brie_tick
    def  sulfuras_tick
    def  backstage_tick
    99
    Thursday, April 24, 14

    View Slide

  164. @sandimetz Apr 2014
       def  normal_tick
           @days_remaining  -­‐=  1
           return  if  @quality  ==  0
           @quality  -­‐=  1
           @quality  -­‐=  1  if  @days_remaining  <=  0
       end
       def  brie_tick
           @days_remaining  -­‐=  1
           return  if  @quality  >=  50
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <=  0
       end
       def  sulfuras_tick
       end
       def  backstage_tick
           @days_remaining  -­‐=  1
           return                            if  @quality  >=  50
           return  @quality  =  0  if  @days_remaining  <  0
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <  10
           @quality  +=  1  if  @days_remaining  <  5
       end
    def  normal_tick
    def  brie_tick
    def  sulfuras_tick
    def  backstage_tick
    def  conjured_tick
    99
    Thursday, April 24, 14

    View Slide

  165. @sandimetz Apr 2014
       def  normal_tick
           @days_remaining  -­‐=  1
           return  if  @quality  ==  0
           @quality  -­‐=  1
           @quality  -­‐=  1  if  @days_remaining  <=  0
       end
       def  brie_tick
           @days_remaining  -­‐=  1
           return  if  @quality  >=  50
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <=  0
       end
       def  sulfuras_tick
       end
       def  backstage_tick
           @days_remaining  -­‐=  1
           return                            if  @quality  >=  50
           return  @quality  =  0  if  @days_remaining  <  0
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <  10
           @quality  +=  1  if  @days_remaining  <  5
       end
    def  normal_tick
    def  brie_tick
    def  sulfuras_tick
    def  backstage_tick
    def  conjured_tick
    ???
    99
    Thursday, April 24, 14

    View Slide

  166. @sandimetz Apr 2014
    the pattern still fails me
    100
    Thursday, April 24, 14

    View Slide

  167. @sandimetz Apr 2014
    open / closed
    101
    Thursday, April 24, 14

    View Slide

  168. @sandimetz Apr 2014
    open for extension
    102
    Thursday, April 24, 14

    View Slide

  169. @sandimetz Apr 2014
    open for extension
    closed for modification
    103
    Thursday, April 24, 14

    View Slide

  170. @sandimetz Apr 2014
       def  normal_tick
           @days_remaining  -­‐=  1
           return  if  @quality  ==  0
           @quality  -­‐=  1
           @quality  -­‐=  1  if  @days_remaining  <=  0
       end
       def  brie_tick
           @days_remaining  -­‐=  1
           return  if  @quality  >=  50
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <=  0
       end
       def  sulfuras_tick
       end
       def  backstage_tick
           @days_remaining  -­‐=  1
           return                            if  @quality  >=  50
           return  @quality  =  0  if  @days_remaining  <  0
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <  10
           @quality  +=  1  if  @days_remaining  <  5
       end
    def  normal_tick
    def  brie_tick
    def  sulfuras_tick
    def  backstage_tick
    104
    Thursday, April 24, 14

    View Slide

  171. @sandimetz Apr 2014
    OO Principles
    105
    Thursday, April 24, 14

    View Slide

  172. @sandimetz Apr 2014
    OO Principles
    a style guide for
    arranging code
    106
    Thursday, April 24, 14

    View Slide

  173. @sandimetz Apr 2014
       def  normal_tick
           @days_remaining  -­‐=  1
           return  if  @quality  ==  0
           @quality  -­‐=  1
           @quality  -­‐=  1  if  @days_remaining  <=  0
       end
       def  brie_tick
           @days_remaining  -­‐=  1
           return  if  @quality  >=  50
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <=  0
       end
       def  sulfuras_tick
       end
       def  backstage_tick
           @days_remaining  -­‐=  1
           return                            if  @quality  >=  50
           return  @quality  =  0  if  @days_remaining  <  0
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <  10
           @quality  +=  1  if  @days_remaining  <  5
       end
    def  normal_tick
    def  brie_tick
    def  sulfuras_tick
    def  backstage_tick
    107
    Thursday, April 24, 14

    View Slide

  174. @sandimetz Apr 2014
    they’re screaming to get out
    108
    Thursday, April 24, 14

    View Slide

  175. @sandimetz Apr 2014
       def  normal_tick
           @days_remaining  -­‐=  1
           return  if  @quality  ==  0
           @quality  -­‐=  1
           @quality  -­‐=  1  if  @days_remaining  <=  0
       end
       def  brie_tick
           @days_remaining  -­‐=  1
           return  if  @quality  >=  50
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <=  0
       end
       def  sulfuras_tick
       end
       def  backstage_tick
           @days_remaining  -­‐=  1
           return                            if  @quality  >=  50
           return  @quality  =  0  if  @days_remaining  <  0
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <  10
           @quality  +=  1  if  @days_remaining  <  5
       end
    def  normal_tick
    def  brie_tick
    def  sulfuras_tick
    def  backstage_tick
    109
    Thursday, April 24, 14

    View Slide

  176. @sandimetz Apr 2014
    brie_tick
    backstage_tick
    sulfuras_tick
    normal_tick
    GildedRose
    110
    Thursday, April 24, 14

    View Slide

  177. @sandimetz Apr 2014
    brie_tick
    backstage_tick
    sulfuras_tick
    normal_tick
    GildedRose
    110
    Thursday, April 24, 14

    View Slide

  178. @sandimetz Apr 2014
    brie_tick
    backstage_tick
    sulfuras_tick
    normal_tick
    GildedRose
    110
    Thursday, April 24, 14

    View Slide

  179. @sandimetz Apr 2014
    Normal
    brie_tick
    backstage_tick
    sulfuras_tick
    normal_tick
    GildedRose
    111
    Thursday, April 24, 14

    View Slide

  180. @sandimetz Apr 2014
    tick
    Normal
    brie_tick
    backstage_tick
    sulfuras_tick
    normal_tick
    GildedRose
    112
    Thursday, April 24, 14

    View Slide

  181. @sandimetz Apr 2014
    tick
    Normal
    brie_tick
    backstage_tick
    sulfuras_tick
    normal_tick
    GildedRose
    113
    Thursday, April 24, 14

    View Slide

  182. @sandimetz Apr 2014
    tick
    Normal
    brie_tick
    backstage_tick
    sulfuras_tick
    normal_tick
    GildedRose
    113
    Thursday, April 24, 14

    View Slide

  183. @sandimetz Apr 2014
    tick
    Normal
    brie_tick
    backstage_tick
    sulfuras_tick
    GildedRose
    114
    Thursday, April 24, 14

    View Slide

  184. @sandimetz Apr 2014
    tick
    Normal
    GildedRose
    brie_tick
    backstage_tick
    sulfuras_tick
    115
    Thursday, April 24, 14

    View Slide

  185. @sandimetz Apr 2014
    tick
    Normal
    GildedRose
    brie_tick
    backstage_tick
    sulfuras_tick
    116
    Thursday, April 24, 14

    View Slide

  186. @sandimetz Apr 2014
           def  normal_tick
               @days_remaining  -­‐=  1
               return  if  @quality  ==  0
               @quality  -­‐=  1
               @quality  -­‐=  1  if  @days_remaining  <=  0
           end
    117
    Thursday, April 24, 14

    View Slide

  187. @sandimetz Apr 2014
           def  tick
               @days_remaining  -­‐=  1
               return  if  @quality  ==  0
               @quality  -­‐=  1
               @quality  -­‐=  1  if  @days_remaining  <=  0
           end
    118
    Thursday, April 24, 14

    View Slide

  188. @sandimetz Apr 2014
       class  Normal
           def  tick
               @days_remaining  -­‐=  1
               return  if  @quality  ==  0
               @quality  -­‐=  1
               @quality  -­‐=  1  if  @days_remaining  <=  0
           end
       end
    119
    Thursday, April 24, 14

    View Slide

  189. @sandimetz Apr 2014
       class  Normal
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
           def  tick
               @days_remaining  -­‐=  1
               return  if  @quality  ==  0
               @quality  -­‐=  1
               @quality  -­‐=  1  if  @days_remaining  <=  0
           end
       end
    120
    Thursday, April 24, 14

    View Slide

  190. @sandimetz Apr 2014
       class  Normal
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
           def  tick
               @days_remaining  -­‐=  1
               return  if  @quality  ==  0
               @quality  -­‐=  1
               @quality  -­‐=  1  if  @days_remaining  <=  0
           end
       end
    121
    Thursday, April 24, 14

    View Slide

  191. @sandimetz Apr 2014
       
       class  Normal
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
           def  tick
               @days_remaining  -­‐=  1
               return  if  @quality  ==  0
               @quality  -­‐=  1
               @quality  -­‐=  1  if  @days_remaining  <=  0
           end
       end
    122
    Thursday, April 24, 14

    View Slide

  192. @sandimetz Apr 2014
    class  GildedRose  
       def  normal_tick
       end
       class  Normal
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
           def  tick
               @days_remaining  -­‐=  1
               return  if  @quality  ==  0
               @quality  -­‐=  1
               @quality  -­‐=  1  if  @days_remaining  <=  0
           end
       end
    123
    Thursday, April 24, 14

    View Slide

  193. @sandimetz Apr 2014
    class  GildedRose  
       def  normal_tick
           @item  =  Normal.new(quality,  days_remaining)
       end
       class  Normal
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
           def  tick
               @days_remaining  -­‐=  1
               return  if  @quality  ==  0
               @quality  -­‐=  1
               @quality  -­‐=  1  if  @days_remaining  <=  0
           end
       end
    124
    Thursday, April 24, 14

    View Slide

  194. @sandimetz Apr 2014
    class  GildedRose  
       def  normal_tick
           @item  =  Normal.new(quality,  days_remaining)
           item.tick
       end
       class  Normal
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
           def  tick
               @days_remaining  -­‐=  1
               return  if  @quality  ==  0
               @quality  -­‐=  1
               @quality  -­‐=  1  if  @days_remaining  <=  0
           end
       end
    125
    Thursday, April 24, 14

    View Slide

  195. @sandimetz Apr 2014
    tick
    Normal
    GildedRose
    brie_tick
    backstage_tick
    sulfuras_tick
    126
    Thursday, April 24, 14

    View Slide

  196. @sandimetz Apr 2014
    normal is an object
    127
    Thursday, April 24, 14

    View Slide

  197. @sandimetz Apr 2014
    brie/sulfuras/backstage are not
    128
    Thursday, April 24, 14

    View Slide

  198. @sandimetz Apr 2014
    class  GildedRose  
       def  normal_tick
           @item  =  Normal.new(quality,  days_remaining)
           item.tick
       end
    129
    Thursday, April 24, 14

    View Slide

  199. @sandimetz Apr 2014
    class  GildedRose  
       def  normal_tick
           @item  =  Normal.new(quality,  days_remaining)
           item.tick
       end
       def  brie_tick
           @days_remaining  -­‐=  1
           return  if  @quality  >=  50
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <=  0
       end
    130
    Thursday, April 24, 14

    View Slide

  200. @sandimetz Apr 2014
    class  GildedRose  
       def  normal_tick
           @item  =  Normal.new(quality,  days_remaining)
           item.tick
       end
       def  brie_tick
           @days_remaining  -­‐=  1
           return  if  @quality  >=  50
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <=  0
       end
       def  quality
       end
       def  days_remaining
       end
    131
    Thursday, April 24, 14

    View Slide

  201. @sandimetz Apr 2014
    class  GildedRose  
       def  normal_tick
           @item  =  Normal.new(quality,  days_remaining)
           item.tick
       end
       def  brie_tick
           @days_remaining  -­‐=  1
           return  if  @quality  >=  50
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <=  0
       end
       def  quality
           return  item.quality  if  item
       end
       def  days_remaining
       end
    132
    Thursday, April 24, 14

    View Slide

  202. @sandimetz Apr 2014
    class  GildedRose  
       def  normal_tick
           @item  =  Normal.new(quality,  days_remaining)
           item.tick
       end
       def  brie_tick
           @days_remaining  -­‐=  1
           return  if  @quality  >=  50
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <=  0
       end
       def  quality
           return  item.quality  if  item
           @quality
       end
       def  days_remaining
       end
    133
    Thursday, April 24, 14

    View Slide

  203. @sandimetz Apr 2014
    class  GildedRose  
       def  normal_tick
           @item  =  Normal.new(quality,  days_remaining)
           item.tick
       end
       def  brie_tick
           @days_remaining  -­‐=  1
           return  if  @quality  >=  50
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <=  0
       end
       def  quality
           return  item.quality  if  item
           @quality
       end
       def  days_remaining
           return  item.days_remaining  if  item
           @days_remaining
       end
    134
    Thursday, April 24, 14

    View Slide

  204. @sandimetz Apr 2014
    brie
    135
    Thursday, April 24, 14

    View Slide

  205. @sandimetz Apr 2014
    class  GildedRose
       def  brie_tick
           @days_remaining  -­‐=  1
           return  if  @quality  >=  50
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <=  0
       end
    136
    Thursday, April 24, 14

    View Slide

  206. @sandimetz Apr 2014
    class  GildedRose
       def  brie_tick
           @days_remaining  -­‐=  1
           return  if  @quality  >=  50
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <=  0
       end
       class  Brie
       end
    137
    Thursday, April 24, 14

    View Slide

  207. @sandimetz Apr 2014
    class  GildedRose
       def  brie_tick
           @days_remaining  -­‐=  1
           return  if  @quality  >=  50
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <=  0
       end
       class  Brie
           def  tick
           end
       end
    138
    Thursday, April 24, 14

    View Slide

  208. @sandimetz Apr 2014
    class  GildedRose
       def  brie_tick
       end
       class  Brie
           def  tick
               @days_remaining  -­‐=  1
               return  if  @quality  >=  50
               @quality  +=  1
               @quality  +=  1  if  @days_remaining  <=  0
           end
       end
    139
    Thursday, April 24, 14

    View Slide

  209. @sandimetz Apr 2014
    class  GildedRose
       def  brie_tick
       end
       class  Brie
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
           def  tick
               @days_remaining  -­‐=  1
               return  if  @quality  >=  50
               @quality  +=  1
               @quality  +=  1  if  @days_remaining  <=  0
           end
       end
    140
    Thursday, April 24, 14

    View Slide

  210. @sandimetz Apr 2014
    class  GildedRose
       def  brie_tick
           @item  =  Brie.new(quality,  days_remaining)
           item.tick
       end
       class  Brie
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
           def  tick
               @days_remaining  -­‐=  1
               return  if  @quality  >=  50
               @quality  +=  1
               @quality  +=  1  if  @days_remaining  <=  0
           end
       end
    141
    Thursday, April 24, 14

    View Slide

  211. @sandimetz Apr 2014
    sulfuras
    142
    Thursday, April 24, 14

    View Slide

  212. @sandimetz Apr 2014
    class  GildedRose
       def  sulfuras_tick
       end
    143
    Thursday, April 24, 14

    View Slide

  213. @sandimetz Apr 2014
    class  GildedRose
       def  sulfuras_tick
       end
       class  Sulfuras
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
           def  tick
           end
       end
    144
    Thursday, April 24, 14

    View Slide

  214. @sandimetz Apr 2014
    class  GildedRose
       def  sulfuras_tick
       end
       class  Sulfuras
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
           def  tick
           end
       end
    145
    Thursday, April 24, 14

    View Slide

  215. @sandimetz Apr 2014
    class  GildedRose
       def  sulfuras_tick
           @item  =  Sulfuras.new(quality,  days_remaining)
           item.tick
       end
       class  Sulfuras
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
           def  tick
           end
       end
    146
    Thursday, April 24, 14

    View Slide

  216. @sandimetz Apr 2014
    backstage
    147
    Thursday, April 24, 14

    View Slide

  217. @sandimetz Apr 2014
    class  GildedRose
       def  backstage_tick
           @days_remaining  -­‐=  1
           return                            if  @quality  >=  50
           return  @quality  =  0  if  @days_remaining  <  0
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <  10
           @quality  +=  1  if  @days_remaining  <  5
       end
    148
    Thursday, April 24, 14

    View Slide

  218. @sandimetz Apr 2014
    class  GildedRose
       def  backstage_tick
           @days_remaining  -­‐=  1
           return                            if  @quality  >=  50
           return  @quality  =  0  if  @days_remaining  <  0
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <  10
           @quality  +=  1  if  @days_remaining  <  5
       end
       class  Backstage
           def  tick
           end
    149
    Thursday, April 24, 14

    View Slide

  219. @sandimetz Apr 2014
    class  GildedRose
       def  backstage_tick
       end
       class  Backstage
           def  tick
               @days_remaining  -­‐=  1
               return                            if  @quality  >=  50
               return  @quality  =  0  if  @days_remaining  <  0
               @quality  +=  1
               @quality  +=  1  if  @days_remaining  <  10
               @quality  +=  1  if  @days_remaining  <  5
           end
    150
    Thursday, April 24, 14

    View Slide

  220. @sandimetz Apr 2014
    class  GildedRose
       def  backstage_tick
       end
       class  Backstage
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
           def  tick
               @days_remaining  -­‐=  1
               return                            if  @quality  >=  50
               return  @quality  =  0  if  @days_remaining  <  0
               @quality  +=  1
               @quality  +=  1  if  @days_remaining  <  10
               @quality  +=  1  if  @days_remaining  <  5
           end
    151
    Thursday, April 24, 14

    View Slide

  221. @sandimetz Apr 2014
    class  GildedRose
       def  backstage_tick
       end
       class  Backstage
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
           def  tick
               @days_remaining  -­‐=  1
               return                            if  @quality  >=  50
               return  @quality  =  0  if  @days_remaining  <  0
               @quality  +=  1
               @quality  +=  1  if  @days_remaining  <  10
               @quality  +=  1  if  @days_remaining  <  5
           end
    152
    Thursday, April 24, 14

    View Slide

  222. @sandimetz Apr 2014
    class  GildedRose
       def  backstage_tick
       end
       class  Backstage
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
           def  tick
               @days_remaining  -­‐=  1
               return                            if  @quality  >=  50
               return  @quality  =  0  if  @days_remaining  <  0
               @quality  +=  1
               @quality  +=  1  if  @days_remaining  <  10
               @quality  +=  1  if  @days_remaining  <  5
           end
    153
    Thursday, April 24, 14

    View Slide

  223. @sandimetz Apr 2014
    class  GildedRose
       def  backstage_tick
           @item  =  Backstage.new(quality,  days_remaining)
           item.tick
       end
       class  Backstage
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
           def  tick
               @days_remaining  -­‐=  1
               return                            if  @quality  >=  50
               return  @quality  =  0  if  @days_remaining  <  0
               @quality  +=  1
               @quality  +=  1  if  @days_remaining  <  10
               @quality  +=  1  if  @days_remaining  <  5
           end
    154
    Thursday, April 24, 14

    View Slide

  224. @sandimetz Apr 2014
    normal/brie/sulfuras/backstage
    are now objects
    155
    Thursday, April 24, 14

    View Slide

  225. @sandimetz Apr 2014
    GildedRose
    tick
    Normal
    tick
    Brie
    tick
    Sulfuras
    attr_reader  :item
    tick
    Backstage
    attr_reader
       :quality,
       :days_remaining
    156
    Thursday, April 24, 14

    View Slide

  226. @sandimetz Apr 2014
    class  GildedRose
       def  tick
           case  name
           when  'normal'
               normal_tick
           when  'Aged  Brie'
               brie_tick
           when  'Sulfuras,  Hand  of  Ragnaros'
               sulfuras_tick
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               backstage_tick
           end
       end
       def  normal_tick
           @item  =  Normal.new(quality,  days_remaining)
           item.tick
       end
       def  brie_tick
           @item  =  Brie.new(quality,  days_remaining)
           item.tick
       end
       #  etc
    157
    Thursday, April 24, 14

    View Slide

  227. @sandimetz Apr 2014
    rewind
    158
    Thursday, April 24, 14

    View Slide

  228. @sandimetz Apr 2014
    class  GildedRose
       def  tick
           case  name
           when  'normal'
               normal_tick
           when  'Aged  Brie'
               brie_tick
           when  'Sulfuras,  Hand  of  Ragnaros'
               sulfuras_tick
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               backstage_tick
           end
       end
       def  normal_tick
           @item  =  Normal.new(quality,  days_remaining)
           item.tick
       end
       def  brie_tick
           @item  =  Brie.new(quality,  days_remaining)
           item.tick
       end
       #  etc
    159
    Thursday, April 24, 14

    View Slide

  229. @sandimetz Apr 2014
    class  GildedRose
       def  tick
           case  name
           when  'normal'
               normal_tick
           when  'Aged  Brie'
               brie_tick
           when  'Sulfuras,  Hand  of  Ragnaros'
               sulfuras_tick
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               backstage_tick
           end
       end
       def  normal_tick
           @item  =  Normal.new(quality,  days_remaining)
           item.tick
       end
       def  brie_tick
           @item  =  Brie.new(quality,  days_remaining)
           item.tick
       end
       #  etc
    160
    Thursday, April 24, 14

    View Slide

  230. @sandimetz Apr 2014
    class  GildedRose
       def  tick
           case  name
           when  'normal'
           when  'Aged  Brie'
               brie_tick
           when  'Sulfuras,  Hand  of  Ragnaros'
               sulfuras_tick
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               backstage_tick
           end
       end
       def  normal_tick
           @item  =  Normal.new(quality,  days_remaining)
           item.tick
       end
       def  brie_tick
           @item  =  Brie.new(quality,  days_remaining)
           item.tick
       end
       #  etc
    161
    Thursday, April 24, 14

    View Slide

  231. @sandimetz Apr 2014
    class  GildedRose
       def  tick
           case  name
           when  'normal'
               @item  =  Normal.new(quality,  days_remaining)
               item.tick
           when  'Aged  Brie'
               brie_tick
           when  'Sulfuras,  Hand  of  Ragnaros'
               sulfuras_tick
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               backstage_tick
           end
       end
       def  normal_tick
       end
       def  brie_tick
           @item  =  Brie.new(quality,  days_remaining)
           item.tick
       end
       #  etc
    162
    Thursday, April 24, 14

    View Slide

  232. @sandimetz Apr 2014
    class  GildedRose
       def  tick
           case  name
           when  'normal'
               @item  =  Normal.new(quality,  days_remaining)
               item.tick
           when  'Aged  Brie'
               brie_tick
           when  'Sulfuras,  Hand  of  Ragnaros'
               sulfuras_tick
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               backstage_tick
           end
       end
       def  brie_tick
           @item  =  Brie.new(quality,  days_remaining)
           item.tick
       end
       #  etc
    163
    Thursday, April 24, 14

    View Slide

  233. @sandimetz Apr 2014
    class  GildedRose
       def  tick
           case  name
           when  'normal'
               @item  =  Normal.new(quality,  days_remaining)
               item.tick
           when  'Aged  Brie'
               brie_tick
           when  'Sulfuras,  Hand  of  Ragnaros'
               sulfuras_tick
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               backstage_tick
           end
       end
       def  brie_tick
           @item  =  Brie.new(quality,  days_remaining)
           item.tick
       end
       #  etc
    164
    Thursday, April 24, 14

    View Slide

  234. @sandimetz Apr 2014
    class  GildedRose
       def  tick
           case  name
           when  'normal'
               @item  =  Normal.new(quality,  days_remaining)
               item.tick
           when  'Aged  Brie'
           when  'Sulfuras,  Hand  of  Ragnaros'
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
           end
       end
       def  brie_tick
           @item  =  Brie.new(quality,  days_remaining)
           item.tick
       end
       #  etc
    165
    Thursday, April 24, 14

    View Slide

  235. @sandimetz Apr 2014
    class  GildedRose
       def  tick
           case  name
           when  'normal'
               @item  =  Normal.new(quality,  days_remaining)
               item.tick
           when  'Aged  Brie'
               @item  =  Brie.new(quality,  days_remaining)
               item.tick
           when  'Sulfuras,  Hand  of  Ragnaros'
               @item  =  Sulfuras.new(quality,  days_remaining)
               item.tick
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               @item  =  Backstage.new(quality,  days_remaining)
               item.tick
           end
       end
    166
    Thursday, April 24, 14

    View Slide

  236. @sandimetz Apr 2014
    abstract away the duplication
    167
    Thursday, April 24, 14

    View Slide

  237. @sandimetz Apr 2014
    class  GildedRose
       def  tick
           case  name
           when  'normal'
               @item  =  Normal.new(quality,  days_remaining)
               item.tick
           when  'Aged  Brie'
               @item  =  Brie.new(quality,  days_remaining)
               item.tick
           when  'Sulfuras,  Hand  of  Ragnaros'
               @item  =  Sulfuras.new(quality,  days_remaining)
               item.tick
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               @item  =  Backstage.new(quality,  days_remaining)
               item.tick
           end
       end
    168
    Thursday, April 24, 14

    View Slide

  238. @sandimetz Apr 2014
    class  GildedRose
       def  tick
           case  name
           when  'normal'
               @item  =  Normal.new(quality,  days_remaining)
               item.tick
           when  'Aged  Brie'
               @item  =  Brie.new(quality,  days_remaining)
               item.tick
           when  'Sulfuras,  Hand  of  Ragnaros'
               @item  =  Sulfuras.new(quality,  days_remaining)
               item.tick
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               @item  =  Backstage.new(quality,  days_remaining)
               item.tick
           end
       end
    169
    Thursday, April 24, 14

    View Slide

  239. @sandimetz Apr 2014
    class  GildedRose
       attr_reader  :name,  :item
       def  initialize(name,  quality,  days_remaining)
           @name,  @quality,  @days_remaining  =  name,  quality,  days_remaining
       end
       def  tick
           case  name
           when  'normal'
               @item  =  Normal.new(quality,  days_remaining)
               item.tick
           when  'Aged  Brie'
               @item  =  Brie.new(quality,  days_remaining)
               item.tick
           when  'Sulfuras,  Hand  of  Ragnaros'
               @item  =  Sulfuras.new(quality,  days_remaining)
               item.tick
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               @item  =  Backstage.new(quality,  days_remaining)
               item.tick
           end
       end
    170
    Thursday, April 24, 14

    View Slide

  240. @sandimetz Apr 2014
    class  GildedRose
       attr_reader  :name,  :item
       def  initialize(name,  quality,  days_remaining)
           @name,  @quality,  @days_remaining  =  name,  quality,  days_remaining
       end
       def  tick
           case  name
           when  'normal'
               @item  =  Normal.new(quality,  days_remaining)
               item.tick
           when  'Aged  Brie'
               @item  =  Brie.new(quality,  days_remaining)
               item.tick
           when  'Sulfuras,  Hand  of  Ragnaros'
               @item  =  Sulfuras.new(quality,  days_remaining)
               item.tick
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               @item  =  Backstage.new(quality,  days_remaining)
               item.tick
           end
       end
    170
    Thursday, April 24, 14

    View Slide

  241. @sandimetz Apr 2014
    class  GildedRose
       attr_reader  :name,  :item
       def  initialize(name,  quality,  days_remaining)
           @item  =  ???
       end
       def  tick
           case  name
           when  'normal'
               @item  =  Normal.new(quality,  days_remaining)
               item.tick
           when  'Aged  Brie'
               @item  =  Brie.new(quality,  days_remaining)
               item.tick
           when  'Sulfuras,  Hand  of  Ragnaros'
               @item  =  Sulfuras.new(quality,  days_remaining)
               item.tick
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               @item  =  Backstage.new(quality,  days_remaining)
               item.tick
           end
       end
    171
    Thursday, April 24, 14

    View Slide

  242. @sandimetz Apr 2014
    class  GildedRose
       attr_reader  :name,  :item
       def  initialize(name,  quality,  days_remaining)
           @item  =  ???
       end
       def  tick
           case  name
           when  'normal'
               @item  =  Normal.new(quality,  days_remaining)
               item.tick
           when  'Aged  Brie'
               @item  =  Brie.new(quality,  days_remaining)
               item.tick
           when  'Sulfuras,  Hand  of  Ragnaros'
               @item  =  Sulfuras.new(quality,  days_remaining)
               item.tick
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               @item  =  Backstage.new(quality,  days_remaining)
               item.tick
           end
       end
    171
    Thursday, April 24, 14

    View Slide

  243. @sandimetz Apr 2014
    class  GildedRose
       attr_reader  :name,  :item
       def  initialize(name,  quality,  days_remaining)
           @item  =  ???.new(quality,  days_remaining)
       end
       def  tick
           case  name
           when  'normal'
               @item  =  Normal.new(quality,  days_remaining)
               item.tick
           when  'Aged  Brie'
               @item  =  Brie.new(quality,  days_remaining)
               item.tick
           when  'Sulfuras,  Hand  of  Ragnaros'
               @item  =  Sulfuras.new(quality,  days_remaining)
               item.tick
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               @item  =  Backstage.new(quality,  days_remaining)
               item.tick
           end
       end
    172
    Thursday, April 24, 14

    View Slide

  244. @sandimetz Apr 2014
    class  GildedRose
       attr_reader  :name,  :item
       def  initialize(name,  quality,  days_remaining)
           @item  =  ???.new(quality,  days_remaining)
       end
       def  tick
           case  name
           when  'normal'
               @item  =  Normal.new(quality,  days_remaining)
               item.tick
           when  'Aged  Brie'
               @item  =  Brie.new(quality,  days_remaining)
               item.tick
           when  'Sulfuras,  Hand  of  Ragnaros'
               @item  =  Sulfuras.new(quality,  days_remaining)
               item.tick
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               @item  =  Backstage.new(quality,  days_remaining)
               item.tick
           end
       end
    172
    Thursday, April 24, 14

    View Slide

  245. @sandimetz Apr 2014
    class  GildedRose
       attr_reader  :name,  :item
       def  initialize(name,  quality,  days_remaining)
           @item  =  ???.new(quality,  days_remaining)
       end
       def
           case  name
           when  'normal'
                               Normal
           when  'Aged  Brie'
                               Brie
           when  'Sulfuras,  Hand  of  Ragnaros'
                               Sulfuras
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                               Backstage
           end
    173
    Thursday, April 24, 14

    View Slide

  246. @sandimetz Apr 2014
    class  GildedRose
       attr_reader  :name,  :item
       def  initialize(name,  quality,  days_remaining)
           @item  =  ???.new(quality,  days_remaining)
       end
       def
           case  name
           when  'normal'
               Normal
           when  'Aged  Brie'
               Brie
           when  'Sulfuras,  Hand  of  Ragnaros'
               Sulfuras
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               Backstage
           end
       end
    174
    Thursday, April 24, 14

    View Slide

  247. @sandimetz Apr 2014
    class  GildedRose
       attr_reader  :name,  :item
       def  initialize(name,  quality,  days_remaining)
           @item  =  ???.new(quality,  days_remaining)
       end
       def  klass_for(name)
           case  name
           when  'normal'
               Normal
           when  'Aged  Brie'
               Brie
           when  'Sulfuras,  Hand  of  Ragnaros'
               Sulfuras
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               Backstage
           end
       end
    175
    Thursday, April 24, 14

    View Slide

  248. @sandimetz Apr 2014
    class  GildedRose
       attr_reader  :name,  :item
       def  initialize(name,  quality,  days_remaining)
           @item  =  klass_for(name).new(quality,  days_remaining)
       end
       def  klass_for(name)
           case  name
           when  'normal'
               Normal
           when  'Aged  Brie'
               Brie
           when  'Sulfuras,  Hand  of  Ragnaros'
               Sulfuras
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               Backstage
           end
       end
    176
    Thursday, April 24, 14

    View Slide

  249. @sandimetz Apr 2014
    class  GildedRose
       attr_reader  :name,  :item
       def  initialize(name,  quality,  days_remaining)
           @item  =  klass_for(name).new(quality,  days_remaining)
       end
       def  klass_for(name)
           case  name
           when  'normal'
               Normal
           when  'Aged  Brie'
               Brie
           when  'Sulfuras,  Hand  of  Ragnaros'
               Sulfuras
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               Backstage
           end
       end
    176
    Thursday, April 24, 14

    View Slide

  250. @sandimetz Apr 2014
    class  GildedRose
       attr_reader  :item
       def  initialize(name,  quality,  days_remaining)
           @item  =  klass_for(name).new(quality,  days_remaining)
       end
       def  klass_for(name)
           case  name
           when  'normal'
               Normal
           when  'Aged  Brie'
               Brie
           when  'Sulfuras,  Hand  of  Ragnaros'
               Sulfuras
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               Backstage
           end
       end
    177
    Thursday, April 24, 14

    View Slide

  251. @sandimetz Apr 2014
    class  GildedRose
       attr_reader  :item
       def  initialize(name,  quality,  days_remaining)
           @item  =  klass_for(name).new(quality,  days_remaining)
       end
       def  klass_for(name)
           #  ...
       end
    178
    Thursday, April 24, 14

    View Slide

  252. @sandimetz Apr 2014
    class  GildedRose
       attr_reader  :item
       def  initialize(name,  quality,  days_remaining)
           @item  =  klass_for(name).new(quality,  days_remaining)
       end
       def  klass_for(name)
           #  ...
       end
       def  tick
           item.tick
       end
    179
    Thursday, April 24, 14

    View Slide

  253. @sandimetz Apr 2014
    class  GildedRose
       attr_reader  :item
       def  initialize(name,  quality,  days_remaining)
           @item  =  klass_for(name).new(quality,  days_remaining)
       end
       def  klass_for(name)
           #  ...
       end
       def  tick
           item.tick
       end
       def  quality
           return  item.quality  if  item
           @quality
       end
       def  days_remaining
           return  item.days_remaining  if  item
           @days_remaining
       end
    180
    Thursday, April 24, 14

    View Slide

  254. @sandimetz Apr 2014
    class  GildedRose
       attr_reader  :item
       def  initialize(name,  quality,  days_remaining)
           @item  =  klass_for(name).new(quality,  days_remaining)
       end
       def  klass_for(name)
           #  ...
       end
       def  tick
           item.tick
       end
       def  quality
           return  item.quality  if  item
           @quality
       end
       def  days_remaining
           return  item.days_remaining  if  item
           @days_remaining
       end
    180
    Thursday, April 24, 14

    View Slide

  255. @sandimetz Apr 2014
    class  GildedRose
       attr_reader  :item
       def  initialize(name,  quality,  days_remaining)
           @item  =  klass_for(name).new(quality,  days_remaining)
       end
       def  klass_for(name)
           #  ...
       end
       def  tick
           item.tick
       end
       def  quality
           return  item.quality  if  item
       end
       def  days_remaining
           return  item.days_remaining  if  item
       end
    181
    Thursday, April 24, 14

    View Slide

  256. @sandimetz Apr 2014
    class  GildedRose
       attr_reader  :item
       def  initialize(name,  quality,  days_remaining)
           @item  =  klass_for(name).new(quality,  days_remaining)
       end
       def  klass_for(name)
           #  ...
       end
       def  tick
           item.tick
       end
       def  quality
           return  item.quality  if  item
       end
       def  days_remaining
           return  item.days_remaining  if  item
       end
    181
    Thursday, April 24, 14

    View Slide

  257. @sandimetz Apr 2014
    class  GildedRose
       attr_reader  :item
       def  initialize(name,  quality,  days_remaining)
           @item  =  klass_for(name).new(quality,  days_remaining)
       end
       def  klass_for(name)
           #  ...
       end
       def  tick
           item.tick
       end
       def  quality
           return  item.quality  if  item
       end
       def  days_remaining
           return  item.days_remaining  if  item
       end
    181
    Thursday, April 24, 14

    View Slide

  258. @sandimetz Apr 2014
    class  GildedRose
       attr_reader  :item
       def  initialize(name,  quality,  days_remaining)
           @item  =  klass_for(name).new(quality,  days_remaining)
       end
       def  klass_for(name)
           #  ...
       end
       def  tick
           item.tick
       end
       def  quality
           item.quality
       end
       def  days_remaining
           item.days_remaining
       end
    182
    Thursday, April 24, 14

    View Slide

  259. @sandimetz Apr 2014
    class  GildedRose
       attr_reader  :item
       def  initialize(name,  quality,  days_remaining)
           @item  =  klass_for(name).new(quality,  days_remaining)
       end
       def  klass_for(name)
           #  ...
       end
       def  tick
           item.tick
       end
       def  quality
           item.quality
       end
       def  days_remaining
           item.days_remaining
       end
       class  Normal
       class  Brie
       class  Sulfuras
       class  Backstage
    end
    183
    Thursday, April 24, 14

    View Slide

  260. @sandimetz Apr 2014
    item is a role
    184
    Thursday, April 24, 14

    View Slide

  261. @sandimetz Apr 2014
    GildedRose
    tick
    Normal
    tick
    Brie
    tick
    Sulfuras
    attr_reader  :item
    tick
    Backstage
    attr_reader
       :quality,
       :days_remaining
    185
    Thursday, April 24, 14

    View Slide

  262. @sandimetz Apr 2014
    attr_reader  :item
    GildedRose
    ItemRole
    def  tick  
    def  quality
    def  days_remaining
    186
    Thursday, April 24, 14

    View Slide

  263. @sandimetz Apr 2014
    attr_reader  :item
    ItemRole
    def  tick  
    def  quality
    def  days_remaining
    GildedRose
    187
    Thursday, April 24, 14

    View Slide

  264. @sandimetz Apr 2014
    attr_reader  :item
    def  tick
    end
    def  quality
    end
    def  days_remaining
    end
    ItemRole
    def  tick  
    def  quality
    def  days_remaining
    GildedRose
    187
    Thursday, April 24, 14

    View Slide

  265. @sandimetz Apr 2014
    attr_reader  :item
    def  tick
       item.tick
    end
    def  quality
       item.quality
    end
    def  days_remaining
       item.days_remaining
    end
    GildedRose
    ItemRole
    def  tick  
    def  quality
    def  days_remaining
    188
    Thursday, April 24, 14

    View Slide

  266. @sandimetz Apr 2014
    attr_reader  :item
    def  tick
       item.tick
    end
    def  quality
       item.quality
    end
    def  days_remaining
       item.days_remaining
    end
    GildedRose
    ItemRole
    def  tick  
    def  quality
    def  days_remaining
    188
    Thursday, April 24, 14

    View Slide

  267. @sandimetz Apr 2014
    Foo
    def  tick
       item.tick
    end
    def  quality
       item.quality
    end
    def  days_remaining
       item.days_remaining
    end
    attr_reader  :item
    GildedRose
    ItemRole
    def  tick  
    def  quality
    def  days_remaining
    189
    Thursday, April 24, 14

    View Slide

  268. @sandimetz Apr 2014
    Foo
    def  tick
       item.tick
    end
    def  quality
       item.quality
    end
    def  days_remaining
       item.days_remaining
    end
    attr_reader  :item
    attr_reader  :rose
    GildedRose
    ItemRole
    def  tick  
    def  quality
    def  days_remaining
    189
    Thursday, April 24, 14

    View Slide

  269. @sandimetz Apr 2014
    Foo
    def  tick
       item.tick
    end
    def  quality
       item.quality
    end
    def  days_remaining
       item.days_remaining
    end
    attr_reader  :item
    attr_reader  :rose
    def  doit
       rose.tick
       rose.quality
       rose.days_remaining
    end
    GildedRose
    ItemRole
    def  tick  
    def  quality
    def  days_remaining
    189
    Thursday, April 24, 14

    View Slide

  270. @sandimetz Apr 2014
    Foo
    def  tick
       item.tick
    end
    def  quality
       item.quality
    end
    def  days_remaining
       item.days_remaining
    end
    attr_reader  :item
    attr_reader  :rose
    def  doit
       rose.tick
       rose.quality
       rose.days_remaining
    end
    GildedRose
    ItemRole
    def  tick  
    def  quality
    def  days_remaining
    189
    Thursday, April 24, 14

    View Slide

  271. @sandimetz Apr 2014
    Foo
    def  tick
       item.tick
    end
    def  quality
       item.quality
    end
    def  days_remaining
       item.days_remaining
    end
    attr_reader  :item
    attr_reader  :rose
    def  doit
       rose.tick
       rose.quality
       rose.days_remaining
    end
    GildedRose
    ItemRole
    def  tick  
    def  quality
    def  days_remaining
    190
    Thursday, April 24, 14

    View Slide

  272. @sandimetz Apr 2014
    Foo
    def  tick
       item.tick
    end
    def  quality
       item.quality
    end
    def  days_remaining
       item.days_remaining
    end
    attr_reader  :item
    attr_reader  :rose
    def  doit
       rose.tick
       rose.quality
       rose.days_remaining
    end
    GildedRose
    ItemRole
    def  tick  
    def  quality
    def  days_remaining
    Middleman
    190
    Thursday, April 24, 14

    View Slide

  273. @sandimetz Apr 2014
    Foo
    attr_reader  :item
    attr_reader  :rose
    GildedRose
    ItemRole
    def  tick  
    def  quality
    def  days_remaining
    191
    Thursday, April 24, 14

    View Slide

  274. @sandimetz Apr 2014
    Foo
    attr_reader  :item
    attr_reader  :rose
    def  getit
       @rose  =  
           GildedRose.new(
               ‘normal’,  ...)    
    end
    GildedRose
    ItemRole
    def  tick  
    def  quality
    def  days_remaining
    191
    Thursday, April 24, 14

    View Slide

  275. @sandimetz Apr 2014
    Foo
    def  initialize(name,...)
       @item  =
           klass_for(name).
             new(
                 quality,
                 days_remaining)
    end
    def  klass_for(name)
       case  name
       when  'normal'
           Normal
    attr_reader  :item
    attr_reader  :rose
    def  getit
       @rose  =  
           GildedRose.new(
               ‘normal’,  ...)    
    end
    GildedRose
    ItemRole
    def  tick  
    def  quality
    def  days_remaining
    191
    Thursday, April 24, 14

    View Slide

  276. @sandimetz Apr 2014
    Foo
    def  initialize(name,...)
       @item  =
           klass_for(name).
             new(
                 quality,
                 days_remaining)
    end
    def  klass_for(name)
       case  name
       when  'normal'
           Normal
    attr_reader  :item
    attr_reader  :rose
    def  getit
       @rose  =  
           GildedRose.new(
               ‘normal’,  ...)    
    end
    GildedRose
    ItemRole
    def  tick  
    def  quality
    def  days_remaining
    Item
    Factory
    191
    Thursday, April 24, 14

    View Slide

  277. @sandimetz Apr 2014
    class  GildedRose
       attr_reader  :item
       def  initialize(name,  quality,  days_remaining)
           @item  =  klass_for(name).new(quality,  days_remaining)
       end
       def  klass_for(name)
           #  ...
       end
       def  tick
           item.tick
       end
       def  quality
           item.quality
       end
       def  days_remaining
           item.days_remaining
       end
       class  Normal
       class  Brie
       class  Sulfuras
       class  Backstage
    end
    192
    Thursday, April 24, 14

    View Slide

  278. @sandimetz Apr 2014
    class  GildedRose
       attr_reader  :item
       def  initialize(name,  quality,  days_remaining)
           @item  =  klass_for(name).new(quality,  days_remaining)
       end
       def  klass_for(name)
           #  ...
       end
       def  tick
           item.tick
       end
       def  quality
           item.quality
       end
       def  days_remaining
           item.days_remaining
       end
       class  Normal
       class  Brie
       class  Sulfuras
       class  Backstage
    end
    192
    Thursday, April 24, 14

    View Slide

  279. @sandimetz Apr 2014
    module  GildedRose
       attr_reader  :item
       def  initialize(name,  quality,  days_remaining)
           @item  =  klass_for(name).new(quality,  days_remaining)
       end
       def  klass_for(name)
           #  ...
       end
       def  tick
           item.tick
       end
       def  quality
           item.quality
       end
       def  days_remaining
           item.days_remaining
       end
       class  Normal
       class  Brie
       class  Sulfuras
       class  Backstage
    end
    193
    Thursday, April 24, 14

    View Slide

  280. @sandimetz Apr 2014
    module  GildedRose
       attr_reader  :item
       def  initialize(name,  quality,  days_remaining)
           @item  =  klass_for(name).new(quality,  days_remaining)
       end
       def  klass_for(name)
           #  ...
       end
       def  tick
           item.tick
       end
       def  quality
           item.quality
       end
       def  days_remaining
           item.days_remaining
       end
       class  Normal
       class  Brie
       class  Sulfuras
       class  Backstage
    end
    193
    Thursday, April 24, 14

    View Slide

  281. @sandimetz Apr 2014
    module  GildedRose
       attr_reader  :item
       def  self.for(name,  quality,  days_remaining)
           @item  =  klass_for(name).new(quality,  days_remaining)
       end
       def  klass_for(name)
           #  ...
       end
       def  tick
           item.tick
       end
       def  quality
           item.quality
       end
       def  days_remaining
           item.days_remaining
       end
       class  Normal
       class  Brie
       class  Sulfuras
       class  Backstage
    end
    194
    Thursday, April 24, 14

    View Slide

  282. @sandimetz Apr 2014
    module  GildedRose
       attr_reader  :item
       def  self.for(name,  quality,  days_remaining)
           @item  =  klass_for(name).new(quality,  days_remaining)
       end
       def  klass_for(name)
           #  ...
       end
       def  tick
           item.tick
       end
       def  quality
           item.quality
       end
       def  days_remaining
           item.days_remaining
       end
       class  Normal
       class  Brie
       class  Sulfuras
       class  Backstage
    end
    194
    Thursday, April 24, 14

    View Slide

  283. @sandimetz Apr 2014
    module  GildedRose
       attr_reader  :item
       def  self.for(name,  quality,  days_remaining)
           @item  =  klass_for(name).new(quality,  days_remaining)
       end
       def  self.klass_for(name)
           #  ...
       end
       def  tick
           item.tick
       end
       def  quality
           item.quality
       end
       def  days_remaining
           item.days_remaining
       end
       class  Normal
       class  Brie
       class  Sulfuras
       class  Backstage
    end
    195
    Thursday, April 24, 14

    View Slide

  284. @sandimetz Apr 2014
    module  GildedRose
       attr_reader  :item
       def  self.for(name,  quality,  days_remaining)
           @item  =  klass_for(name).new(quality,  days_remaining)
       end
       def  self.klass_for(name)
           #  ...
       end
       def  tick
           item.tick
       end
       def  quality
           item.quality
       end
       def  days_remaining
           item.days_remaining
       end
       class  Normal
       class  Brie
       class  Sulfuras
       class  Backstage
    end
    195
    Thursday, April 24, 14

    View Slide

  285. @sandimetz Apr 2014
    module  GildedRose
       attr_reader  :item
       def  self.for(name,  quality,  days_remaining)
           klass_for(name).new(quality,  days_remaining)
       end
       def  self.klass_for(name)
           #  ...
       end
       def  tick
           item.tick
       end
       def  quality
           item.quality
       end
       def  days_remaining
           item.days_remaining
       end
       class  Normal
       class  Brie
       class  Sulfuras
       class  Backstage
    end
    196
    Thursday, April 24, 14

    View Slide

  286. @sandimetz Apr 2014
    module  GildedRose
       attr_reader  :item
       def  self.for(name,  quality,  days_remaining)
           klass_for(name).new(quality,  days_remaining)
       end
       def  self.klass_for(name)
           #  ...
       end
       def  tick
           item.tick
       end
       def  quality
           item.quality
       end
       def  days_remaining
           item.days_remaining
       end
       class  Normal
       class  Brie
       class  Sulfuras
       class  Backstage
    end
    196
    Thursday, April 24, 14

    View Slide

  287. @sandimetz Apr 2014
    module  GildedRose
       def  self.for(name,  quality,  days_remaining)
           klass_for(name).new(quality,  days_remaining)
       end
       def  self.klass_for(name)
           #  ...
       end
       def  tick
           item.tick
       end
       def  quality
           item.quality
       end
       def  days_remaining
           item.days_remaining
       end
       class  Normal
       class  Brie
       class  Sulfuras
       class  Backstage
    end
    197
    Thursday, April 24, 14

    View Slide

  288. @sandimetz Apr 2014
    module  GildedRose
       def  self.for(name,  quality,  days_remaining)
           klass_for(name).new(quality,  days_remaining)
       end
       def  self.klass_for(name)
           #  ...
       end
       def  tick
           item.tick
       end
       def  quality
           item.quality
       end
       def  days_remaining
           item.days_remaining
       end
       class  Normal
       class  Brie
       class  Sulfuras
       class  Backstage
    end
    198
    Thursday, April 24, 14

    View Slide

  289. @sandimetz Apr 2014
    module  GildedRose
       def  self.for(name,  quality,  days_remaining)
           klass_for(name).new(quality,  days_remaining)
       end
       def  self.klass_for(name)
           #  ...
       end
       def  tick
           item.tick
       end
       def  quality
           item.quality
       end
       def  days_remaining
           item.days_remaining
       end
       class  Normal
       class  Brie
       class  Sulfuras
       class  Backstage
    end
    198
    Thursday, April 24, 14

    View Slide

  290. @sandimetz Apr 2014
    module  GildedRose
       def  self.for(name,  quality,  days_remaining)
           klass_for(name).new(quality,  days_remaining)
       end
       def  self.klass_for(name)
           #  ...
       end
       def  tick
           item.tick
       end
       def  quality
           item.quality
       end
       def  days_remaining
           item.days_remaining
       end
       class  Normal
       class  Brie
       class  Sulfuras
       class  Backstage
    end
    Middleman
    198
    Thursday, April 24, 14

    View Slide

  291. @sandimetz Apr 2014
    module  GildedRose
       def  self.for(name,  quality,  days_remaining)
           klass_for(name).new(quality,  days_remaining)
       end
       def  self.klass_for(name)
           #  ...
       end
       def  tick
           item.tick
       end
       def  quality
           item.quality
       end
       def  days_remaining
           item.days_remaining
       end
       class  Normal
       class  Brie
       class  Sulfuras
       class  Backstage
    end
    Middleman
    198
    Thursday, April 24, 14

    View Slide

  292. @sandimetz Apr 2014
    module  GildedRose
       def  self.for(name,  quality,  days_remaining)
           klass_for(name).new(quality,  days_remaining)
       end
       def  self.klass_for(name)
           #  ...
       end
       class  Normal
       class  Brie
       class  Sulfuras
       class  Backstage
    end
    199
    Thursday, April 24, 14

    View Slide

  293. @sandimetz Apr 2014
    Foo
    def  self.for(name,...)
    end
    attr_reader  :rose
    def  getit
       @rose  =  
           GildedRose.for(
               ‘normal’,  ...)    
    end
    GildedRose
    200
    Thursday, April 24, 14

    View Slide

  294. @sandimetz Apr 2014
    Foo
    attr_reader  :rose
    def  getit
       @rose  =  
           GildedRose.for(
               ‘normal’,  ...)    
    end
    ItemRole
    def  tick  
    def  quality
    def  days_remaining
    def  self.for(name,...)
    end
    GildedRose
    201
    Thursday, April 24, 14

    View Slide

  295. @sandimetz Apr 2014
    extract common code
    202
    Thursday, April 24, 14

    View Slide

  296. @sandimetz Apr 2014
    module  GildedRose
       def  self.for(name,  quality,  days_remaining)
           klass_for(name).new(quality,  days_remaining)
       end
       def  self.klass_for(name)
           #  ...
       end
       class  Normal
       class  Brie
       class  Sulfuras
       class  Backstage
    end
    203
    Thursday, April 24, 14

    View Slide

  297. @sandimetz Apr 2014
    module  GildedRose
       def  self.for(name,  quality,  days_remaining)
           klass_for(name).new(quality,  days_remaining)
       end
       def  self.klass_for(name)
           #  ...
       end
       class  Normal
       class  Brie
       class  Sulfuras
       class  Backstage
    end
    203
    Thursday, April 24, 14

    View Slide

  298. @sandimetz Apr 2014
    module  GildedRose
       class  Normal
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
           def  tick
               #  ...
           end
       end
    204
    Thursday, April 24, 14

    View Slide

  299. @sandimetz Apr 2014
    module  GildedRose
       class  Normal
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
           def  tick
               #  ...
           end
       end
       class  Brie
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
           def  tick
             #  ...
           end
       end
    205
    Thursday, April 24, 14

    View Slide

  300. @sandimetz Apr 2014
    module  GildedRose
       class  Normal
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
           def  tick
               #  ...
           end
       end
       class  Brie
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
           def  tick
             #  ...
           end
       end
    205
    Thursday, April 24, 14

    View Slide

  301. @sandimetz Apr 2014
    module  GildedRose
       class  Normal
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
           def  tick
               #  ...
           end
       end
       class  Brie
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
           def  tick
             #  ...
           end
       end
    205
    Thursday, April 24, 14

    View Slide

  302. @sandimetz Apr 2014
    module  GildedRose
       class  Normal
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
           def  tick
               #  ...
           end
       end
       class  Brie
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
           def  tick
    206
    Thursday, April 24, 14

    View Slide

  303. @sandimetz Apr 2014
    module  GildedRose
       class  Item
       end
       class  Normal
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
           def  tick
               #  ...
           end
       end
       class  Brie
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
           def  tick
    207
    Thursday, April 24, 14

    View Slide

  304. @sandimetz Apr 2014
    module  GildedRose
       class  Item
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
       end
       class  Normal
           def  tick
               #  ...
           end
       end
       class  Brie
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
           def  tick
    208
    Thursday, April 24, 14

    View Slide

  305. @sandimetz Apr 2014
    module  GildedRose
       class  Item
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
       end
       class  Normal  <  Item
           def  tick
               #  ...
           end
       end
       class  Brie
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
           def  tick
    209
    Thursday, April 24, 14

    View Slide

  306. @sandimetz Apr 2014
    module  GildedRose
       class  Item
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
       end
       class  Normal  <  Item
           def  tick
               #  ...
           end
       end
       class  Brie
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
           def  tick
             #  ...
           end
       end
    210
    Thursday, April 24, 14

    View Slide

  307. @sandimetz Apr 2014
    module  GildedRose
       class  Item
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
       end
       class  Normal  <  Item
           def  tick
               #  ...
           end
       end
       class  Brie  <  Item
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
           def  tick
             #  ...
           end
       end
    211
    Thursday, April 24, 14

    View Slide

  308. @sandimetz Apr 2014
    module  GildedRose
       class  Item
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
       end
       class  Normal  <  Item
           def  tick
               #  ...
           end
       end
       class  Brie  <  Item
           def  tick
             #  ...
           end
       end
    212
    Thursday, April 24, 14

    View Slide

  309. @sandimetz Apr 2014
    module  GildedRose
       class  Item
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
       end
       class  Normal  <  Item
           def  tick
               #  ...
           end
       end
       class  Brie  <  Item
           def  tick
             #  ...
           end
       end
       class  Sulfuras  <  Item
           def  tick
           end
       end
       class  Backstage  <  Item
           def  tick
    213
    Thursday, April 24, 14

    View Slide

  310. @sandimetz Apr 2014
    inheritance is not evil
    214
    Thursday, April 24, 14

    View Slide

  311. @sandimetz Apr 2014
    but we sometimes are
    215
    Thursday, April 24, 14

    View Slide

  312. @sandimetz Apr 2014
    module  GildedRose
       class  Item
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
       end
       class  Normal  <  Item
           def  tick
               #  ...
           end
       end
       class  Brie  <  Item
           def  tick
             #  ...
           end
       end
       class  Sulfuras  <  Item
           def  tick
           end
       end
       class  Backstage  <  Item
           def  tick
    216
    Thursday, April 24, 14

    View Slide

  313. @sandimetz Apr 2014
    module  GildedRose
       class  Item
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
       end
       class  Normal  <  Item
           def  tick
               #  ...
           end
       end
       class  Brie  <  Item
           def  tick
             #  ...
           end
       end
       class  Sulfuras  <  Item
           def  tick
           end
       end
       class  Backstage  <  Item
           def  tick
    Item
       quality
       days_remaining
    216
    Thursday, April 24, 14

    View Slide

  314. @sandimetz Apr 2014
    module  GildedRose
       class  Item
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
       end
       class  Normal  <  Item
           def  tick
               #  ...
           end
       end
       class  Brie  <  Item
           def  tick
             #  ...
           end
       end
       class  Sulfuras  <  Item
           def  tick
           end
       end
       class  Backstage  <  Item
           def  tick
    Item
       quality
       days_remaining
    Normal
    Brie
    Sulfuras
    Backstage
       quality
       days_remaining
       tick
    216
    Thursday, April 24, 14

    View Slide

  315. @sandimetz Apr 2014
    module  GildedRose
       class  Item
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
       end
       class  Normal  <  Item
           def  tick
               #  ...
           end
       end
       class  Brie  <  Item
           def  tick
             #  ...
           end
       end
       class  Sulfuras  <  Item
           def  tick
           end
       end
       class  Backstage  <  Item
           def  tick
    Item
       quality
       days_remaining
    Normal
    Brie
    Sulfuras
    Backstage
       quality
       days_remaining
       tick
    216
    Thursday, April 24, 14

    View Slide

  316. @sandimetz Apr 2014
    module  GildedRose
       class  Item
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
       end
       class  Normal  <  Item
           def  tick
               #  ...
           end
       end
       class  Brie  <  Item
           def  tick
             #  ...
           end
       end
       class  Sulfuras  <  Item
           def  tick
           end
       end
    217
    Thursday, April 24, 14

    View Slide

  317. @sandimetz Apr 2014
    module  GildedRose
       class  Item
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
           def  tick
           end
       end
       class  Normal  <  Item
           def  tick
               #  ...
           end
       end
       class  Brie  <  Item
           def  tick
             #  ...
           end
       end
       class  Sulfuras  <  Item
           def  tick
           end
       end
    218
    Thursday, April 24, 14

    View Slide

  318. @sandimetz Apr 2014
    module  GildedRose
       class  Item
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
           def  tick
           end
       end
       class  Normal  <  Item
           def  tick
               #  ...
           end
       end
       class  Brie  <  Item
           def  tick
             #  ...
           end
       end
       class  Sulfuras  <  Item
           def  tick
           end
       end
    218
    Thursday, April 24, 14

    View Slide

  319. @sandimetz Apr 2014
    module  GildedRose
       class  Item
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
           def  tick
           end
       end
       class  Sulfuras  <  Item
           def  tick
           end
       end
    219
    Thursday, April 24, 14

    View Slide

  320. @sandimetz Apr 2014
    module  GildedRose
       class  Item
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
           def  tick
           end
       end
       class  Sulfuras  <  Item
           def  tick
           end
       end
    219
    Thursday, April 24, 14

    View Slide

  321. @sandimetz Apr 2014
    module  GildedRose
       class  Item
           def  tick
           end
       end
       class  Sulfuras  <  Item
           def  tick
           end
       end
    220
    Thursday, April 24, 14

    View Slide

  322. @sandimetz Apr 2014
    module  GildedRose
       class  Item
           def  tick
           end
       end
       class  Sulfuras  <  Item
           def  tick
           end
       end
       def  self.klass_for(name)
           case  name
           when  'normal'
               Normal
           when  'Aged  Brie'
               Brie
           when  'Sulfuras,  Hand  of  Ragnaros'
               Sulfuras
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               Backstage
           end
       end
    221
    Thursday, April 24, 14

    View Slide

  323. @sandimetz Apr 2014
    module  GildedRose
       class  Item
           def  tick
           end
       end
       class  Sulfuras  <  Item
           def  tick
           end
       end
       def  self.klass_for(name)
           case  name
           when  'normal'
               Normal
           when  'Aged  Brie'
               Brie
           when  'Sulfuras,  Hand  of  Ragnaros'
               Sulfuras
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               Backstage
           end
       end
    221
    Thursday, April 24, 14

    View Slide

  324. @sandimetz Apr 2014
    module  GildedRose
       class  Item
           def  tick
           end
       end
       class  Sulfuras  <  Item
           def  tick
           end
       end
       def  self.klass_for(name)
           case  name
           when  'normal'
               Normal
           when  'Aged  Brie'
               Brie
           when  'Sulfuras,  Hand  of  Ragnaros'
               Item
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               Backstage
           end
       end
    222
    Thursday, April 24, 14

    View Slide

  325. @sandimetz Apr 2014
    module  GildedRose
       class  Item
           def  tick
           end
       end
       class  Sulfuras  <  Item
           def  tick
           end
       end
       def  self.klass_for(name)
           case  name
           when  'normal'
               Normal
           when  'Aged  Brie'
               Brie
           when  'Sulfuras,  Hand  of  Ragnaros'
               Item
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               Backstage
           end
       end
    222
    Thursday, April 24, 14

    View Slide

  326. @sandimetz Apr 2014
    module  GildedRose
       class  Item
           def  tick
           end
       end
       def  self.klass_for(name)
           case  name
           when  'normal'
               Normal
           when  'Aged  Brie'
               Brie
           when  'Sulfuras,  Hand  of  Ragnaros'
               Item
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               Backstage
           end
       end
    223
    Thursday, April 24, 14

    View Slide

  327. @sandimetz Apr 2014
    module  GildedRose
       class  Item
           def  tick
           end
       end
       def  self.klass_for(name)
           case  name
           when  'normal'
               Normal
           when  'Aged  Brie'
               Brie
           when  'Sulfuras,  Hand  of  Ragnaros'
               Item
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               Backstage
           end
       end
    224
    Thursday, April 24, 14

    View Slide

  328. @sandimetz Apr 2014
    module  GildedRose
       class  Item
           def  tick
           end
       end
       def  self.klass_for(name)
           case  name
           when  'normal'
               Normal
           when  'Aged  Brie'
               Brie
           when  'Sulfuras,  Hand  of  Ragnaros'
               Item
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               Backstage
           end
       end
    225
    Thursday, April 24, 14

    View Slide

  329. @sandimetz Apr 2014
    extract configuration
    226
    Thursday, April 24, 14

    View Slide

  330. @sandimetz Apr 2014
    module  GildedRose
       def  self.for(name,  quality,  days_remaining)
           klass_for(name).new(quality,  days_remaining)
       end
       def  self.klass_for(name)
           case  name
           when  'normal'
               Normal
           when  'Aged  Brie'
               Brie
           when  'Sulfuras,  Hand  of  Ragnaros'
               Item
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               Backstage
           end
       end
    end
    227
    Thursday, April 24, 14

    View Slide

  331. @sandimetz Apr 2014
    module  GildedRose
       DEFAULT_CLASS  =  Item
       SPECIALIZED_CLASSES  =  {
           'normal'                                                                        =>  Normal,
           'Aged  Brie'                                                                  =>  Brie,
           'Backstage  passes  to  a  TAFKAL80ETC  concert'  =>  Backstage  }
       def  self.for(name,  quality,  days_remaining)
           klass_for(name).new(quality,  days_remaining)
       end
       def  self.klass_for(name)
           case  name
           when  'normal'
               Normal
           when  'Aged  Brie'
               Brie
           when  'Sulfuras,  Hand  of  Ragnaros'
               Item
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               Backstage
           end
       end
    end
    228
    Thursday, April 24, 14

    View Slide

  332. @sandimetz Apr 2014
    module  GildedRose
       DEFAULT_CLASS  =  Item
       SPECIALIZED_CLASSES  =  {
           'normal'                                                                        =>  Normal,
           'Aged  Brie'                                                                  =>  Brie,
           'Backstage  passes  to  a  TAFKAL80ETC  concert'  =>  Backstage  }
       def  self.for(name,  quality,  days_remaining)
           klass_for(name).new(quality,  days_remaining)
       end
       def  self.klass_for(name)
           case  name
           when  'normal'
               Normal
           when  'Aged  Brie'
               Brie
           when  'Sulfuras,  Hand  of  Ragnaros'
               Item
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               Backstage
           end
       end
    end
    229
    Thursday, April 24, 14

    View Slide

  333. @sandimetz Apr 2014
    module  GildedRose
       DEFAULT_CLASS  =  Item
       SPECIALIZED_CLASSES  =  {
           'normal'                                                                        =>  Normal,
           'Aged  Brie'                                                                  =>  Brie,
           'Backstage  passes  to  a  TAFKAL80ETC  concert'  =>  Backstage  }
       def  self.for(name,  quality,  days_remaining)
           klass_for(name).
               new(quality,  days_remaining)
       end
       def  self.klass_for(name)
           case  name
           when  'normal'
               Normal
           when  'Aged  Brie'
               Brie
           when  'Sulfuras,  Hand  of  Ragnaros'
               Item
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               Backstage
           end
       end
    end
    230
    Thursday, April 24, 14

    View Slide

  334. @sandimetz Apr 2014
    module  GildedRose
       DEFAULT_CLASS  =  Item
       SPECIALIZED_CLASSES  =  {
           'normal'                                                                        =>  Normal,
           'Aged  Brie'                                                                  =>  Brie,
           'Backstage  passes  to  a  TAFKAL80ETC  concert'  =>  Backstage  }
       def  self.for(name,  quality,  days_remaining)
           (SPECIALIZED_CLASSES[name]  ||  DEFAULT_CLASS).
               new(quality,  days_remaining)
       end
       def  self.klass_for(name)
           case  name
           when  'normal'
               Normal
           when  'Aged  Brie'
               Brie
           when  'Sulfuras,  Hand  of  Ragnaros'
               Item
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               Backstage
           end
       end
    end
    231
    Thursday, April 24, 14

    View Slide

  335. @sandimetz Apr 2014
    module  GildedRose
       DEFAULT_CLASS  =  Item
       SPECIALIZED_CLASSES  =  {
           'normal'                                                                        =>  Normal,
           'Aged  Brie'                                                                  =>  Brie,
           'Backstage  passes  to  a  TAFKAL80ETC  concert'  =>  Backstage  }
       def  self.for(name,  quality,  days_remaining)
           (SPECIALIZED_CLASSES[name]  ||  DEFAULT_CLASS).
               new(quality,  days_remaining)
       end
    end
    232
    Thursday, April 24, 14

    View Slide

  336. @sandimetz Apr 2014
    small objects
    233
    Thursday, April 24, 14

    View Slide

  337. @sandimetz Apr 2014
    module  GildedRose
       class  Item
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
           def  tick
           end
       end
       class  Normal  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return  if  @quality  ==  0
               @quality  -­‐=  1
               @quality  -­‐=  1  if  @days_remaining  <=  0
           end
       end
    module  GildedRose
       class  Item
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
           def  tick
           end
       end
       class  Normal  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return  if  @quality  ==  0
               @quality  -­‐=  1
               @quality  -­‐=  1  if  @days_remaining  <=  0
           end
       end
       class  Brie  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return  if  @quality  >=  50
               @quality  +=  1
               @quality  +=  1  if  @days_remaining  <=  0
           end
       end
       class  Backstage  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return                            if  @quality  >=  50
               return  @quality  =  0  if  @days_remaining  <  0
               @quality  +=  1
               @quality  +=  1  if  @days_remaining  <  10
               @quality  +=  1  if  @days_remaining  <  5
           end
       end
       DEFAULT_CLASS  =  Item
       SPECIALIZED_CLASSES  =  {
           'normal'                                                                        =>  Normal,
           'Aged  Brie'                                                                  =>  Brie,
           'Backstage  passes  to  a  TAFKAL80ETC  concert'  =>  Backstage  }
       def  self.for(name,  quality,  days_remaining)
           (SPECIALIZED_CLASSES[name]  ||  DEFAULT_CLASS).new(quality,  
       end
    end
    234
    Thursday, April 24, 14

    View Slide

  338. @sandimetz Apr 2014
    module  GildedRose
       class  Brie  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return  if  @quality  >=  50
               @quality  +=  1
               @quality  +=  1  if  @days_remaining  <=  0
           end
       end
       class  Backstage  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return                            if  @quality  >=  50
               return  @quality  =  0  if  @days_remaining  <  0
               @quality  +=  1
               @quality  +=  1  if  @days_remaining  <  10
               @quality  +=  1  if  @days_remaining  <  5
           end
       end
    module  GildedRose
       class  Item
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
           def  tick
           end
       end
       class  Normal  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return  if  @quality  ==  0
               @quality  -­‐=  1
               @quality  -­‐=  1  if  @days_remaining  <=  0
           end
       end
       class  Brie  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return  if  @quality  >=  50
               @quality  +=  1
               @quality  +=  1  if  @days_remaining  <=  0
           end
       end
       class  Backstage  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return                            if  @quality  >=  50
               return  @quality  =  0  if  @days_remaining  <  0
               @quality  +=  1
               @quality  +=  1  if  @days_remaining  <  10
               @quality  +=  1  if  @days_remaining  <  5
           end
       end
       DEFAULT_CLASS  =  Item
       SPECIALIZED_CLASSES  =  {
           'normal'                                                                        =>  Normal,
           'Aged  Brie'                                                                  =>  Brie,
           'Backstage  passes  to  a  TAFKAL80ETC  concert'  =>  Backstage  }
       def  self.for(name,  quality,  days_remaining)
           (SPECIALIZED_CLASSES[name]  ||  DEFAULT_CLASS).new(quality,  
       end
    end
    235
    Thursday, April 24, 14

    View Slide

  339. @sandimetz Apr 2014
    module  GildedRose
       DEFAULT_CLASS  =  Item
       SPECIALIZED_CLASSES  =  {
           'normal'                                                                        =>  Normal,
           'Aged  Brie'                                                                  =>  Brie,
           'Backstage  passes  to  a  TAFKAL80ETC  concert'  =>  Backstage  }
       def  self.for(name,  quality,  days_remaining)
           (SPECIALIZED_CLASSES[name]  ||  DEFAULT_CLASS).
               new(quality,  days_remaining)
       end
    end module  GildedRose
       class  Item
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
           def  tick
           end
       end
       class  Normal  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return  if  @quality  ==  0
               @quality  -­‐=  1
               @quality  -­‐=  1  if  @days_remaining  <=  0
           end
       end
       class  Brie  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return  if  @quality  >=  50
               @quality  +=  1
               @quality  +=  1  if  @days_remaining  <=  0
           end
       end
       class  Backstage  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return                            if  @quality  >=  50
               return  @quality  =  0  if  @days_remaining  <  0
               @quality  +=  1
               @quality  +=  1  if  @days_remaining  <  10
               @quality  +=  1  if  @days_remaining  <  5
           end
       end
       DEFAULT_CLASS  =  Item
       SPECIALIZED_CLASSES  =  {
           'normal'                                                                        =>  Normal,
           'Aged  Brie'                                                                  =>  Brie,
           'Backstage  passes  to  a  TAFKAL80ETC  concert'  =>  Backstage  }
       def  self.for(name,  quality,  days_remaining)
           (SPECIALIZED_CLASSES[name]  ||  DEFAULT_CLASS).new(quality,  
       end
    end
    236
    Thursday, April 24, 14

    View Slide

  340. @sandimetz Apr 2014
    module  GildedRose
       class  Item
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
           def  tick
           end
       end
       class  Normal  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return  if  @quality  ==  0
               @quality  -­‐=  1
               @quality  -­‐=  1  if  @days_remaining  <=  0
           end
       end
       class  Brie  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return  if  @quality  >=  50
               @quality  +=  1
               @quality  +=  1  if  @days_remaining  <=  0
           end
       end
       class  Backstage  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return                            if  @quality  >=  50
               return  @quality  =  0  if  @days_remaining  <  0
               @quality  +=  1
               @quality  +=  1  if  @days_remaining  <  10
               @quality  +=  1  if  @days_remaining  <  5
           end
       end
       DEFAULT_CLASS  =  Item
       SPECIALIZED_CLASSES  =  {
           'normal'                                                                        =>  Normal,
           'Aged  Brie'                                                                  =>  Brie,
           'Backstage  passes  to  a  TAFKAL80ETC  concert'  =>  Backstage  }
       def  self.for(name,  quality,  days_remaining)
           (SPECIALIZED_CLASSES[name]  ||  DEFAULT_CLASS).new(quality,  days_remainin
       end
    end small objects
    237
    Thursday, April 24, 14

    View Slide

  341. @sandimetz Apr 2014
    module  GildedRose
       class  Item
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
           def  tick
           end
       end
       class  Normal  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return  if  @quality  ==  0
               @quality  -­‐=  1
               @quality  -­‐=  1  if  @days_remaining  <=  0
           end
       end
       class  Brie  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return  if  @quality  >=  50
               @quality  +=  1
               @quality  +=  1  if  @days_remaining  <=  0
           end
       end
       class  Backstage  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return                            if  @quality  >=  50
               return  @quality  =  0  if  @days_remaining  <  0
               @quality  +=  1
               @quality  +=  1  if  @days_remaining  <  10
               @quality  +=  1  if  @days_remaining  <  5
           end
       end
       DEFAULT_CLASS  =  Item
       SPECIALIZED_CLASSES  =  {
           'normal'                                                                        =>  Normal,
           'Aged  Brie'                                                                  =>  Brie,
           'Backstage  passes  to  a  TAFKAL80ETC  concert'  =>  Backstage  }
       def  self.for(name,  quality,  days_remaining)
           (SPECIALIZED_CLASSES[name]  ||  DEFAULT_CLASS).new(quality,  days_remainin
       end
    end small objects
    class  GildedRose
       attr_reader  :name,  :quality,  :days_remaining
       def  initialize(name,  quality,  days_remaining)
           @name,  @quality,  @days_remaining  =  name,  quality,  days_remaining
       end
       def  tick
           if  @name  !=  'Aged  Brie'  &&  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC
               if  @quality  >  0
                   if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                       @quality  -­‐=  1
                   end
               end
           else
               if  @quality  <  50
                     @quality  +=  1
                   if  @name  ==  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  @days_remaining  <  11
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                       if  @days_remaining  <  6
                           if  @quality  <  50
                               @quality  +=  1
                           end
                       end
                   end
               end
           end
           if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
               @days_remaining  -­‐=  1
           end
           if  @days_remaining  <  0
               if  @name  !=  "Aged  Brie"
                   if  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'
                       if  @quality  >  0
                           if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'
                               @quality  -­‐=  1
                           end
                       end
                   else
                       @quality  =  @quality  -­‐  @quality
                   end
               else
                   if  @quality  <  50
                       @quality  +=  1
                   end
               end
           end
       end
    end
    big conditional
    238
    Thursday, April 24, 14

    View Slide

  342. @sandimetz Apr 2014
    module  GildedRose
       class  Item
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
           def  tick
           end
       end
       class  Normal  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return  if  @quality  ==  0
               @quality  -­‐=  1
               @quality  -­‐=  1  if  @days_remaining  <=  0
           end
       end
       class  Brie  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return  if  @quality  >=  50
               @quality  +=  1
               @quality  +=  1  if  @days_remaining  <=  0
           end
       end
       class  Backstage  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return                            if  @quality  >=  50
               return  @quality  =  0  if  @days_remaining  <  0
               @quality  +=  1
               @quality  +=  1  if  @days_remaining  <  10
               @quality  +=  1  if  @days_remaining  <  5
           end
       end
       DEFAULT_CLASS  =  Item
       SPECIALIZED_CLASSES  =  {
           'normal'                                                                        =>  Normal,
           'Aged  Brie'                                                                  =>  Brie,
           'Backstage  passes  to  a  TAFKAL80ETC  concert'  =>  Backstage  }
       def  self.for(name,  quality,  days_remaining)
           (SPECIALIZED_CLASSES[name]  ||  DEFAULT_CLASS).new(quality,  days_remainin
       end
    end
    small methods
    class  GildedRose
       attr_reader  :name,  :quality,  :days_remaining
       def  initialize(name,  quality,  days_remaining)
           @name,  @quality,  @days_remaining  =  name,  quality,  days_remaining
       end
       def  tick
           case  name
           when  'normal'
               normal_tick
           when  'Aged  Brie'
               brie_tick
           when  'Sulfuras,  Hand  of  Ragnaros'
               sulfuras_tick
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               backstage_tick
           end
       end
       def  normal_tick
           @days_remaining  -­‐=  1
           return  if  @quality  ==  0
           @quality  -­‐=  1
           @quality  -­‐=  1  if  @days_remaining  <=  0
       end
       def  brie_tick
           @days_remaining  -­‐=  1
           return  if  @quality  >=  50
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <=  0
       end
       def  sulfuras_tick
       end
       def  backstage_tick
           @days_remaining  -­‐=  1
           return                            if  @quality  >=  50
           return  @quality  =  0  if  @days_remaining  <  0
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <  10
           @quality  +=  1  if  @days_remaining  <  5
       end
    end
    small objects
    239
    Thursday, April 24, 14

    View Slide

  343. @sandimetz Apr 2014
    module  GildedRose
       class  Item
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
           def  tick
           end
       end
       class  Normal  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return  if  @quality  ==  0
               @quality  -­‐=  1
               @quality  -­‐=  1  if  @days_remaining  <=  0
           end
       end
       class  Brie  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return  if  @quality  >=  50
               @quality  +=  1
               @quality  +=  1  if  @days_remaining  <=  0
           end
       end
       class  Backstage  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return                            if  @quality  >=  50
               return  @quality  =  0  if  @days_remaining  <  0
               @quality  +=  1
               @quality  +=  1  if  @days_remaining  <  10
               @quality  +=  1  if  @days_remaining  <  5
           end
       end
       DEFAULT_CLASS  =  Item
       SPECIALIZED_CLASSES  =  {
           'normal'                                                                        =>  Normal,
           'Aged  Brie'                                                                  =>  Brie,
           'Backstage  passes  to  a  TAFKAL80ETC  concert'  =>  Backstage  }
       def  self.for(name,  quality,  days_remaining)
           (SPECIALIZED_CLASSES[name]  ||  DEFAULT_CLASS).new(quality,  days_remaining)
       end
    end
    0
    25
    50
    big conditional small methods small objects
    tick/for normal brie backstage other
    Total Complexity
    40
    50
    240
    Thursday, April 24, 14

    View Slide

  344. @sandimetz Apr 2014
    module  GildedRose
       class  Item
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
           def  tick
           end
       end
       class  Normal  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return  if  @quality  ==  0
               @quality  -­‐=  1
               @quality  -­‐=  1  if  @days_remaining  <=  0
           end
       end
       class  Brie  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return  if  @quality  >=  50
               @quality  +=  1
               @quality  +=  1  if  @days_remaining  <=  0
           end
       end
       class  Backstage  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return                            if  @quality  >=  50
               return  @quality  =  0  if  @days_remaining  <  0
               @quality  +=  1
               @quality  +=  1  if  @days_remaining  <  10
               @quality  +=  1  if  @days_remaining  <  5
           end
       end
       DEFAULT_CLASS  =  Item
       SPECIALIZED_CLASSES  =  {
           'normal'                                                                        =>  Normal,
           'Aged  Brie'                                                                  =>  Brie,
           'Backstage  passes  to  a  TAFKAL80ETC  concert'  =>  Backstage  }
       def  self.for(name,  quality,  days_remaining)
           (SPECIALIZED_CLASSES[name]  ||  DEFAULT_CLASS).new(quality,  days_remaining)
       end
    end
    0
    25
    50
    big conditional small methods small objects
    tick/for normal brie backstage other
    33
    40
    50
    Total Complexity
    241
    Thursday, April 24, 14

    View Slide

  345. @sandimetz Apr 2014
    class  GildedRose
       attr_reader  :name,  :quality,  :days_remaining
       def  initialize(name,  quality,  days_remaining)
           @name,  @quality,  @days_remaining  =  name,  quality,  days_remaining
       end
       def  tick
           case  name
           when  'normal'
               normal_tick
           when  'Aged  Brie'
               brie_tick
           when  'Sulfuras,  Hand  of  Ragnaros'
               sulfuras_tick
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               backstage_tick
           end
       end
       def  normal_tick
           @days_remaining  -­‐=  1
           return  if  @quality  ==  0
           @quality  -­‐=  1
           @quality  -­‐=  1  if  @days_remaining  <=  0
       end
       def  brie_tick
           @days_remaining  -­‐=  1
           return  if  @quality  >=  50
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <=  0
       end
       def  sulfuras_tick
       end
       def  backstage_tick
           @days_remaining  -­‐=  1
           return                            if  @quality  >=  50
           return  @quality  =  0  if  @days_remaining  <  0
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <  10
           @quality  +=  1  if  @days_remaining  <  5
       end
    end
    big conditional small methods small objects
    50
    84
    40
    Total Complexity
    242
    Thursday, April 24, 14

    View Slide

  346. @sandimetz Apr 2014
    class  GildedRose
       attr_reader  :name,  :quality,  :days_remaining
       def  initialize(name,  quality,  days_remaining)
           @name,  @quality,  @days_remaining  =  name,  quality,  days_remaining
       end
       def  tick
           case  name
           when  'normal'
               normal_tick
           when  'Aged  Brie'
               brie_tick
           when  'Sulfuras,  Hand  of  Ragnaros'
               sulfuras_tick
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               backstage_tick
           end
       end
       def  normal_tick
           @days_remaining  -­‐=  1
           return  if  @quality  ==  0
           @quality  -­‐=  1
           @quality  -­‐=  1  if  @days_remaining  <=  0
       end
       def  brie_tick
           @days_remaining  -­‐=  1
           return  if  @quality  >=  50
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <=  0
       end
       def  sulfuras_tick
       end
       def  backstage_tick
           @days_remaining  -­‐=  1
           return                            if  @quality  >=  50
           return  @quality  =  0  if  @days_remaining  <  0
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <  10
           @quality  +=  1  if  @days_remaining  <  5
       end
    end
    0
    45
    90
    big conditional small methods small objects
    50
    84
    40
    Total Complexity
    242
    Thursday, April 24, 14

    View Slide

  347. @sandimetz Apr 2014
    class  GildedRose
       attr_reader  :name,  :quality,  :days_remaining
       def  initialize(name,  quality,  days_remaining)
           @name,  @quality,  @days_remaining  =  name,  quality,  days_remaining
       end
       def  tick
           case  name
           when  'normal'
               normal_tick
           when  'Aged  Brie'
               brie_tick
           when  'Sulfuras,  Hand  of  Ragnaros'
               sulfuras_tick
           when  'Backstage  passes  to  a  TAFKAL80ETC  concert'
               backstage_tick
           end
       end
       def  normal_tick
           @days_remaining  -­‐=  1
           return  if  @quality  ==  0
           @quality  -­‐=  1
           @quality  -­‐=  1  if  @days_remaining  <=  0
       end
       def  brie_tick
           @days_remaining  -­‐=  1
           return  if  @quality  >=  50
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <=  0
       end
       def  sulfuras_tick
       end
       def  backstage_tick
           @days_remaining  -­‐=  1
           return                            if  @quality  >=  50
           return  @quality  =  0  if  @days_remaining  <  0
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <  10
           @quality  +=  1  if  @days_remaining  <  5
       end
    end
    0
    45
    90
    big conditional small methods small objects
    50
    84
    40 33
    86
    Total Complexity
    242
    Thursday, April 24, 14

    View Slide

  348. @sandimetz Apr 2014
    module  GildedRose
       class  Item
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
           def  tick
           end
       end
       class  Normal  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return  if  @quality  ==  0
               @quality  -­‐=  1
               @quality  -­‐=  1  if  @days_remaining  <=  0
           end
       end
       class  Brie  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return  if  @quality  >=  50
               @quality  +=  1
               @quality  +=  1  if  @days_remaining  <=  0
           end
       end
       class  Backstage  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return                            if  @quality  >=  50
               return  @quality  =  0  if  @days_remaining  <  0
               @quality  +=  1
               @quality  +=  1  if  @days_remaining  <  10
               @quality  +=  1  if  @days_remaining  <  5
           end
       end
       DEFAULT_CLASS  =  Item
       SPECIALIZED_CLASSES  =  {
           'normal'                                                                        =>  Normal,
           'Aged  Brie'                                                                  =>  Brie,
           'Backstage  passes  to  a  TAFKAL80ETC  concert'  =>  Backstage  }
       def  self.for(name,  quality,  days_remaining)
           (SPECIALIZED_CLASSES[name]  ||  DEFAULT_CLASS).new(quality,  days_remaining)
       end
    end
    0
    25
    50
    big cond small meth small objs
    tick/for normal brie backstage other
    33
    Complexity
    40
    50
    243
    Thursday, April 24, 14

    View Slide

  349. @sandimetz Apr 2014
    module  GildedRose
       class  Item
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
           def  tick
           end
       end
       class  Normal  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return  if  @quality  ==  0
               @quality  -­‐=  1
               @quality  -­‐=  1  if  @days_remaining  <=  0
           end
       end
       class  Brie  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return  if  @quality  >=  50
               @quality  +=  1
               @quality  +=  1  if  @days_remaining  <=  0
           end
       end
       class  Backstage  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return                            if  @quality  >=  50
               return  @quality  =  0  if  @days_remaining  <  0
               @quality  +=  1
               @quality  +=  1  if  @days_remaining  <  10
               @quality  +=  1  if  @days_remaining  <  5
           end
       end
       DEFAULT_CLASS  =  Item
       SPECIALIZED_CLASSES  =  {
           'normal'                                                                        =>  Normal,
           'Aged  Brie'                                                                  =>  Brie,
           'Backstage  passes  to  a  TAFKAL80ETC  concert'  =>  Backstage  }
       def  self.for(name,  quality,  days_remaining)
           (SPECIALIZED_CLASSES[name]  ||  DEFAULT_CLASS).new(quality,  days_remaining)
       end
    end
    0
    25
    50
    GildedRose small meth small objs
    tick/for normal brie backstage other
    33
    Complexity
    40
    50
    244
    Thursday, April 24, 14

    View Slide

  350. @sandimetz Apr 2014
    module  GildedRose
       class  Item
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
           def  tick
           end
       end
       class  Normal  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return  if  @quality  ==  0
               @quality  -­‐=  1
               @quality  -­‐=  1  if  @days_remaining  <=  0
           end
       end
       class  Brie  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return  if  @quality  >=  50
               @quality  +=  1
               @quality  +=  1  if  @days_remaining  <=  0
           end
       end
       class  Backstage  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return                            if  @quality  >=  50
               return  @quality  =  0  if  @days_remaining  <  0
               @quality  +=  1
               @quality  +=  1  if  @days_remaining  <  10
               @quality  +=  1  if  @days_remaining  <  5
           end
       end
       DEFAULT_CLASS  =  Item
       SPECIALIZED_CLASSES  =  {
           'normal'                                                                        =>  Normal,
           'Aged  Brie'                                                                  =>  Brie,
           'Backstage  passes  to  a  TAFKAL80ETC  concert'  =>  Backstage  }
       def  self.for(name,  quality,  days_remaining)
           (SPECIALIZED_CLASSES[name]  ||  DEFAULT_CLASS).new(quality,  days_remaining)
       end
    end
    0
    25
    50
    GildedRose GildedRose(2) small objs
    tick/for normal brie backstage other
    33
    Complexity
    40
    50
    245
    Thursday, April 24, 14

    View Slide

  351. @sandimetz Apr 2014
    module  GildedRose
       class  Item
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
           def  tick
           end
       end
       class  Normal  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return  if  @quality  ==  0
               @quality  -­‐=  1
               @quality  -­‐=  1  if  @days_remaining  <=  0
           end
       end
       class  Brie  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return  if  @quality  >=  50
               @quality  +=  1
               @quality  +=  1  if  @days_remaining  <=  0
           end
       end
       class  Backstage  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return                            if  @quality  >=  50
               return  @quality  =  0  if  @days_remaining  <  0
               @quality  +=  1
               @quality  +=  1  if  @days_remaining  <  10
               @quality  +=  1  if  @days_remaining  <  5
           end
       end
       DEFAULT_CLASS  =  Item
       SPECIALIZED_CLASSES  =  {
           'normal'                                                                        =>  Normal,
           'Aged  Brie'                                                                  =>  Brie,
           'Backstage  passes  to  a  TAFKAL80ETC  concert'  =>  Backstage  }
       def  self.for(name,  quality,  days_remaining)
           (SPECIALIZED_CLASSES[name]  ||  DEFAULT_CLASS).new(quality,  days_remaining)
       end
    end
    0
    25
    50
    GildedRose GildedRose(2) many objs
    tick/for normal brie backstage other
    33
    Complexity
    40
    50
    246
    Thursday, April 24, 14

    View Slide

  352. @sandimetz Apr 2014
    module  GildedRose
       class  Item
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
           def  tick
           end
       end
       class  Normal  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return  if  @quality  ==  0
               @quality  -­‐=  1
               @quality  -­‐=  1  if  @days_remaining  <=  0
           end
       end
       class  Brie  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return  if  @quality  >=  50
               @quality  +=  1
               @quality  +=  1  if  @days_remaining  <=  0
           end
       end
       class  Backstage  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return                            if  @quality  >=  50
               return  @quality  =  0  if  @days_remaining  <  0
               @quality  +=  1
               @quality  +=  1  if  @days_remaining  <  10
               @quality  +=  1  if  @days_remaining  <  5
           end
       end
       DEFAULT_CLASS  =  Item
       SPECIALIZED_CLASSES  =  {
           'normal'                                                                        =>  Normal,
           'Aged  Brie'                                                                  =>  Brie,
           'Backstage  passes  to  a  TAFKAL80ETC  concert'  =>  Backstage  }
       def  self.for(name,  quality,  days_remaining)
           (SPECIALIZED_CLASSES[name]  ||  DEFAULT_CLASS).new(quality,  days_remaining)
       end
    end
    0
    25
    50
    GildedRose GildedRose(2) many objs
    tick/for normal brie backstage other
    33
    Complexity
    40
    50
    246
    Thursday, April 24, 14

    View Slide

  353. @sandimetz Apr 2014
    module  GildedRose
       class  Item
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
           def  tick
           end
       end
       class  Normal  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return  if  @quality  ==  0
               @quality  -­‐=  1
               @quality  -­‐=  1  if  @days_remaining  <=  0
           end
       end
       class  Brie  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return  if  @quality  >=  50
               @quality  +=  1
               @quality  +=  1  if  @days_remaining  <=  0
           end
       end
       class  Backstage  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return                            if  @quality  >=  50
               return  @quality  =  0  if  @days_remaining  <  0
               @quality  +=  1
               @quality  +=  1  if  @days_remaining  <  10
               @quality  +=  1  if  @days_remaining  <  5
           end
       end
       DEFAULT_CLASS  =  Item
       SPECIALIZED_CLASSES  =  {
           'normal'                                                                        =>  Normal,
           'Aged  Brie'                                                                  =>  Brie,
           'Backstage  passes  to  a  TAFKAL80ETC  concert'  =>  Backstage  }
       def  self.for(name,  quality,  days_remaining)
           (SPECIALIZED_CLASSES[name]  ||  DEFAULT_CLASS).new(quality,  days_remaining)
       end
    end
    0
    25
    50
    GildedRose GildedRose(2) many objs Backstage
    tick/for normal brie backstage other
    33
    Complexity
    40
    50
    12
    247
    Thursday, April 24, 14

    View Slide

  354. @sandimetz Apr 2014
    module  GildedRose
       class  Item
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
           def  tick
           end
       end
       class  Normal  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return  if  @quality  ==  0
               @quality  -­‐=  1
               @quality  -­‐=  1  if  @days_remaining  <=  0
           end
       end
       class  Brie  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return  if  @quality  >=  50
               @quality  +=  1
               @quality  +=  1  if  @days_remaining  <=  0
           end
       end
       class  Backstage  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return                            if  @quality  >=  50
               return  @quality  =  0  if  @days_remaining  <  0
               @quality  +=  1
               @quality  +=  1  if  @days_remaining  <  10
               @quality  +=  1  if  @days_remaining  <  5
           end
       end
       DEFAULT_CLASS  =  Item
       SPECIALIZED_CLASSES  =  {
           'normal'                                                                        =>  Normal,
           'Aged  Brie'                                                                  =>  Brie,
           'Backstage  passes  to  a  TAFKAL80ETC  concert'  =>  Backstage  }
       def  self.for(name,  quality,  days_remaining)
           (SPECIALIZED_CLASSES[name]  ||  DEFAULT_CLASS).new(quality,  days_remaining)
       end
    end
    0
    25
    50
    GildedRose GildedRose(2) many objs Backstage average
    tick/for normal brie backstage other
    33
    Complexity
    40
    50
    7
    12
    248
    Thursday, April 24, 14

    View Slide

  355. @sandimetz Apr 2014
    module  GildedRose
       class  Item
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
           def  tick
           end
       end
       class  Normal  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return  if  @quality  ==  0
               @quality  -­‐=  1
               @quality  -­‐=  1  if  @days_remaining  <=  0
           end
       end
       class  Brie  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return  if  @quality  >=  50
               @quality  +=  1
               @quality  +=  1  if  @days_remaining  <=  0
           end
       end
       class  Backstage  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return                            if  @quality  >=  50
               return  @quality  =  0  if  @days_remaining  <  0
               @quality  +=  1
               @quality  +=  1  if  @days_remaining  <  10
               @quality  +=  1  if  @days_remaining  <  5
           end
       end
       DEFAULT_CLASS  =  Item
       SPECIALIZED_CLASSES  =  {
           'normal'                                                                        =>  Normal,
           'Aged  Brie'                                                                  =>  Brie,
           'Backstage  passes  to  a  TAFKAL80ETC  concert'  =>  Backstage  }
       def  self.for(name,  quality,  days_remaining)
           (SPECIALIZED_CLASSES[name]  ||  DEFAULT_CLASS).new(quality,  days_remaining)
       end
    end
    0
    25
    50
    GildedRose Backstage
    Complexity
    50
    12
    249
    Thursday, April 24, 14

    View Slide

  356. @sandimetz Apr 2014
    module  GildedRose
       class  Item
           attr_reader  :quality,  :days_remaining
           def  initialize(quality,  days_remaining)
               @quality,  @days_remaining  =  quality,  days_remaining
           end
           def  tick
           end
       end
       class  Normal  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return  if  @quality  ==  0
               @quality  -­‐=  1
               @quality  -­‐=  1  if  @days_remaining  <=  0
           end
       end
       class  Brie  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return  if  @quality  >=  50
               @quality  +=  1
               @quality  +=  1  if  @days_remaining  <=  0
           end
       end
       class  Backstage  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return                            if  @quality  >=  50
               return  @quality  =  0  if  @days_remaining  <  0
               @quality  +=  1
               @quality  +=  1  if  @days_remaining  <  10
               @quality  +=  1  if  @days_remaining  <  5
           end
       end
       DEFAULT_CLASS  =  Item
       SPECIALIZED_CLASSES  =  {
           'normal'                                                                        =>  Normal,
           'Aged  Brie'                                                                  =>  Brie,
           'Backstage  passes  to  a  TAFKAL80ETC  concert'  =>  Backstage  }
       def  self.for(name,  quality,  days_remaining)
           (SPECIALIZED_CLASSES[name]  ||  DEFAULT_CLASS).new(quality,  days_remaining)
       end
    end
    0
    25
    50
    GildedRose Backstage
    Complexity
    50
    12
    75%
    249
    Thursday, April 24, 14

    View Slide

  357. @sandimetz Apr 2014
    Task:
    Implement Conjured
    250
    Thursday, April 24, 14

    View Slide

  358. @sandimetz Apr 2014
    module  GildedRose
    251
    Thursday, April 24, 14

    View Slide

  359. @sandimetz Apr 2014
    module  GildedRose
       class  Conjured  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return  if  @quality  ==  0
               @quality  -­‐=  2
               @quality  -­‐=  2  if  @days_remaining  <=  0
           end
       end
    252
    Thursday, April 24, 14

    View Slide

  360. @sandimetz Apr 2014
    module  GildedRose
       class  Conjured  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return  if  @quality  ==  0
               @quality  -­‐=  2
               @quality  -­‐=  2  if  @days_remaining  <=  0
           end
       end
       SPECIALIZED_CLASSES  =  {
           'normal'                                                                        =>  Normal,
           'Aged  Brie'                                                                  =>  Brie,
           'Backstage  passes  to  a  TAFKAL80ETC  concert'  =>  Backstage}
    253
    Thursday, April 24, 14

    View Slide

  361. @sandimetz Apr 2014
    module  GildedRose
       class  Conjured  <  Item
           def  tick
               @days_remaining  -­‐=  1
               return  if  @quality  ==  0
               @quality  -­‐=  2
               @quality  -­‐=  2  if  @days_remaining  <=  0
           end
       end
       SPECIALIZED_CLASSES  =  {
           'normal'                                                                        =>  Normal,
           'Aged  Brie'                                                                  =>  Brie,
           'Backstage  passes  to  a  TAFKAL80ETC  concert'  =>  Backstage,
           'Conjured  Mana  Cake'                                                =>  Conjured  }
    254
    Thursday, April 24, 14

    View Slide

  362. @sandimetz Apr 2014
    #  Running:
    ...............................
    Fabulous  run  in  0.003917s,  7914.2201  runs/s,  15828.4401  assertions/s.
    31  runs,  62  assertions,  0  failures,  0  errors,  0  skips
    255
    Thursday, April 24, 14

    View Slide

  363. @sandimetz Apr 2014
    Summary
    256
    Thursday, April 24, 14

    View Slide

  364. @sandimetz Apr 2014
    prefer duplication
    over the wrong abstraction
    257
    Thursday, April 24, 14

    View Slide

  365. @sandimetz Apr 2014
    reach for open / closed
    258
    Thursday, April 24, 14

    View Slide

  366. @sandimetz Apr 2014
    make small things
    259
    Thursday, April 24, 14

    View Slide

  367. @sandimetz Apr 2014
    refactor through complexity
    260
    Thursday, April 24, 14

    View Slide

  368. @sandimetz Apr 2014
    refactor to simplicity
    261
    Thursday, April 24, 14

    View Slide

  369. @sandimetz Apr 2014
    love your code
    262
    Thursday, April 24, 14

    View Slide

  370. @sandimetz Apr 2014
    Sandi Metz
    @sandimetz Apr 2014
    263
    Thursday, April 24, 14

    View Slide

  371. @sandimetz Apr 2014
    Sandi Metz
    @sandimetz
    @sandimetz Apr 2014
    263
    Thursday, April 24, 14

    View Slide

  372. @sandimetz Apr 2014
    Sandi Metz
    @sandimetz
    @sandimetz Apr 2014
    http://sandimetz.com
    263
    Thursday, April 24, 14

    View Slide

  373. http://poodr.com
    Sandi Metz
    @sandimetz
    @sandimetz Apr 2014
    264
    Thursday, April 24, 14

    View Slide

  374. @sandimetz Apr 2014
    @sandimetz Apr 2014
    http://practicalrailsbook.com
    265
    Thursday, April 24, 14

    View Slide

  375. @sandimetz Apr 2014
    London Course
    http://kickstartacademy.io/courses/
    practical-object-oriented-design
    June 25-27
    July 3-4
    266
    Thursday, April 24, 14

    View Slide

  376. @sandimetz Apr 2014
    267
    Thursday, April 24, 14

    View Slide

  377. @sandimetz Apr 2014
    Thanks
    267
    Thursday, April 24, 14

    View Slide

  378. @sandimetz Apr 2014
    Thanks
    Jim
    267
    Thursday, April 24, 14

    View Slide

  379. @sandimetz Apr 2014
    Questions?
    268
    Thursday, April 24, 14

    View Slide

  380. @sandimetz Apr 2014
    269
    Thursday, April 24, 14

    View Slide