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

all the little things (rubyonales)

all the little things (rubyonales)

Sandi Metz

March 07, 2014
Tweet

More Decks by Sandi Metz

Other Decks in Programming

Transcript

  1. @sandimetz Mar 2014
    sandi metz
    all the little things
    Friday, March 7, 14

    View Slide

  2. @sandimetz Mar 2014
    Want better apps?
    Friday, March 7, 14

    View Slide

  3. @sandimetz Mar 2014
    make smaller things
    Friday, March 7, 14

    View Slide

  4. @sandimetz Mar 2014
    The Gilded Rose Kata
    Friday, March 7, 14

    View Slide

  5. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  6. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  7. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  8. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  9. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  10. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  11. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  12. @sandimetz Mar 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)
    Friday, March 7, 14

    View Slide

  13. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  14. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  15. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  16. @sandimetz Mar 2014
    Friday, March 7, 14

    View Slide

  17. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  18. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  19. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  20. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  21. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  22. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  23. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  24. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  25. @sandimetz Mar 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 !=
    Friday, March 7, 14

    View Slide

  26. @sandimetz Mar 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 &&
    Friday, March 7, 14

    View Slide

  27. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  28. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  29. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  30. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  31. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  32. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  33. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  34. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  35. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  36. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  37. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  38. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  39. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  40. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  41. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  42. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  43. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  44. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  45. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  46. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  47. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  48. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  49. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  50. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  51. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  52. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  53. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  54. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  55. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  56. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  57. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  58. @sandimetz Mar 2014
    Friday, March 7, 14

    View Slide

  59. @sandimetz Mar 2014
    Task:
    Friday, March 7, 14

    View Slide

  60. @sandimetz Mar 2014
    Task:
    Implement Conjured
    Friday, March 7, 14

    View Slide

  61. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  62. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  63. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  64. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  65. @sandimetz Mar 2014
    the pattern failed me
    Friday, March 7, 14

    View Slide

  66. @sandimetz Mar 2014
    Friday, March 7, 14

    View Slide

  67. @sandimetz Mar 2014
    Task:
    Friday, March 7, 14

    View Slide

  68. @sandimetz Mar 2014
    Task:
    Refactor code so I can
    Implement Conjured
    Friday, March 7, 14

    View Slide

  69. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  70. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  71. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  72. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  73. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  74. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  75. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  76. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  77. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  78. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  79. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  80. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  81. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  82. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  83. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  84. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  85. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  86. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  87. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  88. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  89. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  90. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  91. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  92. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  93. @sandimetz Mar 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 ??
    Friday, March 7, 14

    View Slide

  94. @sandimetz Mar 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 ??
    Friday, March 7, 14

    View Slide

  95. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  96. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  97. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  98. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  99. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  100. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  101. @sandimetz Mar 2014
    refactor under green
    Friday, March 7, 14

    View Slide

  102. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  103. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  104. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  105. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  106. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  107. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  108. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  109. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  110. @sandimetz Mar 2014
       def  normal_tick
           @days_remaining  -­‐=  1
           return  if  @quality  ==  0
           @quality  -­‐=  1
           @quality  -­‐=  1  if  @days_remaining  <=  0
       end
       def  normal_tick
       end
    Friday, March 7, 14

    View Slide

  111. @sandimetz Mar 2014
       def  normal_tick
           @days_remaining  -­‐=  1
           return  if  @quality  ==  0
           @quality  -­‐=  1
           @quality  -­‐=  1  if  @days_remaining  <=  0
       end
    Friday, March 7, 14

    View Slide

  112. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  113. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  114. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  115. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  116. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  117. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  118. @sandimetz Mar 2014
       def  tick
         if  name  ==  'normal'
               return  normal_tick
           end
           #  ...
       end
    Friday, March 7, 14

    View Slide

  119. @sandimetz Mar 2014
       def  tick
           case  name
           when  'normal'
               return  normal_tick
           end
           #  ...
       end
    Friday, March 7, 14

    View Slide

  120. @sandimetz Mar 2014
       def  tick
           case  name
           when  'normal'
               return  normal_tick
           when  'Aged  Brie'
               return  brie_tick
           end
           #  ...
       end
    Friday, March 7, 14

    View Slide

  121. @sandimetz Mar 2014
       def  tick
           case  name
           when  'normal'
               return  normal_tick
           when  'Aged  Brie'
               return  brie_tick
           end
           #  ...
       end
       def  brie_tick
       end
    Friday, March 7, 14

    View Slide

  122. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  123. @sandimetz Mar 2014
       def  tick
           case  name
           when  'normal'
               return  normal_tick
           when  'Aged  Brie'
               return  brie_tick
           end
           #  ...
       end
       def  brie_tick
       end
    Friday, March 7, 14

    View Slide

  124. @sandimetz Mar 2014
       def  tick
           case  name
           when  'normal'
               return  normal_tick
           when  'Aged  Brie'
               return  brie_tick
           end
           #  ...
       end
       def  brie_tick
       end
    fast forward...
    Friday, March 7, 14

    View Slide

  125. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  126. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  127. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  128. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  129. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  130. @sandimetz Mar 2014
    duplication is far cheaper
    than the wrong abstraction
    Friday, March 7, 14

    View Slide

  131. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  132. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  133. @sandimetz Mar 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 ?!?
    Friday, March 7, 14

    View Slide

  134. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  135. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  136. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  137. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  138. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  139. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  140. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  141. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  142. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  143. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  144. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  145. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  146. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  147. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  148. @sandimetz Mar 2014
    small methods are simple
    Friday, March 7, 14

    View Slide

  149. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  150. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  151. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  152. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  153. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  154. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  155. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  156. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  157. @sandimetz Mar 2014
    Task:
    Implement Conjured
    Friday, March 7, 14

    View Slide

  158. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  159. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  160. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  161. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  162. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  163. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  164. @sandimetz Mar 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
    ???
    Friday, March 7, 14

    View Slide

  165. @sandimetz Mar 2014
    the pattern still fails me
    Friday, March 7, 14

    View Slide

  166. @sandimetz Mar 2014
    open / closed
    Friday, March 7, 14

    View Slide

  167. @sandimetz Mar 2014
    open for extension
    Friday, March 7, 14

    View Slide

  168. @sandimetz Mar 2014
    open for extension
    closed for modification
    Friday, March 7, 14

    View Slide

  169. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  170. @sandimetz Mar 2014
    they’re screaming to get out
    Friday, March 7, 14

    View Slide

  171. @sandimetz Mar 2014
    GildedRose
    Friday, March 7, 14

    View Slide

  172. @sandimetz Mar 2014
    brie_tick
    backstage_tick
    sulfuras_tick
    normal_tick
    GildedRose
    Friday, March 7, 14

    View Slide

  173. @sandimetz Mar 2014
    brie_tick
    backstage_tick
    sulfuras_tick
    normal_tick
    GildedRose
    Friday, March 7, 14

    View Slide

  174. @sandimetz Mar 2014
    Normal
    brie_tick
    backstage_tick
    sulfuras_tick
    normal_tick
    GildedRose
    Friday, March 7, 14

    View Slide

  175. @sandimetz Mar 2014
    tick
    Normal
    brie_tick
    backstage_tick
    sulfuras_tick
    normal_tick
    GildedRose
    Friday, March 7, 14

    View Slide

  176. @sandimetz Mar 2014
    tick
    Normal
    brie_tick
    backstage_tick
    sulfuras_tick
    normal_tick
    GildedRose
    Friday, March 7, 14

    View Slide

  177. @sandimetz Mar 2014
    tick
    Normal
    brie_tick
    backstage_tick
    sulfuras_tick
    normal_tick
    GildedRose
    Friday, March 7, 14

    View Slide

  178. @sandimetz Mar 2014
    tick
    Normal
    brie_tick
    backstage_tick
    sulfuras_tick
    GildedRose
    Friday, March 7, 14

    View Slide

  179. @sandimetz Mar 2014
    tick
    Normal
    GildedRose
    brie_tick
    backstage_tick
    sulfuras_tick
    Friday, March 7, 14

    View Slide

  180. @sandimetz Mar 2014
    tick
    Normal
    GildedRose
    brie_tick
    backstage_tick
    sulfuras_tick
    Friday, March 7, 14

    View Slide

  181. @sandimetz Mar 2014
           def  normal_tick
               @days_remaining  -­‐=  1
               return  if  @quality  ==  0
               @quality  -­‐=  1
               @quality  -­‐=  1  if  @days_remaining  <=  0
           end
    Friday, March 7, 14

    View Slide

  182. @sandimetz Mar 2014
           def  tick
               @days_remaining  -­‐=  1
               return  if  @quality  ==  0
               @quality  -­‐=  1
               @quality  -­‐=  1  if  @days_remaining  <=  0
           end
    Friday, March 7, 14

    View Slide

  183. @sandimetz Mar 2014
       class  Normal
           def  tick
               @days_remaining  -­‐=  1
               return  if  @quality  ==  0
               @quality  -­‐=  1
               @quality  -­‐=  1  if  @days_remaining  <=  0
           end
       end
    Friday, March 7, 14

    View Slide

  184. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  185. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  186. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  187. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  188. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  189. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  190. @sandimetz Mar 2014
    tick
    Normal
    GildedRose
    brie_tick
    backstage_tick
    sulfuras_tick
    Friday, March 7, 14

    View Slide

  191. @sandimetz Mar 2014
    normal is an object
    Friday, March 7, 14

    View Slide

  192. @sandimetz Mar 2014
    brie/sulfuras/backstage are not
    Friday, March 7, 14

    View Slide

  193. @sandimetz Mar 2014
    class  GildedRose  
       def  normal_tick
           @item  =  Normal.new(quality,  days_remaining)
           item.tick
       end
    Friday, March 7, 14

    View Slide

  194. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  195. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  196. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  197. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  198. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  199. @sandimetz Mar 2014
    brie
    Friday, March 7, 14

    View Slide

  200. @sandimetz Mar 2014
    class  GildedRose
       def  brie_tick
           @days_remaining  -­‐=  1
           return  if  @quality  >=  50
           @quality  +=  1
           @quality  +=  1  if  @days_remaining  <=  0
       end
    Friday, March 7, 14

    View Slide

  201. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  202. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  203. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  204. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  205. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  206. @sandimetz Mar 2014
    sulfuras
    Friday, March 7, 14

    View Slide

  207. @sandimetz Mar 2014
    class  GildedRose
       def  sulfuras_tick
       end
    Friday, March 7, 14

    View Slide

  208. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  209. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  210. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  211. @sandimetz Mar 2014
    backstage
    Friday, March 7, 14

    View Slide

  212. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  213. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  214. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  215. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  216. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  217. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  218. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  219. @sandimetz Mar 2014
    normal/brie/sulfuras/backstage
    are now objects
    Friday, March 7, 14

    View Slide

  220. @sandimetz Mar 2014
    GildedRose
    tick
    Normal
    tick
    Brie
    tick
    Sulfuras
    attr_reader  :item
    tick
    Backstage
    attr_reader
       :quality,
       :days_remaining
    Friday, March 7, 14

    View Slide

  221. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  222. @sandimetz Mar 2014
    rewind
    Friday, March 7, 14

    View Slide

  223. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  224. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  225. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  226. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  227. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  228. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  229. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  230. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  231. @sandimetz Mar 2014
    abstract away the duplication
    Friday, March 7, 14

    View Slide

  232. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  233. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  234. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  235. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  236. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  237. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  238. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  239. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  240. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  241. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  242. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  243. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  244. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  245. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  246. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  247. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  248. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  249. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  250. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  251. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  252. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  253. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  254. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  255. @sandimetz Mar 2014
    item is a role
    Friday, March 7, 14

    View Slide

  256. @sandimetz Mar 2014
    GildedRose
    tick
    Normal
    tick
    Brie
    tick
    Sulfuras
    attr_reader  :item
    tick
    Backstage
    attr_reader
       :quality,
       :days_remaining
    Friday, March 7, 14

    View Slide

  257. @sandimetz Mar 2014
    attr_reader  :item
    GildedRose
    ItemRole
    def  tick  
    def  quality
    def  days_remaining
    Friday, March 7, 14

    View Slide

  258. @sandimetz Mar 2014
    attr_reader  :item
    ItemRole
    def  tick  
    def  quality
    def  days_remaining
    GildedRose
    Friday, March 7, 14

    View Slide

  259. @sandimetz Mar 2014
    attr_reader  :item
    def  tick
    end
    def  quality
    end
    def  days_remaining
    end
    ItemRole
    def  tick  
    def  quality
    def  days_remaining
    GildedRose
    Friday, March 7, 14

    View Slide

  260. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  261. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  262. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  263. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  264. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  265. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  266. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  267. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  268. @sandimetz Mar 2014
    Foo
    attr_reader  :item
    attr_reader  :rose
    GildedRose
    ItemRole
    def  tick  
    def  quality
    def  days_remaining
    Friday, March 7, 14

    View Slide

  269. @sandimetz Mar 2014
    Foo
    attr_reader  :item
    attr_reader  :rose
    def  getit
       @rose  =  
           GildedRose.new(
               ‘normal’,  ...)    
    end
    GildedRose
    ItemRole
    def  tick  
    def  quality
    def  days_remaining
    Friday, March 7, 14

    View Slide

  270. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  271. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  272. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  273. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  274. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  275. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  276. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  277. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  278. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  279. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  280. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  281. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  282. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  283. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  284. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  285. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  286. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  287. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  288. @sandimetz Mar 2014
    Foo
    def  self.for(name,...)
    end
    attr_reader  :rose
    def  getit
       @rose  =  
           GildedRose.for(
               ‘normal’,  ...)    
    end
    GildedRose
    Friday, March 7, 14

    View Slide

  289. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  290. @sandimetz Mar 2014
    extract common code
    Friday, March 7, 14

    View Slide

  291. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  292. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  293. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  294. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  295. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  296. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  297. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  298. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  299. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  300. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  301. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  302. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  303. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  304. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  305. @sandimetz Mar 2014
    inheritance is not evil
    Friday, March 7, 14

    View Slide

  306. @sandimetz Mar 2014
    but programmers sometimes are
    Friday, March 7, 14

    View Slide

  307. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  308. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  309. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  310. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  311. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  312. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  313. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  314. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  315. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  316. @sandimetz Mar 2014
    module  GildedRose
       class  Item
           def  tick
           end
       end
       class  Sulfuras  <  Item
           def  tick
           end
       end
    Friday, March 7, 14

    View Slide

  317. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  318. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  319. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  320. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  321. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  322. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  323. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  324. @sandimetz Mar 2014
    extract configuration
    Friday, March 7, 14

    View Slide

  325. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  326. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  327. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  328. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  329. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  330. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  331. @sandimetz Mar 2014
    small objects
    Friday, March 7, 14

    View Slide

  332. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  333. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  334. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  335. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  336. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  337. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  338. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  339. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  340. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  341. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  342. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  343. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  344. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  345. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  346. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  347. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  348. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  349. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  350. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  351. @sandimetz Mar 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%
    Friday, March 7, 14

    View Slide

  352. @sandimetz Mar 2014
    Task:
    Implement Conjured
    Friday, March 7, 14

    View Slide

  353. @sandimetz Mar 2014
    module  GildedRose
    Friday, March 7, 14

    View Slide

  354. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  355. @sandimetz Mar 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}
    Friday, March 7, 14

    View Slide

  356. @sandimetz Mar 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  }
    Friday, March 7, 14

    View Slide

  357. @sandimetz Mar 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
    Friday, March 7, 14

    View Slide

  358. @sandimetz Mar 2014
    Summary
    Friday, March 7, 14

    View Slide

  359. @sandimetz Mar 2014
    duplication is far cheaper
    than the wrong abstraction
    Friday, March 7, 14

    View Slide

  360. @sandimetz Mar 2014
    reach for open / closed
    Friday, March 7, 14

    View Slide

  361. @sandimetz Mar 2014
    small methods are simple
    Friday, March 7, 14

    View Slide

  362. @sandimetz Mar 2014
    small objects are simple
    Friday, March 7, 14

    View Slide

  363. @sandimetz Mar 2014
    refactor through complexity
    Friday, March 7, 14

    View Slide

  364. @sandimetz Mar 2014
    refactor into simplicity
    Friday, March 7, 14

    View Slide

  365. @sandimetz Mar 2014
    Friday, March 7, 14

    View Slide

  366. @sandimetz Mar 2014
    Thanks
    Friday, March 7, 14

    View Slide

  367. @sandimetz Mar 2014
    Thanks
    Jim
    Friday, March 7, 14

    View Slide

  368. @sandimetz Mar 2014
    Questions?
    Friday, March 7, 14

    View Slide

  369. http://poodr.com
    Sandi Metz
    @sandimetz
    @sandimetz Mar 2014
    Friday, March 7, 14

    View Slide