Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

@sandimetz Apr 2014 11 Thursday, April 24, 14

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

@sandimetz Apr 2014 27 Thursday, April 24, 14

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

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

Slide 63

Slide 63 text

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

Slide 64

Slide 64 text

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

Slide 65

Slide 65 text

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

Slide 66

Slide 66 text

@sandimetz Apr 2014 32 Thursday, April 24, 14

Slide 67

Slide 67 text

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

Slide 68

Slide 68 text

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

Slide 69

Slide 69 text

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

Slide 70

Slide 70 text

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

Slide 71

Slide 71 text

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

Slide 72

Slide 72 text

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

Slide 73

Slide 73 text

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

Slide 74

Slide 74 text

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

Slide 75

Slide 75 text

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

Slide 76

Slide 76 text

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

Slide 77

Slide 77 text

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

Slide 78

Slide 78 text

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

Slide 79

Slide 79 text

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

Slide 80

Slide 80 text

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

Slide 81

Slide 81 text

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

Slide 82

Slide 82 text

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

Slide 83

Slide 83 text

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

Slide 84

Slide 84 text

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

Slide 85

Slide 85 text

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

Slide 86

Slide 86 text

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

Slide 87

Slide 87 text

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

Slide 88

Slide 88 text

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

Slide 89

Slide 89 text

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

Slide 90

Slide 90 text

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

Slide 91

Slide 91 text

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

Slide 92

Slide 92 text

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

Slide 93

Slide 93 text

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

Slide 94

Slide 94 text

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

Slide 95

Slide 95 text

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

Slide 96

Slide 96 text

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

Slide 97

Slide 97 text

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

Slide 98

Slide 98 text

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

Slide 99

Slide 99 text

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

Slide 100

Slide 100 text

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

Slide 101

Slide 101 text

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

Slide 102

Slide 102 text

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

Slide 103

Slide 103 text

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

Slide 104

Slide 104 text

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

Slide 105

Slide 105 text

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

Slide 106

Slide 106 text

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

Slide 107

Slide 107 text

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

Slide 108

Slide 108 text

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

Slide 109

Slide 109 text

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

Slide 110

Slide 110 text

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

Slide 111

Slide 111 text

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

Slide 112

Slide 112 text

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

Slide 113

Slide 113 text

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

Slide 114

Slide 114 text

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

Slide 115

Slide 115 text

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

Slide 116

Slide 116 text

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

Slide 117

Slide 117 text

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

Slide 118

Slide 118 text

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

Slide 119

Slide 119 text

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

Slide 120

Slide 120 text

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

Slide 121

Slide 121 text

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

Slide 122

Slide 122 text

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

Slide 123

Slide 123 text

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

Slide 124

Slide 124 text

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

Slide 125

Slide 125 text

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

Slide 126

Slide 126 text

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

Slide 127

Slide 127 text

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

Slide 128

Slide 128 text

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

Slide 129

Slide 129 text

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

Slide 130

Slide 130 text

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

Slide 131

Slide 131 text

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

Slide 132

Slide 132 text

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

Slide 133

Slide 133 text

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

Slide 134

Slide 134 text

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

Slide 135

Slide 135 text

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

Slide 136

Slide 136 text

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

Slide 137

Slide 137 text

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

Slide 138

Slide 138 text

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

Slide 139

Slide 139 text

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

Slide 140

Slide 140 text

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

Slide 141

Slide 141 text

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

Slide 142

Slide 142 text

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

Slide 143

Slide 143 text

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

Slide 144

Slide 144 text

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

Slide 145

Slide 145 text

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

Slide 146

Slide 146 text

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

Slide 147

Slide 147 text

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

Slide 148

Slide 148 text

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

Slide 149

Slide 149 text

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

Slide 150

Slide 150 text

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

Slide 151

Slide 151 text

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

Slide 152

Slide 152 text

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

Slide 153

Slide 153 text

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

Slide 154

Slide 154 text

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

Slide 155

Slide 155 text

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

Slide 156

Slide 156 text

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

Slide 157

Slide 157 text

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

Slide 158

Slide 158 text

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

Slide 159

Slide 159 text

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

Slide 160

Slide 160 text

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

Slide 161

Slide 161 text

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

Slide 162

Slide 162 text

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

Slide 163

Slide 163 text

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

Slide 164

Slide 164 text

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

Slide 165

Slide 165 text

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

Slide 166

