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

all the little things (railsconf)

all the little things (railsconf)

Turning conditionals into objects....

Sandi Metz

April 24, 2014
Tweet

More Decks by Sandi Metz

Other Decks in Programming

Transcript

  1. @sandimetz Apr 2014 sandi metz all the little things 1

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

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

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

    24, 14
  5. @sandimetz Apr 2014 class  GildedRose    attr_reader  :name,  :quality,  :days_remaining

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

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

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

       def  initialize(name,  quality,  days_remaining)        @name,  @quality,  @days_remaining  =  name,  quality,  days_remaining    end    def  tick        #  ...    end end 5 Thursday, April 24, 14
  9. @sandimetz Apr 2014    def  tick        if

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

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

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

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

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

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

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

  17. @sandimetz Apr 2014    def  tick        if

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

     @name  !=  'Aged  Brie'  &&  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'            if  @quality  >  0                if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'                    @quality  -­‐=  1                end            end        else            if  @quality  <  50                  @quality  +=  1                if  @name  ==  'Backstage  passes  to  a  TAFKAL80ETC  concert'                    if  @days_remaining  <  11                        if  @quality  <  50                            @quality  +=  1                        end                    end                    if  @days_remaining  <  6                        if  @quality  <  50                            @quality  +=  1                        end                    end                end            end        end        if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'            @days_remaining  -­‐=  1        end        if  @days_remaining  <  0            if  @name  !=  "Aged  Brie"                if  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'                    if  @quality  >  0                        if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'                            @quality  -­‐=  1                        end                    end                else                    @quality  =  @quality  -­‐  @quality                end            else                if  @quality  <  50                    @quality  +=  1                end            end        end    end it has tests 19 Thursday, April 24, 14
  34. @sandimetz Apr 2014 #  Running: S..S.S...S..........S....S..... Fabulous  run  in  0.002800s,

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

     11071.4286  runs/s,  17857.1429  assertions/s. 31  runs,  50  assertions,  0  failures,  0  errors,  6  skips 20 Thursday, April 24, 14
  36. @sandimetz Apr 2014 class  GildedRoseTest  <  Minitest::Test    def  test_normal_item_before_sell_date

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

       def  test_conjured_item_at_zero_quality    def  test_conjured_item_on_sell_date    def  test_conjured_item_on_sell_date_at_zero_quality    def  test_conjured_item_after_sell_date    def  test_conjured_item_after_sell_date_at_zero_quality end 26 Thursday, April 24, 14
  58. @sandimetz Apr 2014 27 Thursday, April 24, 14

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

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

    14
  61. @sandimetz Apr 2014 class  GildedRoseTest  <  Minitest::Test    def  test_conjured_item_before_sell_date

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

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

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

       def  test_conjured_item_at_zero_quality    def  test_conjured_item_on_sell_date    def  test_conjured_item_on_sell_date_at_zero_quality    def  test_conjured_item_after_sell_date    def  test_conjured_item_after_sell_date_at_zero_quality end miserably 30 Thursday, April 24, 14
  65. @sandimetz Apr 2014 the pattern failed me 31 Thursday, April

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

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

  68. @sandimetz Apr 2014 Task: Refactor code so I can Implement

    Conjured 32 Thursday, April 24, 14
  69. @sandimetz Apr 2014 class  GildedRoseTest  <  Minitest::Test    def  test_normal_item_before_sell_date

       def  test_normal_item_on_sell_date    def  test_normal_item_after_sell_date    def  test_normal_item_of_zero_quality normal 33 Thursday, April 24, 14
  70. @sandimetz Apr 2014    def  tick        if

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

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

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

     name  ==  'normal'            return        end        if  @name  !=  'Aged  Brie'  &&  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  c            if  @quality  >  0                if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'                    @quality  -­‐=  1                end            end        else            if  @quality  <  50                  @quality  +=  1                if  @name  ==  'Backstage  passes  to  a  TAFKAL80ETC  concert'                    if  @days_remaining  <  11                        if  @quality  <  50                            @quality  +=  1                        end                    end                    if  @days_remaining  <  6                        if  @quality  <  50                            @quality  +=  1                        end                    end                end    def  tick        if  name  ==  'normal'            return        end        if  name  !=  'Aged  Brie'  &&  name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'            if  quality  >  0                if  name  !=  'Sulfuras,  Hand  of  Ragnaros'                    @quality  -­‐=  1                end            end        else            if  quality  <  50                  @quality  +=  1                if  name  ==  'Backstage  passes  to  a  TAFKAL80ETC  concert'                    if  days_remaining  <  11                        if  quality  <  50                            @quality  +=  1                        end                    end                    if  days_remaining  <  6                        if  quality  <  50                            @quality  +=  1                        end                    end                end            end        end        if  name  !=  'Sulfuras,  Hand  of  Ragnaros'            @days_remaining  -­‐=  1        end        if  days_remaining  <  0            if  name  !=  "Aged  Brie"                if  name  !=  'Backstage  passes  to  a  TAFKAL80ETC  concert'                    if  quality  >  0                        if  name  !=  'Sulfuras,  Hand  of  Ragnaros'                            @quality  -­‐=  1                        end                    end                else                    @quality  =  quality  -­‐  quality                end            else                if  quality  <  50                    @quality  +=  1                end            end        end    end end 36 Thursday, April 24, 14
  74. @sandimetz Apr 2014 #  Running: .S...S...S..SFF....F.....SS.F.. Fabulous  run  in  0.020340s,

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

     1524.0905  runs/s,  2310.7178  assertions/s.    1)  Failure: GildedRoseTest#test_normal_item_of_zero_quality  [gilded_rose_test.rb:37]: Expected:  4    Actual:  5    2)  Failure: GildedRoseTest#test_normal_item_before_sell_date  [gilded_rose_test.rb:12]: Expected:  9    Actual:  10    3)  Failure: GildedRoseTest#test_normal_item_on_sell_date  [gilded_rose_test.rb:20]: Expected:  8    Actual:  10    4)  Failure: GildedRoseTest#test_normal_item_after_sell_date  [gilded_rose_test.rb:28]: Expected:  8    Actual:  10 31  runs,  47  assertions,  4  failures,  0  errors,  6  skips 4 failures 37 Thursday, April 24, 14
  76. @sandimetz Apr 2014 class  GildedRose    def  tick    

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

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

       if  name  ==  'normal'            return  normal_tick        end        if  @name  !=  'Aged  Brie'  &&  @name  !=  'Backstage  passes  to  a  TAFKAL80ETC  c            if  @quality  >  0                if  @name  !=  'Sulfuras,  Hand  of  Ragnaros'                    #  ...  40  more  lines    end    def  normal_tick    end end 40 Thursday, April 24, 14
  79. @sandimetz Apr 2014 #  Running: .S...S...S..SFF....F.....SS.F.. Fabulous  run  in  0.020340s,

     1524.0905  runs/s,  2310.7178  assertions/s.    1)  Failure: GildedRoseTest#test_normal_item_of_zero_quality  [gilded_rose_test.rb:37]: Expected:  4    Actual:  5    2)  Failure: GildedRoseTest#test_normal_item_before_sell_date  [gilded_rose_test.rb:12]: Expected:  9    Actual:  10    3)  Failure: GildedRoseTest#test_normal_item_on_sell_date  [gilded_rose_test.rb:20]: Expected:  8    Actual:  10    4)  Failure: GildedRoseTest#test_normal_item_after_sell_date  [gilded_rose_test.rb:28]: Expected:  8    Actual:  10 31  runs,  47  assertions,  4  failures,  0  errors,  6  skips 4 failures 41 Thursday, April 24, 14
  80. @sandimetz Apr 2014    def  test_normal_item_before_sell_date        item

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

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

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

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

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

     =  GildedRose.new('normal',  10,  5)        item.tick        assert_equal  9,  item.quality        assert_equal  4,  item.days_remaining    end class  GildedRose    #  ...    def  normal_tick        @quality  -­‐=  1        @days_remaining  -­‐=  1    end end 44 Thursday, April 24, 14
  86. @sandimetz Apr 2014 #  Running: .....S...FS....FS.S...FS....S.. Fabulous  run  in  0.029178s,

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

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

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

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

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

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

     =  GildedRose.new('normal',  10,  0)        item.tick        assert_equal    8,  item.quality        assert_equal  -­‐1,  item.days_remaining    end class  GildedRose    #  ...    def  normal_tick        if  @days_remaining  >  0            @quality  -­‐=  1        end        if  @days_remaining  <=  0            @quality  -­‐=  2        end        @days_remaining  -­‐=  1    end end 49 Thursday, April 24, 14
  93. @sandimetz Apr 2014 #  Running: ...S.S.....S..S..SF.....S...... Fabulous  run  in  0.019924s,

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

     1555.9125  runs/s,  2459.3455  assertions/s.    1)  Failure: GildedRoseTest#test_normal_item_of_zero_quality  [gilded_rose_test.rb:37]: Expected:  0    Actual:  -­‐1 31  runs,  49  assertions,  1  failures,  0  errors,  6  skips 1 failure ?? 50 Thursday, April 24, 14
  95. @sandimetz Apr 2014    def  test_normal_item_of_zero_quality        item

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

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

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

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

     =  GildedRose.new('normal',  0,  5)        item.tick        assert_equal  0,  item.quality        assert_equal  4,  item.days_remaining    end class  GildedRose      #  ...    def  normal_tick        if  @quality  !=  0            if  @days_remaining  >  0                @quality  -­‐=  1            end            if  @days_remaining  <=  0                @quality  -­‐=  2            end        end        @days_remaining  -­‐=  1    end end 53 Thursday, April 24, 14
  100. @sandimetz Apr 2014 #  Running: S..S.S...S..........S....S..... Fabulous  run  in  0.002800s,

     11071.4286  runs/s,  17857.1429  assertions/s. 31  runs,  50  assertions,  0  failures,  0  errors,  6  skips 54 Thursday, April 24, 14
  101. @sandimetz Apr 2014 refactor under green 55 Thursday, April 24,

    14
  102. @sandimetz Apr 2014 reach for the lowest hanging green 56

    Thursday, April 24, 14
  103. @sandimetz Apr 2014    def  normal_tick        if

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

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

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

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

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

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

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

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

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

     -­‐=  1        return  if  @quality  ==  0        @quality  -­‐=  1        @quality  -­‐=  1  if  @days_remaining  <=  0    end 66 Thursday, April 24, 14
  113. @sandimetz Apr 2014 #  Running: S..S.S...S..........S....S..... Fabulous  run  in  0.002800s,

     11071.4286  runs/s,  17857.1429  assertions/s. 31  runs,  50  assertions,  0  failures,  0  errors,  6  skips 67 Thursday, April 24, 14
  114. @sandimetz Apr 2014 class  GildedRose    def  tick    

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

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

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

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

     ...  etc    def  test_brie_before_sell_date    def  test_brie_before_sell_date_with_max_quality    def  test_brie_on_sell_date    def  test_brie_on_sell_date_near_max_quality    def  test_brie_on_sell_date_with_max_quality    def  test_brie_after_sell_date    def  test_brie_after_sell_date_with_max_quality #    def  test_sulfuras    ...  etc #    def  test_backstage  ...  etc end brie 71 Thursday, April 24, 14
  119. @sandimetz Apr 2014    def  tick      if  name

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

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

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

     name        when  'normal'            return  normal_tick        when  'Aged  Brie'            return  brie_tick        end        #  ...    end    def  brie_tick    end 75 Thursday, April 24, 14
  123. @sandimetz Apr 2014 #  Running: .F...F.....S.S.F..S.FF.S.F.FS.S Fabulous  run  in  0.027410s,

     1130.9741  runs/s,  1678.2196  assertions/s.    1)  Failure: GildedRoseTest#test_brie_on_sell_date_with_max_quality  [gilded_rose_test.rb:78]: Expected:  4    Actual:  5    2)  Failure: GildedRoseTest#test_brie_on_sell_date_near_max_quality  [gilded_rose_test.rb:69]: Expected:  50    Actual:  49    3)  Failure: GildedRoseTest#test_brie_on_sell_date  [gilded_rose_test.rb:61]: Expected:  12    Actual:  10    4)  Failure: GildedRoseTest#test_brie_after_sell_date_with_max_quality  [gilded_rose_test.rb:94]: Expected:  -­‐11    Actual:  -­‐10    5)  Failure: GildedRoseTest#test_brie_before_sell_date_with_max_quality  [gilded_rose_test.rb:54]: Expected:  6    Actual:  7 7 failures 76 Thursday, April 24, 14
  124. @sandimetz Apr 2014    def  tick        case

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

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

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

     name        when  'normal'            return  normal_tick        when  'Aged  Brie'            return  brie_tick        end        #  ...    end    def  brie_tick        @days_remaining  -­‐=  1        return  if  @quality  >=  50        @quality  +=  1        @quality  +=  1  if  @days_remaining  <=  0    end brie 78 Thursday, April 24, 14
  128. @sandimetz Apr 2014 #  Running: ...S......S.....SS.....SS...... Fabulous  run  in  0.003862s,

     8026.9291  runs/s,  12946.6598  assertions/s. 31  runs,  50  assertions,  0  failures,  0  errors,  6  skips 79 Thursday, April 24, 14
  129. @sandimetz Apr 2014  def  normal_tick        @days_remaining  -­‐=

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

     1        return  if  @quality  ==  0        @quality  -­‐=  1        @quality  -­‐=  1  if  @days_remaining  <=  0    end    def  brie_tick        @days_remaining  -­‐=  1        return  if  @quality  >=  50        @quality  +=  1        @quality  +=  1  if  @days_remaining  <=  0    end 81 Thursday, April 24, 14
  131. @sandimetz Apr 2014 duplication is far cheaper than the wrong

    abstraction 82 Thursday, April 24, 14
  132. @sandimetz Apr 2014 class  GildedRoseTest  <  Minitest::Test #  def  test_normal

     ...  etc #  def  test_brie      ...  etc    def  test_sulfuras_before_sell_date    def  test_sulfuras_on_sell_date    def  test_sulfuras_after_sell_date #  def  test_backstage  ...  etc end sulfuras 83 Thursday, April 24, 14
  133. @sandimetz Apr 2014    def  tick        case

     name        when  'normal'            return  normal_tick        when  'Aged  Brie'            return  brie_tick        when  'Sulfuras,  Hand  of  Ragnaros'            return  sulfuras_tick        end        #  ...    end    def  sulfuras_tick    end 84 Thursday, April 24, 14
  134. @sandimetz Apr 2014 #  Running: ...S......S.....SS.....SS...... Fabulous  run  in  0.003862s,

     8026.9291  runs/s,  12946.6598  assertions/s. 31  runs,  50  assertions,  0  failures,  0  errors,  6  skips 0 failures ?!? 85 Thursday, April 24, 14
  135. @sandimetz Apr 2014    def  tick        case

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

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

     name        when  'normal'            return  normal_tick        when  'Aged  Brie'            return  brie_tick        when  'Sulfuras,  Hand  of  Ragnaros'            return  sulfuras_tick        end        #  ...    end    def  sulfuras_tick    end sulfuras 86 Thursday, April 24, 14
  138. @sandimetz Apr 2014 class  GildedRoseTest  <  Minitest::Test #  def  test_normal

         ...  etc #  def  test_brie          ...  etc #  def  test_sulfuras  ...  etc    def  test_backstage_pass_long_before_sell_date    def  test_backstage_pass_medium_close_to_sell_date_upper_bound    def  test_backstage_pass_medium_close_to_sell_date_upper_bound_at_max_quality    def  test_backstage_pass_medium_close_to_sell_date_lower_bound    def  test_backstage_pass_medium_close_to_sell_date_lower_bound_at_max_quality    def  test_backstage_pass_very_close_to_sell_date_upper_bound    def  test_backstage_pass_very_close_to_sell_date_upper_bound_at_max_quality    def  test_backstage_pass_very_close_to_sell_date_lower_bound    def  test_backstage_pass_very_close_to_sell_date_lower_bound_at_max_quality    def  test_backstage_pass_on_sell_date    def  test_backstage_pass_after_sell_date end backstage 87 Thursday, April 24, 14
  139. @sandimetz Apr 2014    def  tick        case

     name        when  'normal'        when  'Aged  Brie'        when  'Sulfuras,  Hand  of  Ragnaros'        when  'Backstage  passes  to  a  TAFKAL80ETC  concert'            return  backstage_tick        end        #  ...    end    def  backstage_tick        @days_remaining  -­‐=  1        return                            if  @quality  >=  50        return  @quality  =  0  if  @days_remaining  <  0        @quality  +=  1        @quality  +=  1  if  @days_remaining  <  10        @quality  +=  1  if  @days_remaining  <  5    end backstage 88 Thursday, April 24, 14
  140. @sandimetz Apr 2014 #  Running: ...S......S.....SS.....SS...... Fabulous  run  in  0.003472s,

     8928.5714  runs/s,  14400.9217  assertions/s. 31  runs,  50  assertions,  0  failures,  0  errors,  6  skips 89 Thursday, April 24, 14
  141. @sandimetz Apr 2014    def  tick        case

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

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

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

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

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

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

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

     8928.5714  runs/s,  14400.9217  assertions/s. 31  runs,  50  assertions,  0  failures,  0  errors,  6  skips 91 Thursday, April 24, 14
  149. @sandimetz Apr 2014 small methods are simple 92 Thursday, April

    24, 14
  150. @sandimetz Apr 2014 class  GildedRose    attr_reader  :name,  :quality,  :days_remaining

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

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

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

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

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

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

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

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

    14
  159. @sandimetz Apr 2014    def  normal_tick        @days_remaining

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

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

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

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

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

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

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

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

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

    14
  169. @sandimetz Apr 2014 open for extension closed for modification 103

    Thursday, April 24, 14
  170. @sandimetz Apr 2014    def  normal_tick        @days_remaining

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

  172. @sandimetz Apr 2014 OO Principles a style guide for arranging

    code 106 Thursday, April 24, 14
  173. @sandimetz Apr 2014    def  normal_tick        @days_remaining

     -­‐=  1        return  if  @quality  ==  0        @quality  -­‐=  1        @quality  -­‐=  1  if  @days_remaining  <=  0    end    def  brie_tick        @days_remaining  -­‐=  1        return  if  @quality  >=  50        @quality  +=  1        @quality  +=  1  if  @days_remaining  <=  0    end    def  sulfuras_tick    end    def  backstage_tick        @days_remaining  -­‐=  1        return                            if  @quality  >=  50        return  @quality  =  0  if  @days_remaining  <  0        @quality  +=  1        @quality  +=  1  if  @days_remaining  <  10        @quality  +=  1  if  @days_remaining  <  5    end def  normal_tick def  brie_tick def  sulfuras_tick def  backstage_tick 107 Thursday, April 24, 14
  174. @sandimetz Apr 2014 they’re screaming to get out 108 Thursday,

    April 24, 14
  175. @sandimetz Apr 2014    def  normal_tick        @days_remaining

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

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

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

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

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

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

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

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

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

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

    Thursday, April 24, 14
  186. @sandimetz Apr 2014        def  normal_tick    

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

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

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

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

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

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

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

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

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

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

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

    14
  198. @sandimetz Apr 2014 class  GildedRose      def  normal_tick  

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

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

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

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

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

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

  205. @sandimetz Apr 2014 class  GildedRose    def  brie_tick    

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

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

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

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

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

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

  212. @sandimetz Apr 2014 class  GildedRose    def  sulfuras_tick    end

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

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

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

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

  217. @sandimetz Apr 2014 class  GildedRose    def  backstage_tick    

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

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

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

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

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

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

       @item  =  Backstage.new(quality,  days_remaining)        item.tick    end    class  Backstage        attr_reader  :quality,  :days_remaining        def  initialize(quality,  days_remaining)            @quality,  @days_remaining  =  quality,  days_remaining        end        def  tick            @days_remaining  -­‐=  1            return                            if  @quality  >=  50            return  @quality  =  0  if  @days_remaining  <  0            @quality  +=  1            @quality  +=  1  if  @days_remaining  <  10            @quality  +=  1  if  @days_remaining  <  5        end 154 Thursday, April 24, 14
  224. @sandimetz Apr 2014 normal/brie/sulfuras/backstage are now objects 155 Thursday, April

    24, 14
  225. @sandimetz Apr 2014 GildedRose tick Normal tick Brie tick Sulfuras

    attr_reader  :item tick Backstage attr_reader    :quality,    :days_remaining 156 Thursday, April 24, 14
  226. @sandimetz Apr 2014 class  GildedRose    def  tick    

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

  228. @sandimetz Apr 2014 class  GildedRose    def  tick    

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

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

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

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

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

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

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

       case  name        when  'normal'            @item  =  Normal.new(quality,  days_remaining)            item.tick        when  'Aged  Brie'            @item  =  Brie.new(quality,  days_remaining)            item.tick        when  'Sulfuras,  Hand  of  Ragnaros'            @item  =  Sulfuras.new(quality,  days_remaining)            item.tick        when  'Backstage  passes  to  a  TAFKAL80ETC  concert'            @item  =  Backstage.new(quality,  days_remaining)            item.tick        end    end 166 Thursday, April 24, 14
  236. @sandimetz Apr 2014 abstract away the duplication 167 Thursday, April

    24, 14
  237. @sandimetz Apr 2014 class  GildedRose    def  tick    

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

     initialize(name,  quality,  days_remaining)        @item  =  klass_for(name).new(quality,  days_remaining)    end    def  klass_for(name)        #  ...    end    def  tick        item.tick    end    def  quality        item.quality    end    def  days_remaining        item.days_remaining    end    class  Normal    class  Brie    class  Sulfuras    class  Backstage end 183 Thursday, April 24, 14
  260. @sandimetz Apr 2014 item is a role 184 Thursday, April

    24, 14
  261. @sandimetz Apr 2014 GildedRose tick Normal tick Brie tick Sulfuras

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

           klass_for(name).new(quality,  days_remaining)    end    def  self.klass_for(name)        #  ...    end    class  Normal    class  Brie    class  Sulfuras    class  Backstage end 199 Thursday, April 24, 14
  293. @sandimetz Apr 2014 Foo def  self.for(name,...) end attr_reader  :rose def

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

     =          GildedRose.for(            ‘normal’,  ...)     end ItemRole def  tick   def  quality def  days_remaining def  self.for(name,...) end GildedRose 201 Thursday, April 24, 14
  295. @sandimetz Apr 2014 extract common code 202 Thursday, April 24,

    14
  296. @sandimetz Apr 2014 module  GildedRose    def  self.for(name,  quality,  days_remaining)

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

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

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

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

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

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

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

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

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

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

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

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

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

       attr_reader  :quality,  :days_remaining        def  initialize(quality,  days_remaining)            @quality,  @days_remaining  =  quality,  days_remaining        end    end    class  Normal  <  Item        def  tick            #  ...        end    end    class  Brie  <  Item        def  tick          #  ...        end    end    class  Sulfuras  <  Item        def  tick        end    end    class  Backstage  <  Item        def  tick 213 Thursday, April 24, 14
  310. @sandimetz Apr 2014 inheritance is not evil 214 Thursday, April

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

    24, 14
  312. @sandimetz Apr 2014 module  GildedRose    class  Item    

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  330. @sandimetz Apr 2014 module  GildedRose    def  self.for(name,  quality,  days_remaining)

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

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

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

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

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

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

  337. @sandimetz Apr 2014 module  GildedRose    class  Item    

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  359. @sandimetz Apr 2014 module  GildedRose    class  Conjured  <  Item

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

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

           def  tick            @days_remaining  -­‐=  1            return  if  @quality  ==  0            @quality  -­‐=  2            @quality  -­‐=  2  if  @days_remaining  <=  0        end    end    SPECIALIZED_CLASSES  =  {        'normal'                                                                        =>  Normal,        'Aged  Brie'                                                                  =>  Brie,        'Backstage  passes  to  a  TAFKAL80ETC  concert'  =>  Backstage,        'Conjured  Mana  Cake'                                                =>  Conjured  } 254 Thursday, April 24, 14
  362. @sandimetz Apr 2014 #  Running: ............................... Fabulous  run  in  0.003917s,

     7914.2201  runs/s,  15828.4401  assertions/s. 31  runs,  62  assertions,  0  failures,  0  errors,  0  skips 255 Thursday, April 24, 14
  363. @sandimetz Apr 2014 Summary 256 Thursday, April 24, 14

  364. @sandimetz Apr 2014 prefer duplication over the wrong abstraction 257

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

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

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

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

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

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

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

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

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

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

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

    3-4 266 Thursday, April 24, 14
  376. @sandimetz Apr 2014 267 Thursday, April 24, 14

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

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

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

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