@sandimetz Apr 2014
sandi metz
all the little things
1
Thursday, April 24, 14
@sandimetz Apr 2014
Want better apps?
2
Thursday, April 24, 14
@sandimetz Apr 2014
make smaller things
3
Thursday, April 24, 14
@sandimetz Apr 2014
The Gilded Rose Kata
4
Thursday, April 24, 14
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@sandimetz Apr 2014
11
Thursday, April 24, 14
@sandimetz Apr 2014
def
tick
if
@name
!=
'Aged
Brie'
&&
@name
!=
'Backstage
passes
to
a
TAFKAL80ETC
concert'
if
@quality
>
0
if
@name
!=
'Sulfuras,
Hand
of
Ragnaros'
@quality
-‐=
1
end
end
else
if
@quality
<
50
@quality
+=
1
if
@name
==
'Backstage
passes
to
a
TAFKAL80ETC
concert'
if
@days_remaining
<
11
if
@quality
<
50
@quality
+=
1
end
end
if
@days_remaining
<
6
if
@quality
<
50
@quality
+=
1
end
end
end
end
end
if
@name
!=
'Sulfuras,
Hand
of
Ragnaros'
@days_remaining
-‐=
1
end
if
@days_remaining
<
0
if
@name
!=
"Aged
Brie"
if
@name
!=
'Backstage
passes
to
a
TAFKAL80ETC
concert'
if
@quality
>
0
if
@name
!=
'Sulfuras,
Hand
of
Ragnaros'
@quality
-‐=
1
end
end
else
@quality
=
@quality
-‐
@quality
end
else
if
@quality
<
50
@quality
+=
1
end
end
end
end
12
Thursday, April 24, 14
@sandimetz Apr 2014
def
tick
if
@name
!=
'Aged
Brie'
&&
@name
!=
'Backstage
passes
to
a
TAFKAL80ETC
concert'
if
@quality
>
0
if
@name
!=
'Sulfuras,
Hand
of
Ragnaros'
@quality
-‐=
1
end
end
else
if
@quality
<
50
@quality
+=
1
if
@name
==
'Backstage
passes
to
a
TAFKAL80ETC
concert'
if
@days_remaining
<
11
if
@quality
<
50
@quality
+=
1
end
end
if
@days_remaining
<
6
if
@quality
<
50
@quality
+=
1
end
end
end
end
end
if
@name
!=
'Sulfuras,
Hand
of
Ragnaros'
@days_remaining
-‐=
1
end
if
@days_remaining
<
0
if
@name
!=
"Aged
Brie"
if
@name
!=
'Backstage
passes
to
a
TAFKAL80ETC
concert'
if
@quality
>
0
if
@name
!=
'Sulfuras,
Hand
of
Ragnaros'
@quality
-‐=
1
end
end
else
@quality
=
@quality
-‐
@quality
end
else
if
@quality
<
50
@quality
+=
1
end
end
end
end
Squint Test
12
Thursday, April 24, 14
@sandimetz Apr 2014
def
tick
if
@name
!=
'Aged
Brie'
&&
@name
!=
'Backstage
passes
to
a
TAFKAL80ETC
concert'
if
@quality
>
0
if
@name
!=
'Sulfuras,
Hand
of
Ragnaros'
@quality
-‐=
1
end
end
else
if
@quality
<
50
@quality
+=
1
if
@name
==
'Backstage
passes
to
a
TAFKAL80ETC
concert'
if
@days_remaining
<
11
if
@quality
<
50
@quality
+=
1
end
end
if
@days_remaining
<
6
if
@quality
<
50
@quality
+=
1
end
end
end
end
end
if
@name
!=
'Sulfuras,
Hand
of
Ragnaros'
@days_remaining
-‐=
1
end
if
@days_remaining
<
0
if
@name
!=
"Aged
Brie"
if
@name
!=
'Backstage
passes
to
a
TAFKAL80ETC
concert'
if
@quality
>
0
if
@name
!=
'Sulfuras,
Hand
of
Ragnaros'
@quality
-‐=
1
end
end
else
@quality
=
@quality
-‐
@quality
end
else
if
@quality
<
50
@quality
+=
1
end
end
end
end
changes in shape
13
Thursday, April 24, 14
@sandimetz Apr 2014
def
tick
if
@name
!=
'Aged
Brie'
&&
@name
!=
'Backstage
passes
to
a
TAFKAL80ETC
concert'
if
@quality
>
0
if
@name
!=
'Sulfuras,
Hand
of
Ragnaros'
@quality
-‐=
1
end
end
else
if
@quality
<
50
@quality
+=
1
if
@name
==
'Backstage
passes
to
a
TAFKAL80ETC
concert'
if
@days_remaining
<
11
if
@quality
<
50
@quality
+=
1
end
end
if
@days_remaining
<
6
if
@quality
<
50
@quality
+=
1
end
end
end
end
end
if
@name
!=
'Sulfuras,
Hand
of
Ragnaros'
@days_remaining
-‐=
1
end
if
@days_remaining
<
0
if
@name
!=
"Aged
Brie"
if
@name
!=
'Backstage
passes
to
a
TAFKAL80ETC
concert'
if
@quality
>
0
if
@name
!=
'Sulfuras,
Hand
of
Ragnaros'
@quality
-‐=
1
end
end
else
@quality
=
@quality
-‐
@quality
end
else
if
@quality
<
50
@quality
+=
1
end
end
end
end
2
14
Thursday, April 24, 14
@sandimetz Apr 2014
def
tick
if
@name
!=
'Aged
Brie'
&&
@name
!=
'Backstage
passes
to
a
TAFKAL80ETC
concert'
if
@quality
>
0
if
@name
!=
'Sulfuras,
Hand
of
Ragnaros'
@quality
-‐=
1
end
end
else
if
@quality
<
50
@quality
+=
1
if
@name
==
'Backstage
passes
to
a
TAFKAL80ETC
concert'
if
@days_remaining
<
11
if
@quality
<
50
@quality
+=
1
end
end
if
@days_remaining
<
6
if
@quality
<
50
@quality
+=
1
end
end
end
end
end
if
@name
!=
'Sulfuras,
Hand
of
Ragnaros'
@days_remaining
-‐=
1
end
if
@days_remaining
<
0
if
@name
!=
"Aged
Brie"
if
@name
!=
'Backstage
passes
to
a
TAFKAL80ETC
concert'
if
@quality
>
0
if
@name
!=
'Sulfuras,
Hand
of
Ragnaros'
@quality
-‐=
1
end
end
else
@quality
=
@quality
-‐
@quality
end
else
if
@quality
<
50
@quality
+=
1
end
end
end
end
changes in color
15
Thursday, April 24, 14
@sandimetz Apr 2014
def
tick
if
@name
!=
'Aged
Brie'
&&
@name
!=
'Backstage
passes
to
a
TAFKAL80ETC
concert'
if
@quality
>
0
if
@name
!=
'Sulfuras,
Hand
of
Ragnaros'
@quality
-‐=
1
end
end
else
if
@quality
<
50
@quality
+=
1
if
@name
==
'Backstage
passes
to
a
TAFKAL80ETC
concert'
if
@days_remaining
<
11
if
@quality
<
50
@quality
+=
1
end
end
if
@days_remaining
<
6
if
@quality
<
50
@quality
+=
1
end
end
end
end
end
if
@name
!=
'Sulfuras,
Hand
of
Ragnaros'
@days_remaining
-‐=
1
end
if
@days_remaining
<
0
if
@name
!=
"Aged
Brie"
if
@name
!=
'Backstage
passes
to
a
TAFKAL80ETC
concert'
if
@quality
>
0
if
@name
!=
'Sulfuras,
Hand
of
Ragnaros'
@quality
-‐=
1
end
end
else
@quality
=
@quality
-‐
@quality
end
else
if
@quality
<
50
@quality
+=
1
end
end
end
end
16
Thursday, April 24, 14
@sandimetz Apr 2014
def
tick
if
@name
!=
'Aged
Brie'
&&
@name
!=
'Backstage
passes
to
a
TAFKAL80ETC
concert'
if
@quality
>
0
if
@name
!=
'Sulfuras,
Hand
of
Ragnaros'
@quality
-‐=
1
end
end
else
if
@quality
<
50
@quality
+=
1
if
@name
==
'Backstage
passes
to
a
TAFKAL80ETC
concert'
if
@days_remaining
<
11
if
@quality
<
50
@quality
+=
1
end
end
if
@days_remaining
<
6
if
@quality
<
50
@quality
+=
1
end
end
end
end
end
if
@name
!=
'Sulfuras,
Hand
of
Ragnaros'
@days_remaining
-‐=
1
end
if
@days_remaining
<
0
if
@name
!=
"Aged
Brie"
if
@name
!=
'Backstage
passes
to
a
TAFKAL80ETC
concert'
if
@quality
>
0
if
@name
!=
'Sulfuras,
Hand
of
Ragnaros'
@quality
-‐=
1
end
end
else
@quality
=
@quality
-‐
@quality
end
else
if
@quality
<
50
@quality
+=
1
end
end
end
end
17
Thursday, April 24, 14
@sandimetz Apr 2014
def
tick
if
@name
!=
'Aged
Brie'
&&
@name
!=
'Backstage
passes
to
a
TAFKAL80ETC
concert'
if
@quality
>
0
if
@name
!=
'Sulfuras,
Hand
of
Ragnaros'
@quality
-‐=
1
end
end
else
if
@quality
<
50
@quality
+=
1
if
@name
==
'Backstage
passes
to
a
TAFKAL80ETC
concert'
if
@days_remaining
<
11
if
@quality
<
50
@quality
+=
1
end
end
if
@days_remaining
<
6
if
@quality
<
50
@quality
+=
1
end
end
end
end
end
if
@name
!=
'Sulfuras,
Hand
of
Ragnaros'
@days_remaining
-‐=
1
end
if
@days_remaining
<
0
if
@name
!=
"Aged
Brie"
if
@name
!=
'Backstage
passes
to
a
TAFKAL80ETC
concert'
if
@quality
>
0
if
@name
!=
'Sulfuras,
Hand
of
Ragnaros'
@quality
-‐=
1
end
end
else
@quality
=
@quality
-‐
@quality
end
else
if
@quality
<
50
@quality
+=
1
end
end
end
end
16 if statements
17
Thursday, April 24, 14
@sandimetz Apr 2014
def
tick
if
@name
!=
'Aged
Brie'
&&
@name
!=
'Backstage
passes
to
a
TAFKAL80ETC
concert'
if
@quality
>
0
if
@name
!=
'Sulfuras,
Hand
of
Ragnaros'
@quality
-‐=
1
end
end
else
if
@quality
<
50
@quality
+=
1
if
@name
==
'Backstage
passes
to
a
TAFKAL80ETC
concert'
if
@days_remaining
<
11
if
@quality
<
50
@quality
+=
1
end
end
if
@days_remaining
<
6
if
@quality
<
50
@quality
+=
1
end
end
end
end
end
if
@name
!=
'Sulfuras,
Hand
of
Ragnaros'
@days_remaining
-‐=
1
end
if
@days_remaining
<
0
if
@name
!=
"Aged
Brie"
if
@name
!=
'Backstage
passes
to
a
TAFKAL80ETC
concert'
if
@quality
>
0
if
@name
!=
'Sulfuras,
Hand
of
Ragnaros'
@quality
-‐=
1
end
end
else
@quality
=
@quality
-‐
@quality
end
else
if
@quality
<
50
@quality
+=
1
end
end
end
end
16 if statements
7 !=
17
Thursday, April 24, 14
@sandimetz Apr 2014
def
tick
if
@name
!=
'Aged
Brie'
&&
@name
!=
'Backstage
passes
to
a
TAFKAL80ETC
concert'
if
@quality
>
0
if
@name
!=
'Sulfuras,
Hand
of
Ragnaros'
@quality
-‐=
1
end
end
else
if
@quality
<
50
@quality
+=
1
if
@name
==
'Backstage
passes
to
a
TAFKAL80ETC
concert'
if
@days_remaining
<
11
if
@quality
<
50
@quality
+=
1
end
end
if
@days_remaining
<
6
if
@quality
<
50
@quality
+=
1
end
end
end
end
end
if
@name
!=
'Sulfuras,
Hand
of
Ragnaros'
@days_remaining
-‐=
1
end
if
@days_remaining
<
0
if
@name
!=
"Aged
Brie"
if
@name
!=
'Backstage
passes
to
a
TAFKAL80ETC
concert'
if
@quality
>
0
if
@name
!=
'Sulfuras,
Hand
of
Ragnaros'
@quality
-‐=
1
end
end
else
@quality
=
@quality
-‐
@quality
end
else
if
@quality
<
50
@quality
+=
1
end
end
end
end
16 if statements
7 !=
2 != with &&
17
Thursday, April 24, 14
@sandimetz Apr 2014
def
tick
if
@name
!=
'Aged
Brie'
&&
@name
!=
'Backstage
passes
to
a
TAFKAL80ETC
concert'
if
@quality
>
0
if
@name
!=
'Sulfuras,
Hand
of
Ragnaros'
@quality
-‐=
1
end
end
else
if
@quality
<
50
@quality
+=
1
if
@name
==
'Backstage
passes
to
a
TAFKAL80ETC
concert'
if
@days_remaining
<
11
if
@quality
<
50
@quality
+=
1
end
end
if
@days_remaining
<
6
if
@quality
<
50
@quality
+=
1
end
end
end
end
end
if
@name
!=
'Sulfuras,
Hand
of
Ragnaros'
@days_remaining
-‐=
1
end
if
@days_remaining
<
0
if
@name
!=
"Aged
Brie"
if
@name
!=
'Backstage
passes
to
a
TAFKAL80ETC
concert'
if
@quality
>
0
if
@name
!=
'Sulfuras,
Hand
of
Ragnaros'
@quality
-‐=
1
end
end
else
@quality
=
@quality
-‐
@quality
end
else
if
@quality
<
50
@quality
+=
1
end
end
end
end
16 if statements
7 !=
2 != with &&
3 magic strings
17
Thursday, April 24, 14
@sandimetz Apr 2014
def
tick
if
@name
!=
'Aged
Brie'
&&
@name
!=
'Backstage
passes
to
a
TAFKAL80ETC
concert'
if
@quality
>
0
if
@name
!=
'Sulfuras,
Hand
of
Ragnaros'
@quality
-‐=
1
end
end
else
if
@quality
<
50
@quality
+=
1
if
@name
==
'Backstage
passes
to
a
TAFKAL80ETC
concert'
if
@days_remaining
<
11
if
@quality
<
50
@quality
+=
1
end
end
if
@days_remaining
<
6
if
@quality
<
50
@quality
+=
1
end
end
end
end
end
if
@name
!=
'Sulfuras,
Hand
of
Ragnaros'
@days_remaining
-‐=
1
end
if
@days_remaining
<
0
if
@name
!=
"Aged
Brie"
if
@name
!=
'Backstage
passes
to
a
TAFKAL80ETC
concert'
if
@quality
>
0
if
@name
!=
'Sulfuras,
Hand
of
Ragnaros'
@quality
-‐=
1
end
end
else
@quality
=
@quality
-‐
@quality
end
else
if
@quality
<
50
@quality
+=
1
end
end
end
end
16 if statements
7 !=
2 != with &&
3 magic strings
? magic numbers
17
Thursday, April 24, 14
@sandimetz Apr 2014
def
tick
if
@name
!=
'Aged
Brie'
&&
@name
!=
'Backstage
passes
to
a
TAFKAL80ETC
concert'
if
@quality
>
0
if
@name
!=
'Sulfuras,
Hand
of
Ragnaros'
@quality
-‐=
1
end
end
else
if
@quality
<
50
@quality
+=
1
if
@name
==
'Backstage
passes
to
a
TAFKAL80ETC
concert'
if
@days_remaining
<
11
if
@quality
<
50
@quality
+=
1
end
end
if
@days_remaining
<
6
if
@quality
<
50
@quality
+=
1
end
end
end
end
end
if
@name
!=
'Sulfuras,
Hand
of
Ragnaros'
@days_remaining
-‐=
1
end
if
@days_remaining
<
0
if
@name
!=
"Aged
Brie"
if
@name
!=
'Backstage
passes
to
a
TAFKAL80ETC
concert'
if
@quality
>
0
if
@name
!=
'Sulfuras,
Hand
of
Ragnaros'
@quality
-‐=
1
end
end
else
@quality
=
@quality
-‐
@quality
end
else
if
@quality
<
50
@quality
+=
1
end
end
end
end
magic strings
18
Thursday, April 24, 14
@sandimetz Apr 2014
def
tick
if
@name
!=
'Aged
Brie'
&&
@name
!=
'Backstage
passes
to
a
TAFKAL80ETC
concert'
if
@quality
>
0
if
@name
!=
'Sulfuras,
Hand
of
Ragnaros'
@quality
-‐=
1
end
end
else
if
@quality
<
50
@quality
+=
1
if
@name
==
'Backstage
passes
to
a
TAFKAL80ETC
concert'
if
@days_remaining
<
11
if
@quality
<
50
@quality
+=
1
end
end
if
@days_remaining
<
6
if
@quality
<
50
@quality
+=
1
end
end
end
end
end
if
@name
!=
'Sulfuras,
Hand
of
Ragnaros'
@days_remaining
-‐=
1
end
if
@days_remaining
<
0
if
@name
!=
"Aged
Brie"
if
@name
!=
'Backstage
passes
to
a
TAFKAL80ETC
concert'
if
@quality
>
0
if
@name
!=
'Sulfuras,
Hand
of
Ragnaros'
@quality
-‐=
1
end
end
else
@quality
=
@quality
-‐
@quality
end
else
if
@quality
<
50
@quality
+=
1
end
end
end
end
‘Aged
Brie’
magic strings
18
Thursday, April 24, 14
@sandimetz Apr 2014
def
tick
if
@name
!=
'Aged
Brie'
&&
@name
!=
'Backstage
passes
to
a
TAFKAL80ETC
concert'
if
@quality
>
0
if
@name
!=
'Sulfuras,
Hand
of
Ragnaros'
@quality
-‐=
1
end
end
else
if
@quality
<
50
@quality
+=
1
if
@name
==
'Backstage
passes
to
a
TAFKAL80ETC
concert'
if
@days_remaining
<
11
if
@quality
<
50
@quality
+=
1
end
end
if
@days_remaining
<
6
if
@quality
<
50
@quality
+=
1
end
end
end
end
end
if
@name
!=
'Sulfuras,
Hand
of
Ragnaros'
@days_remaining
-‐=
1
end
if
@days_remaining
<
0
if
@name
!=
"Aged
Brie"
if
@name
!=
'Backstage
passes
to
a
TAFKAL80ETC
concert'
if
@quality
>
0
if
@name
!=
'Sulfuras,
Hand
of
Ragnaros'
@quality
-‐=
1
end
end
else
@quality
=
@quality
-‐
@quality
end
else
if
@quality
<
50
@quality
+=
1
end
end
end
end
‘Aged
Brie’
‘Sulfuras,
Hand
of
Ragnaros’
magic strings
18
Thursday, April 24, 14
@sandimetz Apr 2014
def
tick
if
@name
!=
'Aged
Brie'
&&
@name
!=
'Backstage
passes
to
a
TAFKAL80ETC
concert'
if
@quality
>
0
if
@name
!=
'Sulfuras,
Hand
of
Ragnaros'
@quality
-‐=
1
end
end
else
if
@quality
<
50
@quality
+=
1
if
@name
==
'Backstage
passes
to
a
TAFKAL80ETC
concert'
if
@days_remaining
<
11
if
@quality
<
50
@quality
+=
1
end
end
if
@days_remaining
<
6
if
@quality
<
50
@quality
+=
1
end
end
end
end
end
if
@name
!=
'Sulfuras,
Hand
of
Ragnaros'
@days_remaining
-‐=
1
end
if
@days_remaining
<
0
if
@name
!=
"Aged
Brie"
if
@name
!=
'Backstage
passes
to
a
TAFKAL80ETC
concert'
if
@quality
>
0
if
@name
!=
'Sulfuras,
Hand
of
Ragnaros'
@quality
-‐=
1
end
end
else
@quality
=
@quality
-‐
@quality
end
else
if
@quality
<
50
@quality
+=
1
end
end
end
end
‘Aged
Brie’
‘Sulfuras,
Hand
of
Ragnaros’
‘Backstage
passes
to
a
TAFKAL80ETC
concert’
magic strings
18
Thursday, April 24, 14
@sandimetz Apr 2014
def
tick
if
@name
!=
'Aged
Brie'
&&
@name
!=
'Backstage
passes
to
a
TAFKAL80ETC
concert'
if
@quality
>
0
if
@name
!=
'Sulfuras,
Hand
of
Ragnaros'
@quality
-‐=
1
end
end
else
if
@quality
<
50
@quality
+=
1
if
@name
==
'Backstage
passes
to
a
TAFKAL80ETC
concert'
if
@days_remaining
<
11
if
@quality
<
50
@quality
+=
1
end
end
if
@days_remaining
<
6
if
@quality
<
50
@quality
+=
1
end
end
end
end
end
if
@name
!=
'Sulfuras,
Hand
of
Ragnaros'
@days_remaining
-‐=
1
end
if
@days_remaining
<
0
if
@name
!=
"Aged
Brie"
if
@name
!=
'Backstage
passes
to
a
TAFKAL80ETC
concert'
if
@quality
>
0
if
@name
!=
'Sulfuras,
Hand
of
Ragnaros'
@quality
-‐=
1
end
end
else
@quality
=
@quality
-‐
@quality
end
else
if
@quality
<
50
@quality
+=
1
end
end
end
end
it has tests
19
Thursday, April 24, 14
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@sandimetz Apr 2014
27
Thursday, April 24, 14
@sandimetz Apr 2014
Task:
27
Thursday, April 24, 14
@sandimetz Apr 2014
Task:
Implement Conjured
27
Thursday, April 24, 14
@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
@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
@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
@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
@sandimetz Apr 2014
the pattern failed me
31
Thursday, April 24, 14
@sandimetz Apr 2014
32
Thursday, April 24, 14
@sandimetz Apr 2014
Task:
32
Thursday, April 24, 14
@sandimetz Apr 2014
Task:
Refactor code so I can
Implement Conjured
32
Thursday, April 24, 14
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@sandimetz Apr 2014
refactor under green
55
Thursday, April 24, 14
@sandimetz Apr 2014
reach for the
lowest hanging green
56
Thursday, April 24, 14
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@sandimetz Apr 2014
def
tick
if
name
==
'normal'
return
normal_tick
end
#
...
end
72
Thursday, April 24, 14
@sandimetz Apr 2014
def
tick
case
name
when
'normal'
return
normal_tick
end
#
...
end
73
Thursday, April 24, 14
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@sandimetz Apr 2014
duplication is far cheaper
than the wrong abstraction
82
Thursday, April 24, 14
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@sandimetz Apr 2014
small methods are simple
92
Thursday, April 24, 14
@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
@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
@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
@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
@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
@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
@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
@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
@sandimetz Apr 2014
Task:
Implement Conjured
98
Thursday, April 24, 14
@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
@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
@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
@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
@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
@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
@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
@sandimetz Apr 2014
the pattern still fails me
100
Thursday, April 24, 14
@sandimetz Apr 2014
open / closed
101
Thursday, April 24, 14
@sandimetz Apr 2014
open for extension
102
Thursday, April 24, 14
@sandimetz Apr 2014
open for extension
closed for modification
103
Thursday, April 24, 14
@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
@sandimetz Apr 2014
OO Principles
105
Thursday, April 24, 14
@sandimetz Apr 2014
OO Principles
a style guide for
arranging code
106
Thursday, April 24, 14
@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
@sandimetz Apr 2014
they’re screaming to get out
108
Thursday, April 24, 14
@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
@sandimetz Apr 2014
brie_tick
backstage_tick
sulfuras_tick
normal_tick
GildedRose
110
Thursday, April 24, 14
@sandimetz Apr 2014
brie_tick
backstage_tick
sulfuras_tick
normal_tick
GildedRose
110
Thursday, April 24, 14
@sandimetz Apr 2014
brie_tick
backstage_tick
sulfuras_tick
normal_tick
GildedRose
110
Thursday, April 24, 14
@sandimetz Apr 2014
Normal
brie_tick
backstage_tick
sulfuras_tick
normal_tick
GildedRose
111
Thursday, April 24, 14
@sandimetz Apr 2014
tick
Normal
brie_tick
backstage_tick
sulfuras_tick
normal_tick
GildedRose
112
Thursday, April 24, 14
@sandimetz Apr 2014
tick
Normal
brie_tick
backstage_tick
sulfuras_tick
normal_tick
GildedRose
113
Thursday, April 24, 14
@sandimetz Apr 2014
tick
Normal
brie_tick
backstage_tick
sulfuras_tick
normal_tick
GildedRose
113
Thursday, April 24, 14
@sandimetz Apr 2014
tick
Normal
brie_tick
backstage_tick
sulfuras_tick
GildedRose
114
Thursday, April 24, 14
@sandimetz Apr 2014
tick
Normal
GildedRose
brie_tick
backstage_tick
sulfuras_tick
115
Thursday, April 24, 14
@sandimetz Apr 2014
tick
Normal
GildedRose
brie_tick
backstage_tick
sulfuras_tick
116
Thursday, April 24, 14
@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
@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
@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
@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
@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
@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
@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
@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
@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
@sandimetz Apr 2014
tick
Normal
GildedRose
brie_tick
backstage_tick
sulfuras_tick
126
Thursday, April 24, 14
@sandimetz Apr 2014
normal is an object
127
Thursday, April 24, 14
@sandimetz Apr 2014
brie/sulfuras/backstage are not
128
Thursday, April 24, 14
@sandimetz Apr 2014
class
GildedRose
def
normal_tick
@item
=
Normal.new(quality,
days_remaining)
item.tick
end
129
Thursday, April 24, 14
@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
@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
@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
@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
@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
@sandimetz Apr 2014
brie
135
Thursday, April 24, 14
@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
@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
@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
@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
@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
@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
@sandimetz Apr 2014
sulfuras
142
Thursday, April 24, 14
@sandimetz Apr 2014
class
GildedRose
def
sulfuras_tick
end
143
Thursday, April 24, 14
@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
@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
@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
@sandimetz Apr 2014
backstage
147
Thursday, April 24, 14
@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
@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
@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
@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
@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
@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
@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
@sandimetz Apr 2014
normal/brie/sulfuras/backstage
are now objects
155
Thursday, April 24, 14
@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
@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
@sandimetz Apr 2014
rewind
158
Thursday, April 24, 14
@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
@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
@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
@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
@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
@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
@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
@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
@sandimetz Apr 2014
abstract away the duplication
167
Thursday, April 24, 14
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@sandimetz Apr 2014
item is a role
184
Thursday, April 24, 14
@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
@sandimetz Apr 2014
attr_reader
:item
GildedRose
ItemRole
def
tick
def
quality
def
days_remaining
186
Thursday, April 24, 14
@sandimetz Apr 2014
attr_reader
:item
ItemRole
def
tick
def
quality
def
days_remaining
GildedRose
187
Thursday, April 24, 14
@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
@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
@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
@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
@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
@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
@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
@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
@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
@sandimetz Apr 2014
Foo
attr_reader
:item
attr_reader
:rose
GildedRose
ItemRole
def
tick
def
quality
def
days_remaining
191
Thursday, April 24, 14
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@sandimetz Apr 2014
extract common code
202
Thursday, April 24, 14
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@sandimetz Apr 2014
inheritance is not evil
214
Thursday, April 24, 14
@sandimetz Apr 2014
but we sometimes are
215
Thursday, April 24, 14
@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
@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
@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
@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
@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
@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
@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
@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
@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
@sandimetz Apr 2014
module
GildedRose
class
Item
def
tick
end
end
class
Sulfuras
<
Item
def
tick
end
end
220
Thursday, April 24, 14
@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
@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
@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
@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
@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
@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
@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
@sandimetz Apr 2014
extract configuration
226
Thursday, April 24, 14
@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
@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
@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
@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
@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
@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
@sandimetz Apr 2014
small objects
233
Thursday, April 24, 14
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@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
@sandimetz Apr 2014
Task:
Implement Conjured
250
Thursday, April 24, 14
@sandimetz Apr 2014
module
GildedRose
251
Thursday, April 24, 14
@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
@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
@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
@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
@sandimetz Apr 2014
Summary
256
Thursday, April 24, 14
@sandimetz Apr 2014
prefer duplication
over the wrong abstraction
257
Thursday, April 24, 14
@sandimetz Apr 2014
reach for open / closed
258
Thursday, April 24, 14
@sandimetz Apr 2014
make small things
259
Thursday, April 24, 14
@sandimetz Apr 2014
refactor through complexity
260
Thursday, April 24, 14
@sandimetz Apr 2014
refactor to simplicity
261
Thursday, April 24, 14
@sandimetz Apr 2014
love your code
262
Thursday, April 24, 14
@sandimetz Apr 2014
Sandi Metz
@sandimetz Apr 2014
263
Thursday, April 24, 14
@sandimetz Apr 2014
Sandi Metz
@sandimetz
@sandimetz Apr 2014
263
Thursday, April 24, 14
@sandimetz Apr 2014
Sandi Metz
@sandimetz
@sandimetz Apr 2014
http://sandimetz.com
263
Thursday, April 24, 14
http://poodr.com
Sandi Metz
@sandimetz
@sandimetz Apr 2014
264
Thursday, April 24, 14
@sandimetz Apr 2014
@sandimetz Apr 2014
http://practicalrailsbook.com
265
Thursday, April 24, 14
@sandimetz Apr 2014
London Course
http://kickstartacademy.io/courses/
practical-object-oriented-design
June 25-27
July 3-4
266
Thursday, April 24, 14
@sandimetz Apr 2014
267
Thursday, April 24, 14
@sandimetz Apr 2014
Thanks
267
Thursday, April 24, 14
@sandimetz Apr 2014
Thanks
Jim
267
Thursday, April 24, 14
@sandimetz Apr 2014
Questions?
268
Thursday, April 24, 14
@sandimetz Apr 2014
269
Thursday, April 24, 14