Slide 166 text

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

Slide 167

Slide 167 text

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

Slide 168

Slide 168 text

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

Slide 169

Slide 169 text

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

Slide 170

Slide 170 text

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

Slide 171

Slide 171 text

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

Slide 172

Slide 172 text

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

Slide 173

Slide 173 text

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

Slide 174

Slide 174 text

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

Slide 175

Slide 175 text

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

Slide 176

Slide 176 text

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

Slide 177

Slide 177 text

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

Slide 178

Slide 178 text

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

Slide 179

Slide 179 text

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

Slide 180

Slide 180 text

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

Slide 181

Slide 181 text

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

Slide 182

Slide 182 text

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

Slide 183

Slide 183 text

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

Slide 184

Slide 184 text

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

Slide 185

Slide 185 text

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

Slide 186

Slide 186 text

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

Slide 187

Slide 187 text

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

Slide 188

Slide 188 text

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

Slide 189

Slide 189 text

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

Slide 190

Slide 190 text

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

Slide 191

Slide 191 text

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

Slide 192

Slide 192 text

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

Slide 193

Slide 193 text

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

Slide 194

Slide 194 text

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

Slide 195

Slide 195 text

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

Slide 196

Slide 196 text

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

Slide 197

Slide 197 text

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

Slide 198

Slide 198 text

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

Slide 199

Slide 199 text

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

Slide 200

Slide 200 text

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

Slide 201

Slide 201 text

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

Slide 202

Slide 202 text

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

Slide 203

Slide 203 text

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

Slide 204

Slide 204 text

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

Slide 205

Slide 205 text

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

Slide 206

Slide 206 text

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

Slide 207

Slide 207 text

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

Slide 208

Slide 208 text

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

Slide 209

Slide 209 text

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

Slide 210

Slide 210 text

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

Slide 211

Slide 211 text

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

Slide 212

Slide 212 text

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

Slide 213

Slide 213 text

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

Slide 214

Slide 214 text

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

Slide 215

Slide 215 text

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

Slide 216

Slide 216 text

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

Slide 217

Slide 217 text

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

Slide 218

Slide 218 text

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

Slide 219

Slide 219 text

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

Slide 220

Slide 220 text

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

Slide 221

Slide 221 text

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

Slide 222

Slide 222 text

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

Slide 223

Slide 223 text

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

Slide 224

Slide 224 text

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

Slide 225

Slide 225 text

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

Slide 226

Slide 226 text

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

Slide 227

Slide 227 text

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

Slide 228

Slide 228 text

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

Slide 229

Slide 229 text

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

Slide 230

Slide 230 text

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

Slide 231

Slide 231 text

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

Slide 232

Slide 232 text

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

Slide 233

Slide 233 text

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

Slide 234

Slide 234 text

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

Slide 235

Slide 235 text

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

Slide 236

Slide 236 text

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

Slide 237

Slide 237 text

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

Slide 238

Slide 238 text

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

Slide 239

Slide 239 text

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

Slide 240

Slide 240 text

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

Slide 241

Slide 241 text

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

Slide 242

Slide 242 text

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

Slide 243

Slide 243 text

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

Slide 244

Slide 244 text

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

Slide 245

Slide 245 text

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

Slide 246

Slide 246 text

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

Slide 247

Slide 247 text

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

Slide 248

Slide 248 text

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

Slide 249

Slide 249 text

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

Slide 250

Slide 250 text

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

Slide 251

Slide 251 text

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

Slide 252

Slide 252 text

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

Slide 253

Slide 253 text

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

Slide 254

Slide 254 text

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

Slide 255

Slide 255 text

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

Slide 256

Slide 256 text

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

Slide 257

Slide 257 text

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

Slide 258

Slide 258 text

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

Slide 259

Slide 259 text

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

Slide 260

Slide 260 text

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

Slide 261

Slide 261 text

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

Slide 262

Slide 262 text

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

Slide 263

Slide 263 text

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

Slide 264

Slide 264 text

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

Slide 265

Slide 265 text

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

Slide 266

Slide 266 text

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

Slide 267

Slide 267 text

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

Slide 268

Slide 268 text

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

Slide 269

Slide 269 text

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

Slide 270

Slide 270 text

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

Slide 271

Slide 271 text

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

Slide 272

Slide 272 text

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

Slide 273

Slide 273 text

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

Slide 274

Slide 274 text

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

Slide 275

