all the little things (rubyonales)

all the little things (rubyonales)

66ad01cf37c098bfdb76906a490e018f?s=128

Sandi Metz

March 07, 2014
Tweet

Transcript

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

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

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

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

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

       def  initialize(name,  quality,  days_remaining)        @name,  @quality,  @days_remaining  =  name,  quality,  days_remaining    end    def  tick        #  ...    end end Friday, March 7, 14
  6. @sandimetz Mar 2014 class  GildedRose    attr_reader  :name,  :quality,  :days_remaining

       def  initialize(name,  quality,  days_remaining)        @name,  @quality,  @days_remaining  =  name,  quality,  days_remaining    end    def  tick        #  ...    end end Friday, March 7, 14
  7. @sandimetz Mar 2014 class  GildedRose    attr_reader  :name,  :quality,  :days_remaining

       def  initialize(name,  quality,  days_remaining)        @name,  @quality,  @days_remaining  =  name,  quality,  days_remaining    end    def  tick        #  ...    end end Friday, March 7, 14
  8. @sandimetz Mar 2014 class  GildedRose    attr_reader  :name,  :quality,  :days_remaining

       def  initialize(name,  quality,  days_remaining)        @name,  @quality,  @days_remaining  =  name,  quality,  days_remaining    end    def  tick        #  ...    end end Friday, March 7, 14
  9. @sandimetz Mar 2014    def  tick        if

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

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

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

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

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

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

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

  17. @sandimetz Mar 2014    def  tick        if

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

     11071.4286  runs/s,  17857.1429  assertions/s. 31  runs,  50  assertions,  0  failures,  0  errors,  6  skips Friday, March 7, 14
  35. @sandimetz Mar 2014 #  Running: S..S.S...S..........S....S..... Fabulous  run  in  0.002800s,

     11071.4286  runs/s,  17857.1429  assertions/s. 31  runs,  50  assertions,  0  failures,  0  errors,  6  skips Friday, March 7, 14
  36. @sandimetz Mar 2014 class  GildedRoseTest  <  Minitest::Test    def  test_normal_item_before_sell_date

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

       def  test_conjured_item_at_zero_quality    def  test_conjured_item_on_sell_date    def  test_conjured_item_on_sell_date_at_zero_quality    def  test_conjured_item_after_sell_date    def  test_conjured_item_after_sell_date_at_zero_quality end Friday, March 7, 14
  55. @sandimetz Mar 2014 class  GildedRoseTest  <  Minitest::Test    def  test_conjured_item_before_sell_date

       def  test_conjured_item_at_zero_quality    def  test_conjured_item_on_sell_date    def  test_conjured_item_on_sell_date_at_zero_quality    def  test_conjured_item_after_sell_date    def  test_conjured_item_after_sell_date_at_zero_quality end 6 skipped tests Friday, March 7, 14
  56. @sandimetz Mar 2014 class  GildedRoseTest  <  Minitest::Test    def  test_conjured_item_before_sell_date

       def  test_conjured_item_at_zero_quality    def  test_conjured_item_on_sell_date    def  test_conjured_item_on_sell_date_at_zero_quality    def  test_conjured_item_after_sell_date    def  test_conjured_item_after_sell_date_at_zero_quality end Friday, March 7, 14
  57. @sandimetz Mar 2014 class  GildedRoseTest  <  Minitest::Test    def  test_conjured_item_before_sell_date

       def  test_conjured_item_at_zero_quality    def  test_conjured_item_on_sell_date    def  test_conjured_item_on_sell_date_at_zero_quality    def  test_conjured_item_after_sell_date    def  test_conjured_item_after_sell_date_at_zero_quality end Friday, March 7, 14
  58. @sandimetz Mar 2014 Friday, March 7, 14

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

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

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

       def  test_conjured_item_at_zero_quality    def  test_conjured_item_on_sell_date    def  test_conjured_item_on_sell_date_at_zero_quality    def  test_conjured_item_after_sell_date    def  test_conjured_item_after_sell_date_at_zero_quality end Friday, March 7, 14
  62. @sandimetz Mar 2014 class  GildedRoseTest  <  Minitest::Test    def  test_conjured_item_before_sell_date

       def  test_conjured_item_at_zero_quality    def  test_conjured_item_on_sell_date    def  test_conjured_item_on_sell_date_at_zero_quality    def  test_conjured_item_after_sell_date    def  test_conjured_item_after_sell_date_at_zero_quality end I tried Friday, March 7, 14
  63. @sandimetz Mar 2014 class  GildedRoseTest  <  Minitest::Test    def  test_conjured_item_before_sell_date

       def  test_conjured_item_at_zero_quality    def  test_conjured_item_on_sell_date    def  test_conjured_item_on_sell_date_at_zero_quality    def  test_conjured_item_after_sell_date    def  test_conjured_item_after_sell_date_at_zero_quality end but failed Friday, March 7, 14
  64. @sandimetz Mar 2014 class  GildedRoseTest  <  Minitest::Test    def  test_conjured_item_before_sell_date

       def  test_conjured_item_at_zero_quality    def  test_conjured_item_on_sell_date    def  test_conjured_item_on_sell_date_at_zero_quality    def  test_conjured_item_after_sell_date    def  test_conjured_item_after_sell_date_at_zero_quality end miserably Friday, March 7, 14
  65. @sandimetz Mar 2014 the pattern failed me Friday, March 7,

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

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

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

    Conjured Friday, March 7, 14
  69. @sandimetz Mar 2014 class  GildedRoseTest  <  Minitest::Test    def  test_normal_item_before_sell_date

       def  test_normal_item_on_sell_date    def  test_normal_item_after_sell_date    def  test_normal_item_of_zero_quality normal Friday, March 7, 14
  70. @sandimetz Mar 2014    def  tick        if

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

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

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

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

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

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

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

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

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

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

     =  GildedRose.new('normal',  10,  5)        item.tick        assert_equal  9,  item.quality        assert_equal  4,  item.days_remaining    end Friday, March 7, 14
  81. @sandimetz Mar 2014    def  test_normal_item_before_sell_date        item

     =  GildedRose.new('normal',  10,  5)        item.tick        assert_equal  9,  item.quality        assert_equal  4,  item.days_remaining    end class  GildedRose    #  ...    def  normal_tick    end end Friday, March 7, 14
  82. @sandimetz Mar 2014    def  test_normal_item_before_sell_date        item

     =  GildedRose.new('normal',  10,  5)        item.tick        assert_equal  9,  item.quality        assert_equal  4,  item.days_remaining    end class  GildedRose    #  ...    def  normal_tick    end end Friday, March 7, 14
  83. @sandimetz Mar 2014    def  test_normal_item_before_sell_date        item

     =  GildedRose.new('normal',  10,  5)        item.tick        assert_equal  9,  item.quality        assert_equal  4,  item.days_remaining    end class  GildedRose    #  ...    def  normal_tick        @quality  -­‐=  1        @days_remaining  -­‐=  1    end end Friday, March 7, 14
  84. @sandimetz Mar 2014    def  test_normal_item_before_sell_date        item

     =  GildedRose.new('normal',  10,  5)        item.tick        assert_equal  9,  item.quality        assert_equal  4,  item.days_remaining    end class  GildedRose    #  ...    def  normal_tick        @quality  -­‐=  1        @days_remaining  -­‐=  1    end end Friday, March 7, 14
  85. @sandimetz Mar 2014    def  test_normal_item_before_sell_date        item

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

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

     =  GildedRose.new('normal',  10,  0)        item.tick        assert_equal    8,  item.quality        assert_equal  -­‐1,  item.days_remaining    end class  GildedRose    #  ...    def  normal_tick        @quality  -­‐=  1        @days_remaining  -­‐=  1    end end Friday, March 7, 14
  88. @sandimetz Mar 2014    def  test_normal_item_on_sell_date        item

     =  GildedRose.new('normal',  10,  0)        item.tick        assert_equal    8,  item.quality        assert_equal  -­‐1,  item.days_remaining    end class  GildedRose    #  ...    def  normal_tick        @quality  -­‐=  1        @days_remaining  -­‐=  1    end end Friday, March 7, 14
  89. @sandimetz Mar 2014    def  test_normal_item_on_sell_date        item

     =  GildedRose.new('normal',  10,  0)        item.tick        assert_equal    8,  item.quality        assert_equal  -­‐1,  item.days_remaining    end class  GildedRose    #  ...    def  normal_tick        @quality  -­‐=  1        @days_remaining  -­‐=  1    end end Friday, March 7, 14
  90. @sandimetz Mar 2014    def  test_normal_item_on_sell_date        item

     =  GildedRose.new('normal',  10,  0)        item.tick        assert_equal    8,  item.quality        assert_equal  -­‐1,  item.days_remaining    end class  GildedRose    #  ...    def  normal_tick            @quality  -­‐=  1        @days_remaining  -­‐=  1    end end Friday, March 7, 14
  91. @sandimetz Mar 2014    def  test_normal_item_on_sell_date        item

     =  GildedRose.new('normal',  10,  0)        item.tick        assert_equal    8,  item.quality        assert_equal  -­‐1,  item.days_remaining    end class  GildedRose    #  ...    def  normal_tick        if  @days_remaining  >  0            @quality  -­‐=  1        end        @days_remaining  -­‐=  1    end end Friday, March 7, 14
  92. @sandimetz Mar 2014    def  test_normal_item_on_sell_date        item

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

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

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

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

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

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

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

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

     11071.4286  runs/s,  17857.1429  assertions/s. 31  runs,  50  assertions,  0  failures,  0  errors,  6  skips Friday, March 7, 14
  101. @sandimetz Mar 2014 refactor under green Friday, March 7, 14

  102. @sandimetz Mar 2014    def  normal_tick        if

     @quality  !=  0            if  @days_remaining  >  0                @quality  -­‐=  1            end            if  @days_remaining  <=  0                @quality  -­‐=  2            end        end        @days_remaining  -­‐=  1    end Friday, March 7, 14
  103. @sandimetz Mar 2014    def  normal_tick    end    def

     normal_tick        if  @quality  !=  0            if  @days_remaining  >  0                @quality  -­‐=  1            end            if  @days_remaining  <=  0                @quality  -­‐=  2            end        end        @days_remaining  -­‐=  1    end Friday, March 7, 14
  104. @sandimetz Mar 2014    def  normal_tick        @days_remaining

     -­‐=  1    end    def  normal_tick        if  @quality  !=  0            if  @days_remaining  >  0                @quality  -­‐=  1            end            if  @days_remaining  <=  0                @quality  -­‐=  2            end        end        @days_remaining  -­‐=  1    end Friday, March 7, 14
  105. @sandimetz Mar 2014    def  normal_tick        @days_remaining

     -­‐=  1    end    def  normal_tick        if  @quality  !=  0            if  @days_remaining  >  0                @quality  -­‐=  1            end            if  @days_remaining  <=  0                @quality  -­‐=  2            end        end    end Friday, March 7, 14
  106. @sandimetz Mar 2014    def  normal_tick        @days_remaining

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

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

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

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

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

     -­‐=  1        return  if  @quality  ==  0        @quality  -­‐=  1        @quality  -­‐=  1  if  @days_remaining  <=  0    end Friday, March 7, 14
  112. @sandimetz Mar 2014 #  Running: S..S.S...S..........S....S..... Fabulous  run  in  0.002800s,

     11071.4286  runs/s,  17857.1429  assertions/s. 31  runs,  50  assertions,  0  failures,  0  errors,  6  skips Friday, March 7, 14
  113. @sandimetz Mar 2014 class  GildedRose    def  tick    

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

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

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

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

     ...  etc    def  test_brie_before_sell_date    def  test_brie_before_sell_date_with_max_quality    def  test_brie_on_sell_date    def  test_brie_on_sell_date_near_max_quality    def  test_brie_on_sell_date_with_max_quality    def  test_brie_after_sell_date    def  test_brie_after_sell_date_with_max_quality #    def  test_sulfuras    ...  etc #    def  test_backstage  ...  etc end brie Friday, March 7, 14
  118. @sandimetz Mar 2014    def  tick      if  name

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

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

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

     name        when  'normal'            return  normal_tick        when  'Aged  Brie'            return  brie_tick        end        #  ...    end    def  brie_tick    end Friday, March 7, 14
  122. @sandimetz Mar 2014 #  Running: .F...F.....S.S.F..S.FF.S.F.FS.S Fabulous  run  in  0.027410s,

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

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

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

     name        when  'normal'            return  normal_tick        when  'Aged  Brie'            return  brie_tick        end        #  ...    end    def  brie_tick        @days_remaining  -­‐=  1        return  if  @quality  >=  50        @quality  +=  1        @quality  +=  1  if  @days_remaining  <=  0    end Friday, March 7, 14
  126. @sandimetz Mar 2014    def  tick        case

     name        when  'normal'            return  normal_tick        when  'Aged  Brie'            return  brie_tick        end        #  ...    end    def  brie_tick        @days_remaining  -­‐=  1        return  if  @quality  >=  50        @quality  +=  1        @quality  +=  1  if  @days_remaining  <=  0    end brie Friday, March 7, 14
  127. @sandimetz Mar 2014 #  Running: ...S......S.....SS.....SS...... Fabulous  run  in  0.003862s,

     8026.9291  runs/s,  12946.6598  assertions/s. 31  runs,  50  assertions,  0  failures,  0  errors,  6  skips Friday, March 7, 14
  128. @sandimetz Mar 2014  def  normal_tick        @days_remaining  -­‐=

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

     1        return  if  @quality  ==  0        @quality  -­‐=  1        @quality  -­‐=  1  if  @days_remaining  <=  0    end    def  brie_tick        @days_remaining  -­‐=  1        return  if  @quality  >=  50        @quality  +=  1        @quality  +=  1  if  @days_remaining  <=  0    end Friday, March 7, 14
  130. @sandimetz Mar 2014 duplication is far cheaper than the wrong

    abstraction Friday, March 7, 14
  131. @sandimetz Mar 2014 class  GildedRoseTest  <  Minitest::Test #  def  test_normal

     ...  etc #  def  test_brie      ...  etc    def  test_sulfuras_before_sell_date    def  test_sulfuras_on_sell_date    def  test_sulfuras_after_sell_date #  def  test_backstage  ...  etc end sulfuras Friday, March 7, 14
  132. @sandimetz Mar 2014    def  tick        case

     name        when  'normal'            return  normal_tick        when  'Aged  Brie'            return  brie_tick        when  'Sulfuras,  Hand  of  Ragnaros'            return  sulfuras_tick        end        #  ...    end    def  sulfuras_tick    end Friday, March 7, 14
  133. @sandimetz Mar 2014 #  Running: ...S......S.....SS.....SS...... Fabulous  run  in  0.003862s,

     8026.9291  runs/s,  12946.6598  assertions/s. 31  runs,  50  assertions,  0  failures,  0  errors,  6  skips 0 failures ?!? Friday, March 7, 14
  134. @sandimetz Mar 2014    def  tick        case

     name        when  'normal'            return  normal_tick        when  'Aged  Brie'            return  brie_tick        when  'Sulfuras,  Hand  of  Ragnaros'            return  sulfuras_tick        end        #  ...    end    def  sulfuras_tick    end Friday, March 7, 14
  135. @sandimetz Mar 2014    def  tick        case

     name        when  'normal'            return  normal_tick        when  'Aged  Brie'            return  brie_tick        when  'Sulfuras,  Hand  of  Ragnaros'            return  sulfuras_tick        end        #  ...    end    def  sulfuras_tick    end nothing changes Friday, March 7, 14
  136. @sandimetz Mar 2014    def  tick        case

     name        when  'normal'            return  normal_tick        when  'Aged  Brie'            return  brie_tick        when  'Sulfuras,  Hand  of  Ragnaros'            return  sulfuras_tick        end        #  ...    end    def  sulfuras_tick    end sulfuras Friday, March 7, 14
  137. @sandimetz Mar 2014 class  GildedRoseTest  <  Minitest::Test #  def  test_normal

         ...  etc #  def  test_brie          ...  etc #  def  test_sulfuras  ...  etc    def  test_backstage_pass_long_before_sell_date    def  test_backstage_pass_medium_close_to_sell_date_upper_bound    def  test_backstage_pass_medium_close_to_sell_date_upper_bound_at_max_quality    def  test_backstage_pass_medium_close_to_sell_date_lower_bound    def  test_backstage_pass_medium_close_to_sell_date_lower_bound_at_max_quality    def  test_backstage_pass_very_close_to_sell_date_upper_bound    def  test_backstage_pass_very_close_to_sell_date_upper_bound_at_max_quality    def  test_backstage_pass_very_close_to_sell_date_lower_bound    def  test_backstage_pass_very_close_to_sell_date_lower_bound_at_max_quality    def  test_backstage_pass_on_sell_date    def  test_backstage_pass_after_sell_date end backstage Friday, March 7, 14
  138. @sandimetz Mar 2014    def  tick        case

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

     8928.5714  runs/s,  14400.9217  assertions/s. 31  runs,  50  assertions,  0  failures,  0  errors,  6  skips Friday, March 7, 14
  140. @sandimetz Mar 2014    def  tick        case

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

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

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

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

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

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

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

     8928.5714  runs/s,  14400.9217  assertions/s. 31  runs,  50  assertions,  0  failures,  0  errors,  6  skips Friday, March 7, 14
  148. @sandimetz Mar 2014 small methods are simple Friday, March 7,

    14
  149. @sandimetz Mar 2014 class  GildedRose    attr_reader  :name,  :quality,  :days_remaining

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

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

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

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

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

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

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

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

  158. @sandimetz Mar 2014    def  normal_tick        @days_remaining

     -­‐=  1        return  if  @quality  ==  0        @quality  -­‐=  1        @quality  -­‐=  1  if  @days_remaining  <=  0    end    def  brie_tick        @days_remaining  -­‐=  1        return  if  @quality  >=  50        @quality  +=  1        @quality  +=  1  if  @days_remaining  <=  0    end    def  sulfuras_tick    end    def  backstage_tick        @days_remaining  -­‐=  1        return                            if  @quality  >=  50        return  @quality  =  0  if  @days_remaining  <  0        @quality  +=  1        @quality  +=  1  if  @days_remaining  <  10        @quality  +=  1  if  @days_remaining  <  5    end Friday, March 7, 14
  159. @sandimetz Mar 2014    def  normal_tick        @days_remaining

     -­‐=  1        return  if  @quality  ==  0        @quality  -­‐=  1        @quality  -­‐=  1  if  @days_remaining  <=  0    end    def  brie_tick        @days_remaining  -­‐=  1        return  if  @quality  >=  50        @quality  +=  1        @quality  +=  1  if  @days_remaining  <=  0    end    def  sulfuras_tick    end    def  backstage_tick        @days_remaining  -­‐=  1        return                            if  @quality  >=  50        return  @quality  =  0  if  @days_remaining  <  0        @quality  +=  1        @quality  +=  1  if  @days_remaining  <  10        @quality  +=  1  if  @days_remaining  <  5    end def  normal_tick Friday, March 7, 14
  160. @sandimetz Mar 2014    def  normal_tick        @days_remaining

     -­‐=  1        return  if  @quality  ==  0        @quality  -­‐=  1        @quality  -­‐=  1  if  @days_remaining  <=  0    end    def  brie_tick        @days_remaining  -­‐=  1        return  if  @quality  >=  50        @quality  +=  1        @quality  +=  1  if  @days_remaining  <=  0    end    def  sulfuras_tick    end    def  backstage_tick        @days_remaining  -­‐=  1        return                            if  @quality  >=  50        return  @quality  =  0  if  @days_remaining  <  0        @quality  +=  1        @quality  +=  1  if  @days_remaining  <  10        @quality  +=  1  if  @days_remaining  <  5    end def  normal_tick def  brie_tick Friday, March 7, 14
  161. @sandimetz Mar 2014    def  normal_tick        @days_remaining

     -­‐=  1        return  if  @quality  ==  0        @quality  -­‐=  1        @quality  -­‐=  1  if  @days_remaining  <=  0    end    def  brie_tick        @days_remaining  -­‐=  1        return  if  @quality  >=  50        @quality  +=  1        @quality  +=  1  if  @days_remaining  <=  0    end    def  sulfuras_tick    end    def  backstage_tick        @days_remaining  -­‐=  1        return                            if  @quality  >=  50        return  @quality  =  0  if  @days_remaining  <  0        @quality  +=  1        @quality  +=  1  if  @days_remaining  <  10        @quality  +=  1  if  @days_remaining  <  5    end def  normal_tick def  brie_tick def  sulfuras_tick Friday, March 7, 14
  162. @sandimetz Mar 2014    def  normal_tick        @days_remaining

     -­‐=  1        return  if  @quality  ==  0        @quality  -­‐=  1        @quality  -­‐=  1  if  @days_remaining  <=  0    end    def  brie_tick        @days_remaining  -­‐=  1        return  if  @quality  >=  50        @quality  +=  1        @quality  +=  1  if  @days_remaining  <=  0    end    def  sulfuras_tick    end    def  backstage_tick        @days_remaining  -­‐=  1        return                            if  @quality  >=  50        return  @quality  =  0  if  @days_remaining  <  0        @quality  +=  1        @quality  +=  1  if  @days_remaining  <  10        @quality  +=  1  if  @days_remaining  <  5    end def  normal_tick def  brie_tick def  sulfuras_tick def  backstage_tick Friday, March 7, 14
  163. @sandimetz Mar 2014    def  normal_tick        @days_remaining

     -­‐=  1        return  if  @quality  ==  0        @quality  -­‐=  1        @quality  -­‐=  1  if  @days_remaining  <=  0    end    def  brie_tick        @days_remaining  -­‐=  1        return  if  @quality  >=  50        @quality  +=  1        @quality  +=  1  if  @days_remaining  <=  0    end    def  sulfuras_tick    end    def  backstage_tick        @days_remaining  -­‐=  1        return                            if  @quality  >=  50        return  @quality  =  0  if  @days_remaining  <  0        @quality  +=  1        @quality  +=  1  if  @days_remaining  <  10        @quality  +=  1  if  @days_remaining  <  5    end def  normal_tick def  brie_tick def  sulfuras_tick def  backstage_tick def  conjured_tick Friday, March 7, 14
  164. @sandimetz Mar 2014    def  normal_tick        @days_remaining

     -­‐=  1        return  if  @quality  ==  0        @quality  -­‐=  1        @quality  -­‐=  1  if  @days_remaining  <=  0    end    def  brie_tick        @days_remaining  -­‐=  1        return  if  @quality  >=  50        @quality  +=  1        @quality  +=  1  if  @days_remaining  <=  0    end    def  sulfuras_tick    end    def  backstage_tick        @days_remaining  -­‐=  1        return                            if  @quality  >=  50        return  @quality  =  0  if  @days_remaining  <  0        @quality  +=  1        @quality  +=  1  if  @days_remaining  <  10        @quality  +=  1  if  @days_remaining  <  5    end def  normal_tick def  brie_tick def  sulfuras_tick def  backstage_tick def  conjured_tick ??? Friday, March 7, 14
  165. @sandimetz Mar 2014 the pattern still fails me Friday, March

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

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

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

    March 7, 14
  169. @sandimetz Mar 2014    def  normal_tick        @days_remaining

     -­‐=  1        return  if  @quality  ==  0        @quality  -­‐=  1        @quality  -­‐=  1  if  @days_remaining  <=  0    end    def  brie_tick        @days_remaining  -­‐=  1        return  if  @quality  >=  50        @quality  +=  1        @quality  +=  1  if  @days_remaining  <=  0    end    def  sulfuras_tick    end    def  backstage_tick        @days_remaining  -­‐=  1        return                            if  @quality  >=  50        return  @quality  =  0  if  @days_remaining  <  0        @quality  +=  1        @quality  +=  1  if  @days_remaining  <  10        @quality  +=  1  if  @days_remaining  <  5    end def  normal_tick def  brie_tick def  sulfuras_tick def  backstage_tick Friday, March 7, 14
  170. @sandimetz Mar 2014 they’re screaming to get out Friday, March

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

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

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

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

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

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

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

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

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

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

    March 7, 14
  181. @sandimetz Mar 2014        def  normal_tick    

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

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

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

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

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

       attr_reader  :quality,  :days_remaining        def  initialize(quality,  days_remaining)            @quality,  @days_remaining  =  quality,  days_remaining        end        def  tick            @days_remaining  -­‐=  1            return  if  @quality  ==  0            @quality  -­‐=  1            @quality  -­‐=  1  if  @days_remaining  <=  0        end    end Friday, March 7, 14
  187. @sandimetz Mar 2014 class  GildedRose      def  normal_tick  

     end    class  Normal        attr_reader  :quality,  :days_remaining        def  initialize(quality,  days_remaining)            @quality,  @days_remaining  =  quality,  days_remaining        end        def  tick            @days_remaining  -­‐=  1            return  if  @quality  ==  0            @quality  -­‐=  1            @quality  -­‐=  1  if  @days_remaining  <=  0        end    end Friday, March 7, 14
  188. @sandimetz Mar 2014 class  GildedRose      def  normal_tick  

         @item  =  Normal.new(quality,  days_remaining)    end    class  Normal        attr_reader  :quality,  :days_remaining        def  initialize(quality,  days_remaining)            @quality,  @days_remaining  =  quality,  days_remaining        end        def  tick            @days_remaining  -­‐=  1            return  if  @quality  ==  0            @quality  -­‐=  1            @quality  -­‐=  1  if  @days_remaining  <=  0        end    end Friday, March 7, 14
  189. @sandimetz Mar 2014 class  GildedRose      def  normal_tick  

         @item  =  Normal.new(quality,  days_remaining)        item.tick    end    class  Normal        attr_reader  :quality,  :days_remaining        def  initialize(quality,  days_remaining)            @quality,  @days_remaining  =  quality,  days_remaining        end        def  tick            @days_remaining  -­‐=  1            return  if  @quality  ==  0            @quality  -­‐=  1            @quality  -­‐=  1  if  @days_remaining  <=  0        end    end Friday, March 7, 14
  190. @sandimetz Mar 2014 tick Normal GildedRose brie_tick backstage_tick sulfuras_tick Friday,

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

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

  193. @sandimetz Mar 2014 class  GildedRose      def  normal_tick  

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

         @item  =  Normal.new(quality,  days_remaining)        item.tick    end    def  brie_tick        @days_remaining  -­‐=  1        return  if  @quality  >=  50        @quality  +=  1        @quality  +=  1  if  @days_remaining  <=  0    end Friday, March 7, 14
  195. @sandimetz Mar 2014 class  GildedRose      def  normal_tick  

         @item  =  Normal.new(quality,  days_remaining)        item.tick    end    def  brie_tick        @days_remaining  -­‐=  1        return  if  @quality  >=  50        @quality  +=  1        @quality  +=  1  if  @days_remaining  <=  0    end    def  quality    end    def  days_remaining    end Friday, March 7, 14
  196. @sandimetz Mar 2014 class  GildedRose      def  normal_tick  

         @item  =  Normal.new(quality,  days_remaining)        item.tick    end    def  brie_tick        @days_remaining  -­‐=  1        return  if  @quality  >=  50        @quality  +=  1        @quality  +=  1  if  @days_remaining  <=  0    end    def  quality        return  item.quality  if  item    end    def  days_remaining    end Friday, March 7, 14
  197. @sandimetz Mar 2014 class  GildedRose      def  normal_tick  

         @item  =  Normal.new(quality,  days_remaining)        item.tick    end    def  brie_tick        @days_remaining  -­‐=  1        return  if  @quality  >=  50        @quality  +=  1        @quality  +=  1  if  @days_remaining  <=  0    end    def  quality        return  item.quality  if  item        @quality    end    def  days_remaining    end Friday, March 7, 14
  198. @sandimetz Mar 2014 class  GildedRose      def  normal_tick  

         @item  =  Normal.new(quality,  days_remaining)        item.tick    end    def  brie_tick        @days_remaining  -­‐=  1        return  if  @quality  >=  50        @quality  +=  1        @quality  +=  1  if  @days_remaining  <=  0    end    def  quality        return  item.quality  if  item        @quality    end    def  days_remaining        return  item.days_remaining  if  item        @days_remaining    end Friday, March 7, 14
  199. @sandimetz Mar 2014 brie Friday, March 7, 14

  200. @sandimetz Mar 2014 class  GildedRose    def  brie_tick    

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

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

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

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

       class  Brie        attr_reader  :quality,  :days_remaining        def  initialize(quality,  days_remaining)            @quality,  @days_remaining  =  quality,  days_remaining        end        def  tick            @days_remaining  -­‐=  1            return  if  @quality  >=  50            @quality  +=  1            @quality  +=  1  if  @days_remaining  <=  0        end    end Friday, March 7, 14
  205. @sandimetz Mar 2014 class  GildedRose    def  brie_tick    

       @item  =  Brie.new(quality,  days_remaining)        item.tick    end    class  Brie        attr_reader  :quality,  :days_remaining        def  initialize(quality,  days_remaining)            @quality,  @days_remaining  =  quality,  days_remaining        end        def  tick            @days_remaining  -­‐=  1            return  if  @quality  >=  50            @quality  +=  1            @quality  +=  1  if  @days_remaining  <=  0        end    end Friday, March 7, 14
  206. @sandimetz Mar 2014 sulfuras Friday, March 7, 14

  207. @sandimetz Mar 2014 class  GildedRose    def  sulfuras_tick    end

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

       class  Sulfuras        attr_reader  :quality,  :days_remaining        def  initialize(quality,  days_remaining)            @quality,  @days_remaining  =  quality,  days_remaining        end        def  tick        end    end Friday, March 7, 14
  209. @sandimetz Mar 2014 class  GildedRose    def  sulfuras_tick    end

       class  Sulfuras        attr_reader  :quality,  :days_remaining        def  initialize(quality,  days_remaining)            @quality,  @days_remaining  =  quality,  days_remaining        end        def  tick        end    end Friday, March 7, 14
  210. @sandimetz Mar 2014 class  GildedRose    def  sulfuras_tick    

       @item  =  Sulfuras.new(quality,  days_remaining)        item.tick    end    class  Sulfuras        attr_reader  :quality,  :days_remaining        def  initialize(quality,  days_remaining)            @quality,  @days_remaining  =  quality,  days_remaining        end        def  tick        end    end Friday, March 7, 14
  211. @sandimetz Mar 2014 backstage Friday, March 7, 14

  212. @sandimetz Mar 2014 class  GildedRose    def  backstage_tick    

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

       @days_remaining  -­‐=  1        return                            if  @quality  >=  50        return  @quality  =  0  if  @days_remaining  <  0        @quality  +=  1        @quality  +=  1  if  @days_remaining  <  10        @quality  +=  1  if  @days_remaining  <  5    end    class  Backstage        def  tick        end Friday, March 7, 14
  214. @sandimetz Mar 2014 class  GildedRose    def  backstage_tick    end

       class  Backstage        def  tick            @days_remaining  -­‐=  1            return                            if  @quality  >=  50            return  @quality  =  0  if  @days_remaining  <  0            @quality  +=  1            @quality  +=  1  if  @days_remaining  <  10            @quality  +=  1  if  @days_remaining  <  5        end Friday, March 7, 14
  215. @sandimetz Mar 2014 class  GildedRose    def  backstage_tick    end

       class  Backstage        attr_reader  :quality,  :days_remaining        def  initialize(quality,  days_remaining)            @quality,  @days_remaining  =  quality,  days_remaining        end        def  tick            @days_remaining  -­‐=  1            return                            if  @quality  >=  50            return  @quality  =  0  if  @days_remaining  <  0            @quality  +=  1            @quality  +=  1  if  @days_remaining  <  10            @quality  +=  1  if  @days_remaining  <  5        end Friday, March 7, 14
  216. @sandimetz Mar 2014 class  GildedRose    def  backstage_tick    end

       class  Backstage        attr_reader  :quality,  :days_remaining        def  initialize(quality,  days_remaining)            @quality,  @days_remaining  =  quality,  days_remaining        end        def  tick            @days_remaining  -­‐=  1            return                            if  @quality  >=  50            return  @quality  =  0  if  @days_remaining  <  0            @quality  +=  1            @quality  +=  1  if  @days_remaining  <  10            @quality  +=  1  if  @days_remaining  <  5        end Friday, March 7, 14
  217. @sandimetz Mar 2014 class  GildedRose    def  backstage_tick    end

       class  Backstage        attr_reader  :quality,  :days_remaining        def  initialize(quality,  days_remaining)            @quality,  @days_remaining  =  quality,  days_remaining        end        def  tick            @days_remaining  -­‐=  1            return                            if  @quality  >=  50            return  @quality  =  0  if  @days_remaining  <  0            @quality  +=  1            @quality  +=  1  if  @days_remaining  <  10            @quality  +=  1  if  @days_remaining  <  5        end Friday, March 7, 14
  218. @sandimetz Mar 2014 class  GildedRose    def  backstage_tick    

       @item  =  Backstage.new(quality,  days_remaining)        item.tick    end    class  Backstage        attr_reader  :quality,  :days_remaining        def  initialize(quality,  days_remaining)            @quality,  @days_remaining  =  quality,  days_remaining        end        def  tick            @days_remaining  -­‐=  1            return                            if  @quality  >=  50            return  @quality  =  0  if  @days_remaining  <  0            @quality  +=  1            @quality  +=  1  if  @days_remaining  <  10            @quality  +=  1  if  @days_remaining  <  5        end Friday, March 7, 14
  219. @sandimetz Mar 2014 normal/brie/sulfuras/backstage are now objects Friday, March 7,

    14
  220. @sandimetz Mar 2014 GildedRose tick Normal tick Brie tick Sulfuras

    attr_reader  :item tick Backstage attr_reader    :quality,    :days_remaining Friday, March 7, 14
  221. @sandimetz Mar 2014 class  GildedRose    def  tick    

       case  name        when  'normal'            normal_tick        when  'Aged  Brie'            brie_tick        when  'Sulfuras,  Hand  of  Ragnaros'            sulfuras_tick        when  'Backstage  passes  to  a  TAFKAL80ETC  concert'            backstage_tick        end    end    def  normal_tick        @item  =  Normal.new(quality,  days_remaining)        item.tick    end    def  brie_tick        @item  =  Brie.new(quality,  days_remaining)        item.tick    end    #  etc Friday, March 7, 14
  222. @sandimetz Mar 2014 rewind Friday, March 7, 14

  223. @sandimetz Mar 2014 class  GildedRose    def  tick    

       case  name        when  'normal'            normal_tick        when  'Aged  Brie'            brie_tick        when  'Sulfuras,  Hand  of  Ragnaros'            sulfuras_tick        when  'Backstage  passes  to  a  TAFKAL80ETC  concert'            backstage_tick        end    end    def  normal_tick        @item  =  Normal.new(quality,  days_remaining)        item.tick    end    def  brie_tick        @item  =  Brie.new(quality,  days_remaining)        item.tick    end    #  etc Friday, March 7, 14
  224. @sandimetz Mar 2014 class  GildedRose    def  tick    

       case  name        when  'normal'            normal_tick        when  'Aged  Brie'            brie_tick        when  'Sulfuras,  Hand  of  Ragnaros'            sulfuras_tick        when  'Backstage  passes  to  a  TAFKAL80ETC  concert'            backstage_tick        end    end    def  normal_tick        @item  =  Normal.new(quality,  days_remaining)        item.tick    end    def  brie_tick        @item  =  Brie.new(quality,  days_remaining)        item.tick    end    #  etc Friday, March 7, 14
  225. @sandimetz Mar 2014 class  GildedRose    def  tick    

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

       case  name        when  'normal'            @item  =  Normal.new(quality,  days_remaining)            item.tick        when  'Aged  Brie'            brie_tick        when  'Sulfuras,  Hand  of  Ragnaros'            sulfuras_tick        when  'Backstage  passes  to  a  TAFKAL80ETC  concert'            backstage_tick        end    end    def  normal_tick    end    def  brie_tick        @item  =  Brie.new(quality,  days_remaining)        item.tick    end    #  etc Friday, March 7, 14
  227. @sandimetz Mar 2014 class  GildedRose    def  tick    

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

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

       case  name        when  'normal'            @item  =  Normal.new(quality,  days_remaining)            item.tick        when  'Aged  Brie'        when  'Sulfuras,  Hand  of  Ragnaros'        when  'Backstage  passes  to  a  TAFKAL80ETC  concert'        end    end    def  brie_tick        @item  =  Brie.new(quality,  days_remaining)        item.tick    end    #  etc Friday, March 7, 14
  230. @sandimetz Mar 2014 class  GildedRose    def  tick    

       case  name        when  'normal'            @item  =  Normal.new(quality,  days_remaining)            item.tick        when  'Aged  Brie'            @item  =  Brie.new(quality,  days_remaining)            item.tick        when  'Sulfuras,  Hand  of  Ragnaros'            @item  =  Sulfuras.new(quality,  days_remaining)            item.tick        when  'Backstage  passes  to  a  TAFKAL80ETC  concert'            @item  =  Backstage.new(quality,  days_remaining)            item.tick        end    end Friday, March 7, 14
  231. @sandimetz Mar 2014 abstract away the duplication Friday, March 7,

    14
  232. @sandimetz Mar 2014 class  GildedRose    def  tick    

       case  name        when  'normal'            @item  =  Normal.new(quality,  days_remaining)            item.tick        when  'Aged  Brie'            @item  =  Brie.new(quality,  days_remaining)            item.tick        when  'Sulfuras,  Hand  of  Ragnaros'            @item  =  Sulfuras.new(quality,  days_remaining)            item.tick        when  'Backstage  passes  to  a  TAFKAL80ETC  concert'            @item  =  Backstage.new(quality,  days_remaining)            item.tick        end    end Friday, March 7, 14
  233. @sandimetz Mar 2014 class  GildedRose    def  tick    

       case  name        when  'normal'            @item  =  Normal.new(quality,  days_remaining)            item.tick        when  'Aged  Brie'            @item  =  Brie.new(quality,  days_remaining)            item.tick        when  'Sulfuras,  Hand  of  Ragnaros'            @item  =  Sulfuras.new(quality,  days_remaining)            item.tick        when  'Backstage  passes  to  a  TAFKAL80ETC  concert'            @item  =  Backstage.new(quality,  days_remaining)            item.tick        end    end Friday, March 7, 14
  234. @sandimetz Mar 2014 class  GildedRose    attr_reader  :name,  :item  

     def  initialize(name,  quality,  days_remaining)        @name,  @quality,  @days_remaining  =  name,  quality,  days_remaining    end    def  tick        case  name        when  'normal'            @item  =  Normal.new(quality,  days_remaining)            item.tick        when  'Aged  Brie'            @item  =  Brie.new(quality,  days_remaining)            item.tick        when  'Sulfuras,  Hand  of  Ragnaros'            @item  =  Sulfuras.new(quality,  days_remaining)            item.tick        when  'Backstage  passes  to  a  TAFKAL80ETC  concert'            @item  =  Backstage.new(quality,  days_remaining)            item.tick        end    end Friday, March 7, 14
  235. @sandimetz Mar 2014 class  GildedRose    attr_reader  :name,  :item  

     def  initialize(name,  quality,  days_remaining)        @name,  @quality,  @days_remaining  =  name,  quality,  days_remaining    end    def  tick        case  name        when  'normal'            @item  =  Normal.new(quality,  days_remaining)            item.tick        when  'Aged  Brie'            @item  =  Brie.new(quality,  days_remaining)            item.tick        when  'Sulfuras,  Hand  of  Ragnaros'            @item  =  Sulfuras.new(quality,  days_remaining)            item.tick        when  'Backstage  passes  to  a  TAFKAL80ETC  concert'            @item  =  Backstage.new(quality,  days_remaining)            item.tick        end    end Friday, March 7, 14
  236. @sandimetz Mar 2014 class  GildedRose    attr_reader  :name,  :item  

     def  initialize(name,  quality,  days_remaining)        @item  =  ???    end    def  tick        case  name        when  'normal'            @item  =  Normal.new(quality,  days_remaining)            item.tick        when  'Aged  Brie'            @item  =  Brie.new(quality,  days_remaining)            item.tick        when  'Sulfuras,  Hand  of  Ragnaros'            @item  =  Sulfuras.new(quality,  days_remaining)            item.tick        when  'Backstage  passes  to  a  TAFKAL80ETC  concert'            @item  =  Backstage.new(quality,  days_remaining)            item.tick        end    end Friday, March 7, 14
  237. @sandimetz Mar 2014 class  GildedRose    attr_reader  :name,  :item  

     def  initialize(name,  quality,  days_remaining)        @item  =  ???    end    def  tick        case  name        when  'normal'            @item  =  Normal.new(quality,  days_remaining)            item.tick        when  'Aged  Brie'            @item  =  Brie.new(quality,  days_remaining)            item.tick        when  'Sulfuras,  Hand  of  Ragnaros'            @item  =  Sulfuras.new(quality,  days_remaining)            item.tick        when  'Backstage  passes  to  a  TAFKAL80ETC  concert'            @item  =  Backstage.new(quality,  days_remaining)            item.tick        end    end Friday, March 7, 14
  238. @sandimetz Mar 2014 class  GildedRose    attr_reader  :name,  :item  

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

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

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

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

     def  initialize(name,  quality,  days_remaining)        @item  =  ???.new(quality,  days_remaining)    end    def  klass_for(name)        case  name        when  'normal'            Normal        when  'Aged  Brie'            Brie        when  'Sulfuras,  Hand  of  Ragnaros'            Sulfuras        when  'Backstage  passes  to  a  TAFKAL80ETC  concert'            Backstage        end    end Friday, March 7, 14
  243. @sandimetz Mar 2014 class  GildedRose    attr_reader  :name,  :item  

     def  initialize(name,  quality,  days_remaining)        @item  =  klass_for(name).new(quality,  days_remaining)    end    def  klass_for(name)        case  name        when  'normal'            Normal        when  'Aged  Brie'            Brie        when  'Sulfuras,  Hand  of  Ragnaros'            Sulfuras        when  'Backstage  passes  to  a  TAFKAL80ETC  concert'            Backstage        end    end Friday, March 7, 14
  244. @sandimetz Mar 2014 class  GildedRose    attr_reader  :name,  :item  

     def  initialize(name,  quality,  days_remaining)        @item  =  klass_for(name).new(quality,  days_remaining)    end    def  klass_for(name)        case  name        when  'normal'            Normal        when  'Aged  Brie'            Brie        when  'Sulfuras,  Hand  of  Ragnaros'            Sulfuras        when  'Backstage  passes  to  a  TAFKAL80ETC  concert'            Backstage        end    end Friday, March 7, 14
  245. @sandimetz Mar 2014 class  GildedRose    attr_reader  :item    def

     initialize(name,  quality,  days_remaining)        @item  =  klass_for(name).new(quality,  days_remaining)    end    def  klass_for(name)        case  name        when  'normal'            Normal        when  'Aged  Brie'            Brie        when  'Sulfuras,  Hand  of  Ragnaros'            Sulfuras        when  'Backstage  passes  to  a  TAFKAL80ETC  concert'            Backstage        end    end Friday, March 7, 14
  246. @sandimetz Mar 2014 class  GildedRose    attr_reader  :item    def

     initialize(name,  quality,  days_remaining)        @item  =  klass_for(name).new(quality,  days_remaining)    end    def  klass_for(name)        #  ...    end Friday, March 7, 14
  247. @sandimetz Mar 2014 class  GildedRose    attr_reader  :item    def

     initialize(name,  quality,  days_remaining)        @item  =  klass_for(name).new(quality,  days_remaining)    end    def  klass_for(name)        #  ...    end    def  tick        item.tick    end Friday, March 7, 14
  248. @sandimetz Mar 2014 class  GildedRose    attr_reader  :item    def

     initialize(name,  quality,  days_remaining)        @item  =  klass_for(name).new(quality,  days_remaining)    end    def  klass_for(name)        #  ...    end    def  tick        item.tick    end    def  quality        return  item.quality  if  item        @quality    end    def  days_remaining        return  item.days_remaining  if  item        @days_remaining    end Friday, March 7, 14
  249. @sandimetz Mar 2014 class  GildedRose    attr_reader  :item    def

     initialize(name,  quality,  days_remaining)        @item  =  klass_for(name).new(quality,  days_remaining)    end    def  klass_for(name)        #  ...    end    def  tick        item.tick    end    def  quality        return  item.quality  if  item        @quality    end    def  days_remaining        return  item.days_remaining  if  item        @days_remaining    end Friday, March 7, 14
  250. @sandimetz Mar 2014 class  GildedRose    attr_reader  :item    def

     initialize(name,  quality,  days_remaining)        @item  =  klass_for(name).new(quality,  days_remaining)    end    def  klass_for(name)        #  ...    end    def  tick        item.tick    end    def  quality        return  item.quality  if  item    end    def  days_remaining        return  item.days_remaining  if  item    end Friday, March 7, 14
  251. @sandimetz Mar 2014 class  GildedRose    attr_reader  :item    def

     initialize(name,  quality,  days_remaining)        @item  =  klass_for(name).new(quality,  days_remaining)    end    def  klass_for(name)        #  ...    end    def  tick        item.tick    end    def  quality        return  item.quality  if  item    end    def  days_remaining        return  item.days_remaining  if  item    end Friday, March 7, 14
  252. @sandimetz Mar 2014 class  GildedRose    attr_reader  :item    def

     initialize(name,  quality,  days_remaining)        @item  =  klass_for(name).new(quality,  days_remaining)    end    def  klass_for(name)        #  ...    end    def  tick        item.tick    end    def  quality        return  item.quality  if  item    end    def  days_remaining        return  item.days_remaining  if  item    end Friday, March 7, 14
  253. @sandimetz Mar 2014 class  GildedRose    attr_reader  :item    def

     initialize(name,  quality,  days_remaining)        @item  =  klass_for(name).new(quality,  days_remaining)    end    def  klass_for(name)        #  ...    end    def  tick        item.tick    end    def  quality        item.quality    end    def  days_remaining        item.days_remaining    end Friday, March 7, 14
  254. @sandimetz Mar 2014 class  GildedRose    attr_reader  :item    def

     initialize(name,  quality,  days_remaining)        @item  =  klass_for(name).new(quality,  days_remaining)    end    def  klass_for(name)        #  ...    end    def  tick        item.tick    end    def  quality        item.quality    end    def  days_remaining        item.days_remaining    end    class  Normal    class  Brie    class  Sulfuras    class  Backstage end Friday, March 7, 14
  255. @sandimetz Mar 2014 item is a role Friday, March 7,

    14
  256. @sandimetz Mar 2014 GildedRose tick Normal tick Brie tick Sulfuras

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

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

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

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

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

    def  quality    item.quality end def  days_remaining    item.days_remaining end GildedRose ItemRole def  tick   def  quality def  days_remaining Friday, March 7, 14
  262. @sandimetz Mar 2014 Foo def  tick    item.tick end def

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

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

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

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

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

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

    def  tick   def  quality def  days_remaining Friday, March 7, 14
  269. @sandimetz Mar 2014 Foo attr_reader  :item attr_reader  :rose def  getit

       @rose  =          GildedRose.new(            ‘normal’,  ...)     end GildedRose ItemRole def  tick   def  quality def  days_remaining Friday, March 7, 14
  270. @sandimetz Mar 2014 Foo def  initialize(name,...)    @item  =  

         klass_for(name).          new(              quality,              days_remaining) end def  klass_for(name)    case  name    when  'normal'        Normal attr_reader  :item attr_reader  :rose def  getit    @rose  =          GildedRose.new(            ‘normal’,  ...)     end GildedRose ItemRole def  tick   def  quality def  days_remaining Friday, March 7, 14
  271. @sandimetz Mar 2014 Foo def  initialize(name,...)    @item  =  

         klass_for(name).          new(              quality,              days_remaining) end def  klass_for(name)    case  name    when  'normal'        Normal attr_reader  :item attr_reader  :rose def  getit    @rose  =          GildedRose.new(            ‘normal’,  ...)     end GildedRose ItemRole def  tick   def  quality def  days_remaining Item Factory Friday, March 7, 14
  272. @sandimetz Mar 2014 class  GildedRose    attr_reader  :item    def

     initialize(name,  quality,  days_remaining)        @item  =  klass_for(name).new(quality,  days_remaining)    end    def  klass_for(name)        #  ...    end    def  tick        item.tick    end    def  quality        item.quality    end    def  days_remaining        item.days_remaining    end    class  Normal    class  Brie    class  Sulfuras    class  Backstage end Friday, March 7, 14
  273. @sandimetz Mar 2014 class  GildedRose    attr_reader  :item    def

     initialize(name,  quality,  days_remaining)        @item  =  klass_for(name).new(quality,  days_remaining)    end    def  klass_for(name)        #  ...    end    def  tick        item.tick    end    def  quality        item.quality    end    def  days_remaining        item.days_remaining    end    class  Normal    class  Brie    class  Sulfuras    class  Backstage end Friday, March 7, 14
  274. @sandimetz Mar 2014 module  GildedRose    attr_reader  :item    def

     initialize(name,  quality,  days_remaining)        @item  =  klass_for(name).new(quality,  days_remaining)    end    def  klass_for(name)        #  ...    end    def  tick        item.tick    end    def  quality        item.quality    end    def  days_remaining        item.days_remaining    end    class  Normal    class  Brie    class  Sulfuras    class  Backstage end Friday, March 7, 14
  275. @sandimetz Mar 2014 module  GildedRose    attr_reader  :item    def

     initialize(name,  quality,  days_remaining)        @item  =  klass_for(name).new(quality,  days_remaining)    end    def  klass_for(name)        #  ...    end    def  tick        item.tick    end    def  quality        item.quality    end    def  days_remaining        item.days_remaining    end    class  Normal    class  Brie    class  Sulfuras    class  Backstage end Friday, March 7, 14
  276. @sandimetz Mar 2014 module  GildedRose    attr_reader  :item    def

     self.for(name,  quality,  days_remaining)        @item  =  klass_for(name).new(quality,  days_remaining)    end    def  klass_for(name)        #  ...    end    def  tick        item.tick    end    def  quality        item.quality    end    def  days_remaining        item.days_remaining    end    class  Normal    class  Brie    class  Sulfuras    class  Backstage end Friday, March 7, 14
  277. @sandimetz Mar 2014 module  GildedRose    attr_reader  :item    def

     self.for(name,  quality,  days_remaining)        @item  =  klass_for(name).new(quality,  days_remaining)    end    def  klass_for(name)        #  ...    end    def  tick        item.tick    end    def  quality        item.quality    end    def  days_remaining        item.days_remaining    end    class  Normal    class  Brie    class  Sulfuras    class  Backstage end Friday, March 7, 14
  278. @sandimetz Mar 2014 module  GildedRose    attr_reader  :item    def

     self.for(name,  quality,  days_remaining)        @item  =  klass_for(name).new(quality,  days_remaining)    end    def  self.klass_for(name)        #  ...    end    def  tick        item.tick    end    def  quality        item.quality    end    def  days_remaining        item.days_remaining    end    class  Normal    class  Brie    class  Sulfuras    class  Backstage end Friday, March 7, 14
  279. @sandimetz Mar 2014 module  GildedRose    attr_reader  :item    def

     self.for(name,  quality,  days_remaining)        @item  =  klass_for(name).new(quality,  days_remaining)    end    def  self.klass_for(name)        #  ...    end    def  tick        item.tick    end    def  quality        item.quality    end    def  days_remaining        item.days_remaining    end    class  Normal    class  Brie    class  Sulfuras    class  Backstage end Friday, March 7, 14
  280. @sandimetz Mar 2014 module  GildedRose    attr_reader  :item    def

     self.for(name,  quality,  days_remaining)        klass_for(name).new(quality,  days_remaining)    end    def  self.klass_for(name)        #  ...    end    def  tick        item.tick    end    def  quality        item.quality    end    def  days_remaining        item.days_remaining    end    class  Normal    class  Brie    class  Sulfuras    class  Backstage end Friday, March 7, 14
  281. @sandimetz Mar 2014 module  GildedRose    attr_reader  :item    def

     self.for(name,  quality,  days_remaining)        klass_for(name).new(quality,  days_remaining)    end    def  self.klass_for(name)        #  ...    end    def  tick        item.tick    end    def  quality        item.quality    end    def  days_remaining        item.days_remaining    end    class  Normal    class  Brie    class  Sulfuras    class  Backstage end Friday, March 7, 14
  282. @sandimetz Mar 2014 module  GildedRose    def  self.for(name,  quality,  days_remaining)

           klass_for(name).new(quality,  days_remaining)    end    def  self.klass_for(name)        #  ...    end    def  tick        item.tick    end    def  quality        item.quality    end    def  days_remaining        item.days_remaining    end    class  Normal    class  Brie    class  Sulfuras    class  Backstage end Friday, March 7, 14
  283. @sandimetz Mar 2014 module  GildedRose    def  self.for(name,  quality,  days_remaining)

           klass_for(name).new(quality,  days_remaining)    end    def  self.klass_for(name)        #  ...    end    def  tick        item.tick    end    def  quality        item.quality    end    def  days_remaining        item.days_remaining    end    class  Normal    class  Brie    class  Sulfuras    class  Backstage end Friday, March 7, 14
  284. @sandimetz Mar 2014 module  GildedRose    def  self.for(name,  quality,  days_remaining)

           klass_for(name).new(quality,  days_remaining)    end    def  self.klass_for(name)        #  ...    end    def  tick        item.tick    end    def  quality        item.quality    end    def  days_remaining        item.days_remaining    end    class  Normal    class  Brie    class  Sulfuras    class  Backstage end Friday, March 7, 14
  285. @sandimetz Mar 2014 module  GildedRose    def  self.for(name,  quality,  days_remaining)

           klass_for(name).new(quality,  days_remaining)    end    def  self.klass_for(name)        #  ...    end    def  tick        item.tick    end    def  quality        item.quality    end    def  days_remaining        item.days_remaining    end    class  Normal    class  Brie    class  Sulfuras    class  Backstage end Middleman Friday, March 7, 14
  286. @sandimetz Mar 2014 module  GildedRose    def  self.for(name,  quality,  days_remaining)

           klass_for(name).new(quality,  days_remaining)    end    def  self.klass_for(name)        #  ...    end    def  tick        item.tick    end    def  quality        item.quality    end    def  days_remaining        item.days_remaining    end    class  Normal    class  Brie    class  Sulfuras    class  Backstage end Middleman Friday, March 7, 14
  287. @sandimetz Mar 2014 module  GildedRose    def  self.for(name,  quality,  days_remaining)

           klass_for(name).new(quality,  days_remaining)    end    def  self.klass_for(name)        #  ...    end    class  Normal    class  Brie    class  Sulfuras    class  Backstage end Friday, March 7, 14
  288. @sandimetz Mar 2014 Foo def  self.for(name,...) end attr_reader  :rose def

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

     =          GildedRose.for(            ‘normal’,  ...)     end ItemRole def  tick   def  quality def  days_remaining def  self.for(name,...) end GildedRose Friday, March 7, 14
  290. @sandimetz Mar 2014 extract common code Friday, March 7, 14

  291. @sandimetz Mar 2014 module  GildedRose    def  self.for(name,  quality,  days_remaining)

           klass_for(name).new(quality,  days_remaining)    end    def  self.klass_for(name)        #  ...    end    class  Normal    class  Brie    class  Sulfuras    class  Backstage end Friday, March 7, 14
  292. @sandimetz Mar 2014 module  GildedRose    def  self.for(name,  quality,  days_remaining)

           klass_for(name).new(quality,  days_remaining)    end    def  self.klass_for(name)        #  ...    end    class  Normal    class  Brie    class  Sulfuras    class  Backstage end Friday, March 7, 14
  293. @sandimetz Mar 2014 module  GildedRose    class  Normal    

       attr_reader  :quality,  :days_remaining        def  initialize(quality,  days_remaining)            @quality,  @days_remaining  =  quality,  days_remaining        end        def  tick            #  ...        end    end Friday, March 7, 14
  294. @sandimetz Mar 2014 module  GildedRose    class  Normal    

       attr_reader  :quality,  :days_remaining        def  initialize(quality,  days_remaining)            @quality,  @days_remaining  =  quality,  days_remaining        end        def  tick            #  ...        end    end    class  Brie        attr_reader  :quality,  :days_remaining        def  initialize(quality,  days_remaining)            @quality,  @days_remaining  =  quality,  days_remaining        end        def  tick          #  ...        end    end Friday, March 7, 14
  295. @sandimetz Mar 2014 module  GildedRose    class  Normal    

       attr_reader  :quality,  :days_remaining        def  initialize(quality,  days_remaining)            @quality,  @days_remaining  =  quality,  days_remaining        end        def  tick            #  ...        end    end    class  Brie        attr_reader  :quality,  :days_remaining        def  initialize(quality,  days_remaining)            @quality,  @days_remaining  =  quality,  days_remaining        end        def  tick          #  ...        end    end Friday, March 7, 14
  296. @sandimetz Mar 2014 module  GildedRose    class  Normal    

       attr_reader  :quality,  :days_remaining        def  initialize(quality,  days_remaining)            @quality,  @days_remaining  =  quality,  days_remaining        end        def  tick            #  ...        end    end    class  Brie        attr_reader  :quality,  :days_remaining        def  initialize(quality,  days_remaining)            @quality,  @days_remaining  =  quality,  days_remaining        end        def  tick          #  ...        end    end Friday, March 7, 14
  297. @sandimetz Mar 2014 module  GildedRose    class  Normal    

       attr_reader  :quality,  :days_remaining        def  initialize(quality,  days_remaining)            @quality,  @days_remaining  =  quality,  days_remaining        end        def  tick            #  ...        end    end    class  Brie        attr_reader  :quality,  :days_remaining        def  initialize(quality,  days_remaining)            @quality,  @days_remaining  =  quality,  days_remaining        end        def  tick Friday, March 7, 14
  298. @sandimetz Mar 2014 module  GildedRose    class  Item    end

       class  Normal        attr_reader  :quality,  :days_remaining        def  initialize(quality,  days_remaining)            @quality,  @days_remaining  =  quality,  days_remaining        end        def  tick            #  ...        end    end    class  Brie        attr_reader  :quality,  :days_remaining        def  initialize(quality,  days_remaining)            @quality,  @days_remaining  =  quality,  days_remaining        end        def  tick Friday, March 7, 14
  299. @sandimetz Mar 2014 module  GildedRose    class  Item    

       attr_reader  :quality,  :days_remaining        def  initialize(quality,  days_remaining)            @quality,  @days_remaining  =  quality,  days_remaining        end    end    class  Normal        def  tick            #  ...        end    end    class  Brie        attr_reader  :quality,  :days_remaining        def  initialize(quality,  days_remaining)            @quality,  @days_remaining  =  quality,  days_remaining        end        def  tick Friday, March 7, 14
  300. @sandimetz Mar 2014 module  GildedRose    class  Item    

       attr_reader  :quality,  :days_remaining        def  initialize(quality,  days_remaining)            @quality,  @days_remaining  =  quality,  days_remaining        end    end    class  Normal  <  Item        def  tick            #  ...        end    end    class  Brie        attr_reader  :quality,  :days_remaining        def  initialize(quality,  days_remaining)            @quality,  @days_remaining  =  quality,  days_remaining        end        def  tick Friday, March 7, 14
  301. @sandimetz Mar 2014 module  GildedRose    class  Item    

       attr_reader  :quality,  :days_remaining        def  initialize(quality,  days_remaining)            @quality,  @days_remaining  =  quality,  days_remaining        end    end    class  Normal  <  Item        def  tick            #  ...        end    end    class  Brie        attr_reader  :quality,  :days_remaining        def  initialize(quality,  days_remaining)            @quality,  @days_remaining  =  quality,  days_remaining        end        def  tick          #  ...        end    end Friday, March 7, 14
  302. @sandimetz Mar 2014 module  GildedRose    class  Item    

       attr_reader  :quality,  :days_remaining        def  initialize(quality,  days_remaining)            @quality,  @days_remaining  =  quality,  days_remaining        end    end    class  Normal  <  Item        def  tick            #  ...        end    end    class  Brie  <  Item        attr_reader  :quality,  :days_remaining        def  initialize(quality,  days_remaining)            @quality,  @days_remaining  =  quality,  days_remaining        end        def  tick          #  ...        end    end Friday, March 7, 14
  303. @sandimetz Mar 2014 module  GildedRose    class  Item    

       attr_reader  :quality,  :days_remaining        def  initialize(quality,  days_remaining)            @quality,  @days_remaining  =  quality,  days_remaining        end    end    class  Normal  <  Item        def  tick            #  ...        end    end    class  Brie  <  Item        def  tick          #  ...        end    end Friday, March 7, 14
  304. @sandimetz Mar 2014 module  GildedRose    class  Item    

       attr_reader  :quality,  :days_remaining        def  initialize(quality,  days_remaining)            @quality,  @days_remaining  =  quality,  days_remaining        end    end    class  Normal  <  Item        def  tick            #  ...        end    end    class  Brie  <  Item        def  tick          #  ...        end    end    class  Sulfuras  <  Item        def  tick        end    end    class  Backstage  <  Item        def  tick Friday, March 7, 14
  305. @sandimetz Mar 2014 inheritance is not evil Friday, March 7,

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

    14
  307. @sandimetz Mar 2014 module  GildedRose    class  Item    

       attr_reader  :quality,  :days_remaining        def  initialize(quality,  days_remaining)            @quality,  @days_remaining  =  quality,  days_remaining        end    end    class  Normal  <  Item        def  tick            #  ...        end    end    class  Brie  <  Item        def  tick          #  ...        end    end    class  Sulfuras  <  Item        def  tick        end    end    class  Backstage  <  Item        def  tick Friday, March 7, 14
  308. @sandimetz Mar 2014 module  GildedRose    class  Item    

       attr_reader  :quality,  :days_remaining        def  initialize(quality,  days_remaining)            @quality,  @days_remaining  =  quality,  days_remaining        end    end    class  Normal  <  Item        def  tick            #  ...        end    end    class  Brie  <  Item        def  tick          #  ...        end    end    class  Sulfuras  <  Item        def  tick        end    end    class  Backstage  <  Item        def  tick Item    quality    days_remaining Friday, March 7, 14
  309. @sandimetz Mar 2014 module  GildedRose    class  Item    

       attr_reader  :quality,  :days_remaining        def  initialize(quality,  days_remaining)            @quality,  @days_remaining  =  quality,  days_remaining        end    end    class  Normal  <  Item        def  tick            #  ...        end    end    class  Brie  <  Item        def  tick          #  ...        end    end    class  Sulfuras  <  Item        def  tick        end    end    class  Backstage  <  Item        def  tick Item    quality    days_remaining Normal Brie Sulfuras Backstage    quality    days_remaining    tick Friday, March 7, 14
  310. @sandimetz Mar 2014 module  GildedRose    class  Item    

       attr_reader  :quality,  :days_remaining        def  initialize(quality,  days_remaining)            @quality,  @days_remaining  =  quality,  days_remaining        end    end    class  Normal  <  Item        def  tick            #  ...        end    end    class  Brie  <  Item        def  tick          #  ...        end    end    class  Sulfuras  <  Item        def  tick        end    end    class  Backstage  <  Item        def  tick Item    quality    days_remaining Normal Brie Sulfuras Backstage    quality    days_remaining    tick Friday, March 7, 14
  311. @sandimetz Mar 2014 module  GildedRose    class  Item    

       attr_reader  :quality,  :days_remaining        def  initialize(quality,  days_remaining)            @quality,  @days_remaining  =  quality,  days_remaining        end    end    class  Normal  <  Item        def  tick            #  ...        end    end    class  Brie  <  Item        def  tick          #  ...        end    end    class  Sulfuras  <  Item        def  tick        end    end Friday, March 7, 14
  312. @sandimetz Mar 2014 module  GildedRose    class  Item    

       attr_reader  :quality,  :days_remaining        def  initialize(quality,  days_remaining)            @quality,  @days_remaining  =  quality,  days_remaining        end        def  tick        end    end    class  Normal  <  Item        def  tick            #  ...        end    end    class  Brie  <  Item        def  tick          #  ...        end    end    class  Sulfuras  <  Item        def  tick        end    end Friday, March 7, 14
  313. @sandimetz Mar 2014 module  GildedRose    class  Item    

       attr_reader  :quality,  :days_remaining        def  initialize(quality,  days_remaining)            @quality,  @days_remaining  =  quality,  days_remaining        end        def  tick        end    end    class  Normal  <  Item        def  tick            #  ...        end    end    class  Brie  <  Item        def  tick          #  ...        end    end    class  Sulfuras  <  Item        def  tick        end    end Friday, March 7, 14
  314. @sandimetz Mar 2014 module  GildedRose    class  Item    

       attr_reader  :quality,  :days_remaining        def  initialize(quality,  days_remaining)            @quality,  @days_remaining  =  quality,  days_remaining        end        def  tick        end    end    class  Sulfuras  <  Item        def  tick        end    end Friday, March 7, 14
  315. @sandimetz Mar 2014 module  GildedRose    class  Item    

       attr_reader  :quality,  :days_remaining        def  initialize(quality,  days_remaining)            @quality,  @days_remaining  =  quality,  days_remaining        end        def  tick        end    end    class  Sulfuras  <  Item        def  tick        end    end Friday, March 7, 14
  316. @sandimetz Mar 2014 module  GildedRose    class  Item    

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

       def  tick        end    end    class  Sulfuras  <  Item        def  tick        end    end    def  self.klass_for(name)        case  name        when  'normal'            Normal        when  'Aged  Brie'            Brie        when  'Sulfuras,  Hand  of  Ragnaros'            Sulfuras        when  'Backstage  passes  to  a  TAFKAL80ETC  concert'            Backstage        end    end Friday, March 7, 14
  318. @sandimetz Mar 2014 module  GildedRose    class  Item    

       def  tick        end    end    class  Sulfuras  <  Item        def  tick        end    end    def  self.klass_for(name)        case  name        when  'normal'            Normal        when  'Aged  Brie'            Brie        when  'Sulfuras,  Hand  of  Ragnaros'            Sulfuras        when  'Backstage  passes  to  a  TAFKAL80ETC  concert'            Backstage        end    end Friday, March 7, 14
  319. @sandimetz Mar 2014 module  GildedRose    class  Item    

       def  tick        end    end    class  Sulfuras  <  Item        def  tick        end    end    def  self.klass_for(name)        case  name        when  'normal'            Normal        when  'Aged  Brie'            Brie        when  'Sulfuras,  Hand  of  Ragnaros'            Item        when  'Backstage  passes  to  a  TAFKAL80ETC  concert'            Backstage        end    end Friday, March 7, 14
  320. @sandimetz Mar 2014 module  GildedRose    class  Item    

       def  tick        end    end    class  Sulfuras  <  Item        def  tick        end    end    def  self.klass_for(name)        case  name        when  'normal'            Normal        when  'Aged  Brie'            Brie        when  'Sulfuras,  Hand  of  Ragnaros'            Item        when  'Backstage  passes  to  a  TAFKAL80ETC  concert'            Backstage        end    end Friday, March 7, 14
  321. @sandimetz Mar 2014 module  GildedRose    class  Item    

       def  tick        end    end    def  self.klass_for(name)        case  name        when  'normal'            Normal        when  'Aged  Brie'            Brie        when  'Sulfuras,  Hand  of  Ragnaros'            Item        when  'Backstage  passes  to  a  TAFKAL80ETC  concert'            Backstage        end    end Friday, March 7, 14
  322. @sandimetz Mar 2014 module  GildedRose    class  Item    

       def  tick        end    end    def  self.klass_for(name)        case  name        when  'normal'            Normal        when  'Aged  Brie'            Brie        when  'Sulfuras,  Hand  of  Ragnaros'            Item        when  'Backstage  passes  to  a  TAFKAL80ETC  concert'            Backstage        end    end Friday, March 7, 14
  323. @sandimetz Mar 2014 module  GildedRose    class  Item    

       def  tick        end    end    def  self.klass_for(name)        case  name        when  'normal'            Normal        when  'Aged  Brie'            Brie        when  'Sulfuras,  Hand  of  Ragnaros'            Item        when  'Backstage  passes  to  a  TAFKAL80ETC  concert'            Backstage        end    end Friday, March 7, 14
  324. @sandimetz Mar 2014 extract configuration Friday, March 7, 14

  325. @sandimetz Mar 2014 module  GildedRose    def  self.for(name,  quality,  days_remaining)

           klass_for(name).new(quality,  days_remaining)    end    def  self.klass_for(name)        case  name        when  'normal'            Normal        when  'Aged  Brie'            Brie        when  'Sulfuras,  Hand  of  Ragnaros'            Item        when  'Backstage  passes  to  a  TAFKAL80ETC  concert'            Backstage        end    end end Friday, March 7, 14
  326. @sandimetz Mar 2014 module  GildedRose    DEFAULT_CLASS  =  Item  

     SPECIALIZED_CLASSES  =  {        'normal'                                                                        =>  Normal,        'Aged  Brie'                                                                  =>  Brie,        'Backstage  passes  to  a  TAFKAL80ETC  concert'  =>  Backstage  }    def  self.for(name,  quality,  days_remaining)        klass_for(name).new(quality,  days_remaining)    end    def  self.klass_for(name)        case  name        when  'normal'            Normal        when  'Aged  Brie'            Brie        when  'Sulfuras,  Hand  of  Ragnaros'            Item        when  'Backstage  passes  to  a  TAFKAL80ETC  concert'            Backstage        end    end end Friday, March 7, 14
  327. @sandimetz Mar 2014 module  GildedRose    DEFAULT_CLASS  =  Item  

     SPECIALIZED_CLASSES  =  {        'normal'                                                                        =>  Normal,        'Aged  Brie'                                                                  =>  Brie,        'Backstage  passes  to  a  TAFKAL80ETC  concert'  =>  Backstage  }    def  self.for(name,  quality,  days_remaining)        klass_for(name).new(quality,  days_remaining)    end    def  self.klass_for(name)        case  name        when  'normal'            Normal        when  'Aged  Brie'            Brie        when  'Sulfuras,  Hand  of  Ragnaros'            Item        when  'Backstage  passes  to  a  TAFKAL80ETC  concert'            Backstage        end    end end Friday, March 7, 14
  328. @sandimetz Mar 2014 module  GildedRose    DEFAULT_CLASS  =  Item  

     SPECIALIZED_CLASSES  =  {        'normal'                                                                        =>  Normal,        'Aged  Brie'                                                                  =>  Brie,        'Backstage  passes  to  a  TAFKAL80ETC  concert'  =>  Backstage  }    def  self.for(name,  quality,  days_remaining)        klass_for(name).            new(quality,  days_remaining)    end    def  self.klass_for(name)        case  name        when  'normal'            Normal        when  'Aged  Brie'            Brie        when  'Sulfuras,  Hand  of  Ragnaros'            Item        when  'Backstage  passes  to  a  TAFKAL80ETC  concert'            Backstage        end    end end Friday, March 7, 14
  329. @sandimetz Mar 2014 module  GildedRose    DEFAULT_CLASS  =  Item  

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

     SPECIALIZED_CLASSES  =  {        'normal'                                                                        =>  Normal,        'Aged  Brie'                                                                  =>  Brie,        'Backstage  passes  to  a  TAFKAL80ETC  concert'  =>  Backstage  }    def  self.for(name,  quality,  days_remaining)        (SPECIALIZED_CLASSES[name]  ||  DEFAULT_CLASS).            new(quality,  days_remaining)    end end Friday, March 7, 14
  331. @sandimetz Mar 2014 small objects Friday, March 7, 14

  332. @sandimetz Mar 2014 module  GildedRose    class  Item    

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  354. @sandimetz Mar 2014 module  GildedRose    class  Conjured  <  Item

           def  tick            @days_remaining  -­‐=  1            return  if  @quality  ==  0            @quality  -­‐=  2            @quality  -­‐=  2  if  @days_remaining  <=  0        end    end Friday, March 7, 14
  355. @sandimetz Mar 2014 module  GildedRose    class  Conjured  <  Item

           def  tick            @days_remaining  -­‐=  1            return  if  @quality  ==  0            @quality  -­‐=  2            @quality  -­‐=  2  if  @days_remaining  <=  0        end    end    SPECIALIZED_CLASSES  =  {        'normal'                                                                        =>  Normal,        'Aged  Brie'                                                                  =>  Brie,        'Backstage  passes  to  a  TAFKAL80ETC  concert'  =>  Backstage} Friday, March 7, 14
  356. @sandimetz Mar 2014 module  GildedRose    class  Conjured  <  Item

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

     7914.2201  runs/s,  15828.4401  assertions/s. 31  runs,  62  assertions,  0  failures,  0  errors,  0  skips Friday, March 7, 14
  358. @sandimetz Mar 2014 Summary Friday, March 7, 14

  359. @sandimetz Mar 2014 duplication is far cheaper than the wrong

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

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

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

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

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

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

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

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

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

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

    14