Slide 275 text

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

Slide 276

Slide 276 text

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

Slide 277

Slide 277 text

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

Slide 278

Slide 278 text

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

Slide 279

Slide 279 text

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

Slide 280

Slide 280 text

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

Slide 281

Slide 281 text

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

Slide 282

Slide 282 text

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

Slide 283

Slide 283 text

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

Slide 284

Slide 284 text

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

Slide 285

Slide 285 text

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

Slide 286

Slide 286 text

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

Slide 287

Slide 287 text

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

Slide 288

Slide 288 text

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

Slide 289

Slide 289 text

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

Slide 290

Slide 290 text

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

Slide 291

Slide 291 text

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

Slide 292

Slide 292 text

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

Slide 293

Slide 293 text

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

Slide 294

Slide 294 text

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

Slide 295

Slide 295 text

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

Slide 296

Slide 296 text

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

Slide 297

Slide 297 text

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

Slide 298

Slide 298 text

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

Slide 299

Slide 299 text

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

Slide 300

Slide 300 text

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

Slide 301

Slide 301 text

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

Slide 302

Slide 302 text

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

Slide 303

Slide 303 text

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

Slide 304

Slide 304 text

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

Slide 305

Slide 305 text

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

Slide 306

Slide 306 text

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

Slide 307

Slide 307 text

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

Slide 308

Slide 308 text

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

Slide 309

Slide 309 text

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

Slide 310

Slide 310 text

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

Slide 311

Slide 311 text

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

Slide 312

Slide 312 text

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

Slide 313

Slide 313 text

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

Slide 314

Slide 314 text

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

Slide 315

Slide 315 text

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

Slide 316

Slide 316 text

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

Slide 317

Slide 317 text

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

Slide 318

Slide 318 text

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

Slide 319

Slide 319 text

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

Slide 320

Slide 320 text

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

Slide 321

Slide 321 text

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

Slide 322

Slide 322 text

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

Slide 323

Slide 323 text

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

Slide 324

Slide 324 text

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

Slide 325

Slide 325 text

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

Slide 326

Slide 326 text

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

Slide 327

Slide 327 text

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

Slide 328

Slide 328 text

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

Slide 329

Slide 329 text

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

Slide 330

Slide 330 text

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

Slide 331

Slide 331 text

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

Slide 332

Slide 332 text

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

Slide 333

Slide 333 text

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

Slide 334

Slide 334 text

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

Slide 335

Slide 335 text

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

Slide 336

Slide 336 text

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

Slide 337

Slide 337 text

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

Slide 338

Slide 338 text

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

Slide 339

Slide 339 text

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

Slide 340

Slide 340 text

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

Slide 341

Slide 341 text

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

Slide 342

Slide 342 text

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

Slide 343

Slide 343 text

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

Slide 344

Slide 344 text

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

Slide 345

Slide 345 text

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

Slide 346

Slide 346 text

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

Slide 347

Slide 347 text

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

Slide 348

Slide 348 text

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

Slide 349

Slide 349 text

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

Slide 350

Slide 350 text

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

Slide 351

Slide 351 text

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

Slide 352

Slide 352 text

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

Slide 353

Slide 353 text

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

Slide 354

Slide 354 text

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

Slide 355

Slide 355 text

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

Slide 356

Slide 356 text

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

Slide 357

Slide 357 text

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

Slide 358

Slide 358 text

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

Slide 359

Slide 359 text

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

Slide 360

Slide 360 text

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

Slide 361

Slide 361 text

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

Slide 362

Slide 362 text

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

Slide 363

Slide 363 text

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

Slide 364

Slide 364 text

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

Slide 365

Slide 365 text

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

Slide 366

Slide 366 text

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

Slide 367

Slide 367 text

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

Slide 368

Slide 368 text

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

Slide 369

Slide 369 text

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

Slide 370

Slide 370 text

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

Slide 371

Slide 371 text

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

Slide 372

Slide 372 text

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

Slide 373

Slide 373 text

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

Slide 374

Slide 374 text

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

Slide 375

Slide 375 text

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

Slide 376

Slide 376 text

@sandimetz Apr 2014 267 Thursday, April 24, 14

Slide 377

Slide 377 text

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

Slide 378

Slide 378 text

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

Slide 379

Slide 379 text

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

Slide 380

Slide 380 text

@sandimetz Apr 2014 269 Thursday, April 24, 14