Gilding the Rose: Refactoring Legacy Code

27204e228cc521c6cafed3c92b95184c?s=47 Randy Coulman
September 20, 2014

Gilding the Rose: Refactoring Legacy Code

Presented at Golden Gate Ruby Conference 2014.

We all run into legacy code. Sometimes, we even write it ourselves. Working with legacy code can be a daunting challenge, but there are ways to tackle it. The Gilded Rose code kata is a coding exercise for practicing refactoring and testing skills in a legacy codebase.

In this presentation, I use the Gilded Rose kata to demonstrate techniques for safely working with a legacy codebase and using pure baby-step refactorings to improve the design.

27204e228cc521c6cafed3c92b95184c?s=128

Randy Coulman

September 20, 2014
Tweet

Transcript

  1. Gilding the Rose: Refactoring Legacy Code Randy Coulman Principal Software

    Engineer http://randycoulman.com @randycoulman randycoulman
  2. Welcome to our new job! Enhance the inventory management system

    for the Gilded Rose Inn
  3. The System

  4. The Spec Can we trust it?

  5. Once the sell-by date has passed, quality degrades twice as

    fast The quality of an item is never negative "Aged Brie" actually increases in quality the older it gets The quality of an item is never more than 50 "Sulfuras", being a legendary item, never has to be sold or decreases in quality "Backstage passes", like aged brie, increases in quality as its sell-by date approaches; quality increases by 2 when there are 10 days or less and by 3 when there are 5 days or less, but quality drops to 0 after the concert.
  6. Constraint The I t e m class and @ i

    t e m s property are off limits - no collective code ownership
  7. Our Task Support Conjured items Conjured items degrade in quality

    twice as fast as normal items.
  8. The Code

  9. c l a s s I t e m a

    t t r _ a c c e s s o r : n a m e , : s e l l _ i n , : q u a l i t y d e f i n i t i a l i z e ( n a m e , s e l l _ i n , q u a l i t y ) @ n a m e = n a m e @ s e l l _ i n = s e l l _ i n @ q u a l i t y = q u a l i t y e n d e n d
  10. r e q u i r e ' . /

    i t e m . r b ' c l a s s G i l d e d R o s e @ i t e m s = [ ] d e f i n i t i a l i z e @ i t e m s = [ ] @ i t e m s < < I t e m . n e w ( " + 5 D e x t e r i t y V e s t " , 1 0 , 2 0 ) @ i t e m s < < I t e m . n e w ( " A g e d B r i e " , 2 , 0 ) @ i t e m s < < I t e m . n e w ( " E l i x i r o f t h e M o n g o o s e " , 5 , 7 ) @ i t e m s < < I t e m . n e w ( " S u l f u r a s , H a n d o f R a g n a r o s " , 0 , 8 0 ) @ i t e m s < < I t e m . n e w ( " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " , 1 5 , 2 0 ) @ i t e m s < < I t e m . n e w ( " C o n j u r e d M a n a C a k e " , 3 , 6 ) e n d d e f u p d a t e _ q u a l i t y # . . . e n d e n d
  11. http://www.kategreene.net/do-not-look-at-laser-with-remaining-eye/

  12. d e f u p d a t e _

    q u a l i t y f o r i i n 0 . . ( @ i t e m s . s i z e - 1 ) i f ( @ i t e m s [ i ] . n a m e ! = " A g e d B r i e " & & @ i t e m s [ i ] . n a m e ! = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " ) i f ( @ i t e m s [ i ] . q u a l i t y > 0 ) i f ( @ i t e m s [ i ] . n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " ) @ i t e m s [ i ] . q u a l i t y = @ i t e m s [ i ] . q u a l i t y - 1 e n d e n d e l s e i f ( @ i t e m s [ i ] . q u a l i t y < 5 0 ) @ i t e m s [ i ] . q u a l i t y = @ i t e m s [ i ] . q u a l i t y + 1 i f ( @ i t e m s [ i ] . n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " ) i f ( @ i t e m s [ i ] . s e l l _ i n < 1 1 ) i f ( @ i t e m s [ i ] . q u a l i t y < 5 0 ) @ i t e m s [ i ] . q u a l i t y = @ i t e m s [ i ] . q u a l i t y + 1 e n d e n d i f ( @ i t e m s [ i ] . s e l l _ i n < 6 ) i f ( @ i t e m s [ i ] . q u a l i t y < 5 0 ) @ i t e m s [ i ] . q u a l i t y = @ i t e m s [ i ] . q u a l i t y + 1 e n d e n d e n d e n d e n d # . . . c o n t i n u e d . . .
  13. # . . . c o n t i n

    u e d . . . i f ( @ i t e m s [ i ] . n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " ) @ i t e m s [ i ] . s e l l _ i n = @ i t e m s [ i ] . s e l l _ i n - 1 ; e n d i f ( @ i t e m s [ i ] . s e l l _ i n < 0 ) i f ( @ i t e m s [ i ] . n a m e ! = " A g e d B r i e " ) i f ( @ i t e m s [ i ] . n a m e ! = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " ) i f ( @ i t e m s [ i ] . q u a l i t y > 0 ) i f ( @ i t e m s [ i ] . n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " ) @ i t e m s [ i ] . q u a l i t y = @ i t e m s [ i ] . q u a l i t y - 1 e n d e n d e l s e @ i t e m s [ i ] . q u a l i t y = @ i t e m s [ i ] . q u a l i t y - @ i t e m s [ i ] . q u a l i t y e n d e l s e i f ( @ i t e m s [ i ] . q u a l i t y < 5 0 ) @ i t e m s [ i ] . q u a l i t y = @ i t e m s [ i ] . q u a l i t y + 1 e n d e n d e n d e n d e n d
  14. The Tests

  15. . . .

  16. https://twitter.com/staszv/status/507374076252282881/photo/1

  17. Our Strategy

  18. None
  19. https://www.facebook.com/pages/The-Official-Unofficial-Rocket-City-Rednecks/250397118342321?sk=notes

  20. Don't trust the spec (yet)

  21. Fight the urge to rewrite

  22. The Boy Scout Rule "Leave the campground cleaner than you

    found it"
  23. Baby Steps Lots of safe, tiny refactorings add up to

    big changes
  24. Don't Boil The Ocean Stay focused!

  25. For each desired change, make the change easy (warning: this

    may be hard), then make the easy change. --Kent Beck (https://twitter.com/KentBeck/status/250733358307500032)
  26. Conjured Items Are we there yet?

  27. d e f u p d a t e _

    q u a l i t y f o r i i n 0 . . ( @ i t e m s . s i z e - 1 ) i f ( @ i t e m s [ i ] . n a m e ! = " A g e d B r i e " & & @ i t e m s [ i ] . n a m e ! = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " ) i f ( @ i t e m s [ i ] . q u a l i t y > 0 ) i f ( @ i t e m s [ i ] . n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " ) @ i t e m s [ i ] . q u a l i t y = @ i t e m s [ i ] . q u a l i t y - 1 e n d e n d e l s e i f ( @ i t e m s [ i ] . q u a l i t y < 5 0 ) @ i t e m s [ i ] . q u a l i t y = @ i t e m s [ i ] . q u a l i t y + 1 i f ( @ i t e m s [ i ] . n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " ) i f ( @ i t e m s [ i ] . s e l l _ i n < 1 1 ) i f ( @ i t e m s [ i ] . q u a l i t y < 5 0 ) @ i t e m s [ i ] . q u a l i t y = @ i t e m s [ i ] . q u a l i t y + 1 e n d e n d i f ( @ i t e m s [ i ] . s e l l _ i n < 6 ) i f ( @ i t e m s [ i ] . q u a l i t y < 5 0 ) @ i t e m s [ i ] . q u a l i t y = @ i t e m s [ i ] . q u a l i t y + 1 e n d e n d e n d e n d e n d # . . . c o n t i n u e d . . .
  28. When you start a new programming job you have to

    walk right up to the biggest function in the yard and refactor it in front of everyone. --@supermoof (https://twitter.com/supermoof/status/478322429257715712)
  29. Reduce Noise

  30. d e f u p d a t e _

    q u a l i t y f o r i i n 0 . . ( @ i t e m s . s i z e - 1 ) i f ( @ i t e m s [ i ] . n a m e ! = " A g e d B r i e " & & @ i t e m s [ i ] . n a m e ! = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " ) i f ( @ i t e m s [ i ] . q u a l i t y > 0 ) i f ( @ i t e m s [ i ] . n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " ) @ i t e m s [ i ] . q u a l i t y = @ i t e m s [ i ] . q u a l i t y - 1 e n d e n d e l s e i f ( @ i t e m s [ i ] . q u a l i t y < 5 0 ) @ i t e m s [ i ] . q u a l i t y = @ i t e m s [ i ] . q u a l i t y + 1 i f ( @ i t e m s [ i ] . n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " ) i f ( @ i t e m s [ i ] . s e l l _ i n < 1 1 ) i f ( @ i t e m s [ i ] . q u a l i t y < 5 0 ) @ i t e m s [ i ] . q u a l i t y = @ i t e m s [ i ] . q u a l i t y + 1 e n d e n d i f ( @ i t e m s [ i ] . s e l l _ i n < 6 ) i f ( @ i t e m s [ i ] . q u a l i t y < 5 0 ) @ i t e m s [ i ] . q u a l i t y = @ i t e m s [ i ] . q u a l i t y + 1 e n d e n d e n d e n d e n d # . . . c o n t i n u e d . . .
  31. d e f u p d a t e _

    q u a l i t y f o r i i n 0 . . ( @ i t e m s . s i z e - 1 ) i t e m = @ i t e m s [ i ] i f ( i t e m . n a m e ! = " A g e d B r i e " & & i t e m . n a m e ! = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " ) i f ( i t e m . q u a l i t y > 0 ) i f ( i t e m . n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " ) i t e m . q u a l i t y = i t e m . q u a l i t y - 1 e n d e n d e l s e i f ( i t e m . q u a l i t y < 5 0 ) i t e m . q u a l i t y = i t e m . q u a l i t y + 1 i f ( i t e m . n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " ) i f ( i t e m . s e l l _ i n < 1 1 ) i f ( i t e m . q u a l i t y < 5 0 ) i t e m . q u a l i t y = i t e m . q u a l i t y + 1 e n d e n d i f ( i t e m . s e l l _ i n < 6 ) i f ( i t e m . q u a l i t y < 5 0 ) i t e m . q u a l i t y = i t e m . q u a l i t y + 1 e n d e n d e n d e n d e n d # . . . c o n t i n u e d . . .
  32. d e f u p d a t e _

    q u a l i t y f o r i i n 0 . . ( @ i t e m s . s i z e - 1 ) i t e m = @ i t e m s [ i ] # . . . 4 0 + l i n e s o f c o d e u s i n g i t e m . . . e n d e n d
  33. d e f u p d a t e _

    q u a l i t y f o r i i n 0 . . ( @ i t e m s . s i z e - 1 ) i t e m = @ i t e m s [ i ] u p d a t e ( i t e m ) e n d e n d d e f u p d a t e ( i t e m ) # . . . 4 0 + l i n e s o f c o d e u s i n g i t e m . . . e n d
  34. d e f u p d a t e _

    q u a l i t y f o r i i n 0 . . ( @ i t e m s . s i z e - 1 ) i t e m = @ i t e m s [ i ] u p d a t e ( i t e m ) e n d e n d
  35. Idiomatic Code is More Readable

  36. d e f u p d a t e _

    q u a l i t y f o r i i n 0 . . ( @ i t e m s . s i z e - 1 ) i t e m = @ i t e m s [ i ] u p d a t e ( i t e m ) e n d e n d
  37. d e f u p d a t e _

    q u a l i t y @ i t e m s . e a c h d o | i t e m | u p d a t e ( i t e m ) e n d e n d
  38. d e f u p d a t e (

    i t e m ) i f ( i t e m . n a m e ! = " A g e d B r i e " & & i t e m . n a m e ! = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " ) i f ( i t e m . q u a l i t y > 0 ) i f ( i t e m . n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " ) i t e m . q u a l i t y = i t e m . q u a l i t y - 1 e n d e n d e l s e i f ( i t e m . q u a l i t y < 5 0 ) i t e m . q u a l i t y = i t e m . q u a l i t y + 1 i f ( i t e m . n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " ) i f ( i t e m . s e l l _ i n < 1 1 ) i f ( i t e m . q u a l i t y < 5 0 ) i t e m . q u a l i t y = i t e m . q u a l i t y + 1 e n d e n d i f ( i t e m . s e l l _ i n < 6 ) i f ( i t e m . q u a l i t y < 5 0 ) i t e m . q u a l i t y = i t e m . q u a l i t y + 1 e n d e n d e n d e n d e n d i f ( i t e m . n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " ) i t e m . s e l l _ i n = i t e m . s e l l _ i n - 1 ; e n d # . . . 1 7 m o r e l i n e s . . . e n d
  39. d e f u p d a t e (

    i t e m ) i f i t e m . n a m e ! = " A g e d B r i e " & & i t e m . n a m e ! = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i f i t e m . q u a l i t y > 0 i f i t e m . n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " i t e m . q u a l i t y = i t e m . q u a l i t y - 1 e n d e n d e l s e i f i t e m . q u a l i t y < 5 0 i t e m . q u a l i t y = i t e m . q u a l i t y + 1 i f i t e m . n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i f i t e m . s e l l _ i n < 1 1 i f i t e m . q u a l i t y < 5 0 i t e m . q u a l i t y = i t e m . q u a l i t y + 1 e n d e n d i f i t e m . s e l l _ i n < 6 i f i t e m . q u a l i t y < 5 0 i t e m . q u a l i t y = i t e m . q u a l i t y + 1 e n d e n d e n d e n d e n d i f i t e m . n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " i t e m . s e l l _ i n = i t e m . s e l l _ i n - 1 ; e n d # . . . 1 7 m o r e l i n e s . . . e n d
  40. d e f u p d a t e (

    i t e m ) i f i t e m . n a m e ! = " A g e d B r i e " & & i t e m . n a m e ! = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i f i t e m . q u a l i t y > 0 i f i t e m . n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " i t e m . q u a l i t y = i t e m . q u a l i t y - 1 e n d e n d e l s e i f i t e m . q u a l i t y < 5 0 i t e m . q u a l i t y = i t e m . q u a l i t y + 1 i f i t e m . n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i f i t e m . s e l l _ i n < 1 1 i f i t e m . q u a l i t y < 5 0 i t e m . q u a l i t y = i t e m . q u a l i t y + 1 e n d e n d i f i t e m . s e l l _ i n < 6 i f i t e m . q u a l i t y < 5 0 i t e m . q u a l i t y = i t e m . q u a l i t y + 1 e n d e n d e n d e n d e n d i f i t e m . n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " i t e m . s e l l _ i n = i t e m . s e l l _ i n - 1 e n d # . . . 1 7 m o r e l i n e s . . . e n d
  41. d e f u p d a t e (

    i t e m ) i f i t e m . n a m e ! = " A g e d B r i e " & & i t e m . n a m e ! = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i f i t e m . q u a l i t y > 0 i f i t e m . n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " i t e m . q u a l i t y - = 1 e n d e n d e l s e i f i t e m . q u a l i t y < 5 0 i t e m . q u a l i t y + = 1 i f i t e m . n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i f i t e m . s e l l _ i n < 1 1 i f i t e m . q u a l i t y < 5 0 i t e m . q u a l i t y + = 1 e n d e n d i f i t e m . s e l l _ i n < 6 i f i t e m . q u a l i t y < 5 0 i t e m . q u a l i t y + = 1 e n d e n d e n d e n d e n d i f i t e m . n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " i t e m . s e l l _ i n - = 1 e n d # . . . 1 7 m o r e l i n e s . . . e n d
  42. Conjured Items Are we there yet?

  43. d e f u p d a t e (

    i t e m ) i f i t e m . n a m e ! = " A g e d B r i e " & & i t e m . n a m e ! = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i f i t e m . q u a l i t y > 0 i f i t e m . n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " i t e m . q u a l i t y - = 1 e n d e n d e l s e i f i t e m . q u a l i t y < 5 0 i t e m . q u a l i t y + = 1 i f i t e m . n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i f i t e m . s e l l _ i n < 1 1 i f i t e m . q u a l i t y < 5 0 i t e m . q u a l i t y + = 1 e n d e n d i f i t e m . s e l l _ i n < 6 i f i t e m . q u a l i t y < 5 0 i t e m . q u a l i t y + = 1 e n d e n d e n d e n d e n d i f i t e m . n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " i t e m . s e l l _ i n - = 1 e n d # . . . 1 7 m o r e l i n e s . . . e n d
  44. Eliminate Feature Envy

  45. d e f u p d a t e (

    i t e m ) i f i t e m . n a m e ! = " A g e d B r i e " & & i t e m . n a m e ! = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i f i t e m . q u a l i t y > 0 i f i t e m . n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " i t e m . q u a l i t y - = 1 e n d e n d e l s e i f i t e m . q u a l i t y < 5 0 i t e m . q u a l i t y + = 1 i f i t e m . n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i f i t e m . s e l l _ i n < 1 1 i f i t e m . q u a l i t y < 5 0 i t e m . q u a l i t y + = 1 e n d e n d i f i t e m . s e l l _ i n < 6 i f i t e m . q u a l i t y < 5 0 i t e m . q u a l i t y + = 1 e n d e n d e n d e n d e n d i f i t e m . n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " i t e m . s e l l _ i n - = 1 e n d # . . . c o n t i n u e d . . . e n d
  46. Constraint The I t e m class and @ i

    t e m s property are off limits - no collective code ownership
  47. c l a s s G i l d e

    d R o s e d e f u p d a t e _ q u a l i t y @ i t e m s . e a c h d o | i t e m | u p d a t e ( i t e m ) e n d e n d d e f u p d a t e ( i t e m ) # . . . 4 3 l i n e s u s i n g i t e m . . . e n d e n d
  48. r e q u i r e ' d e

    l e g a t e ' c l a s s I t e m W r a p p e r < S i m p l e D e l e g a t o r e n d c l a s s G i l d e d R o s e d e f u p d a t e _ q u a l i t y @ i t e m s . e a c h d o | i t e m | u p d a t e ( I t e m W r a p p e r . n e w ( i t e m ) ) e n d e n d d e f u p d a t e ( i t e m ) # . . . 4 3 l i n e s u s i n g i t e m . . . e n d e n d
  49. c l a s s I t e m W

    r a p p e r < S i m p l e D e l e g a t o r d e f u p d a t e i t e m = s e l f # . . . 4 3 l i n e s u s i n g i t e m . . . e n d e n d c l a s s G i l d e d R o s e d e f u p d a t e _ q u a l i t y @ i t e m s . e a c h d o | i t e m | u p d a t e ( I t e m W r a p p e r . n e w ( i t e m ) ) e n d e n d d e f u p d a t e ( i t e m ) i t e m . u p d a t e e n d e n d
  50. c l a s s I t e m W

    r a p p e r < S i m p l e D e l e g a t o r d e f u p d a t e i t e m = s e l f # . . . 4 3 l i n e s u s i n g i t e m . . . e n d e n d c l a s s G i l d e d R o s e d e f u p d a t e _ q u a l i t y @ i t e m s . e a c h d o | i t e m | I t e m W r a p p e r . n e w ( i t e m ) . u p d a t e e n d e n d e n d
  51. d e f u p d a t e i

    t e m = s e l f i f i t e m . n a m e ! = " A g e d B r i e " & & i t e m . n a m e ! = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i f i t e m . q u a l i t y > 0 i f i t e m . n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " i t e m . q u a l i t y - = 1 e n d e n d e l s e i f i t e m . q u a l i t y < 5 0 i t e m . q u a l i t y + = 1 i f i t e m . n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i f i t e m . s e l l _ i n < 1 1 i f i t e m . q u a l i t y < 5 0 i t e m . q u a l i t y + = 1 e n d e n d i f i t e m . s e l l _ i n < 6 i f i t e m . q u a l i t y < 5 0 i t e m . q u a l i t y + = 1 e n d e n d e n d e n d e n d i f i t e m . n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " i t e m . s e l l _ i n - = 1 e n d # . . . c o n t i n u e d . . . e n d
  52. d e f u p d a t e i

    f s e l f . n a m e ! = " A g e d B r i e " & & s e l f . n a m e ! = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i f s e l f . q u a l i t y > 0 i f s e l f . n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " s e l f . q u a l i t y - = 1 e n d e n d e l s e i f s e l f . q u a l i t y < 5 0 s e l f . q u a l i t y + = 1 i f s e l f . n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i f s e l f . s e l l _ i n < 1 1 i f s e l f . q u a l i t y < 5 0 s e l f . q u a l i t y + = 1 e n d e n d i f s e l f . s e l l _ i n < 6 i f s e l f . q u a l i t y < 5 0 s e l f . q u a l i t y + = 1 e n d e n d e n d e n d e n d i f s e l f . n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " s e l f . s e l l _ i n - = 1 e n d # . . . c o n t i n u e d . . . e n d
  53. d e f u p d a t e i

    f n a m e ! = " A g e d B r i e " & & n a m e ! = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i f q u a l i t y > 0 i f n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " s e l f . q u a l i t y - = 1 e n d e n d e l s e i f q u a l i t y < 5 0 s e l f . q u a l i t y + = 1 i f n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i f s e l l _ i n < 1 1 i f q u a l i t y < 5 0 s e l f . q u a l i t y + = 1 e n d e n d i f s e l l _ i n < 6 i f q u a l i t y < 5 0 s e l f . q u a l i t y + = 1 e n d e n d e n d e n d e n d i f n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " s e l f . s e l l _ i n - = 1 e n d # . . . c o n t i n u e d . . . e n d
  54. Conjured Items Are we there yet?

  55. d e f u p d a t e i

    f n a m e ! = " A g e d B r i e " & & n a m e ! = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i f q u a l i t y > 0 i f n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " s e l f . q u a l i t y - = 1 e n d e n d e l s e i f q u a l i t y < 5 0 s e l f . q u a l i t y + = 1 i f n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i f s e l l _ i n < 1 1 i f q u a l i t y < 5 0 s e l f . q u a l i t y + = 1 e n d e n d i f s e l l _ i n < 6 i f q u a l i t y < 5 0 s e l f . q u a l i t y + = 1 e n d e n d e n d e n d e n d i f n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " s e l f . s e l l _ i n - = 1 e n d # . . . c o n t i n u e d . . . e n d
  56. Remove Duplication

  57. d e f u p d a t e i

    f # . . . # . . . e l s e i f q u a l i t y < 5 0 s e l f . q u a l i t y + = 1 i f # . . . i f # . . . i f q u a l i t y < 5 0 s e l f . q u a l i t y + = 1 e n d e n d i f # . . . i f q u a l i t y < 5 0 s e l f . q u a l i t y + = 1 e n d e n d e n d e n d e n d # . . . i f # . . . i f # . . . # . . . e l s e i f q u a l i t y < 5 0 s e l f . q u a l i t y + = 1 e n d e n d e n d e n d
  58. d e f u p d a t e i

    f # . . . # . . . e l s e i f q u a l i t y < 5 0 s e l f . q u a l i t y + = 1 i f # . . . i f # . . . i n c r e a s e _ q u a l i t y e n d i f # . . . i n c r e a s e _ q u a l i t y e n d e n d e n d e n d # . . . i f # . . . i f # . . . # . . . e l s e i n c r e a s e _ q u a l i t y e n d e n d e n d d e f i n c r e a s e _ q u a l i t y i f q u a l i t y < 5 0 s e l f . q u a l i t y + = 1 e n d e n d
  59. d e f u p d a t e i

    f # . . . # . . . e l s e i f q u a l i t y < 5 0 s e l f . q u a l i t y + = 1 i f n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i f s e l l _ i n < 1 1 i n c r e a s e _ q u a l i t y e n d i f s e l l _ i n < 6 i n c r e a s e _ q u a l i t y e n d e n d e n d e n d # . . . e n d d e f i n c r e a s e _ q u a l i t y i f q u a l i t y < 5 0 s e l f . q u a l i t y + = 1 e n d e n d
  60. d e f u p d a t e i

    f # . . . # . . . e l s e i f q u a l i t y < 5 0 s e l f . q u a l i t y + = 1 e n d i f n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i f s e l l _ i n < 1 1 i n c r e a s e _ q u a l i t y e n d i f s e l l _ i n < 6 i n c r e a s e _ q u a l i t y e n d e n d e n d # . . . e n d d e f i n c r e a s e _ q u a l i t y i f q u a l i t y < 5 0 s e l f . q u a l i t y + = 1 e n d e n d
  61. d e f u p d a t e i

    f # . . . # . . . e l s e i n c r e a s e _ q u a l i t y i f n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i f s e l l _ i n < 1 1 i n c r e a s e _ q u a l i t y e n d i f s e l l _ i n < 6 i n c r e a s e _ q u a l i t y e n d e n d e n d # . . . e n d d e f i n c r e a s e _ q u a l i t y i f q u a l i t y < 5 0 s e l f . q u a l i t y + = 1 e n d e n d
  62. d e f u p d a t e i

    f # . . . i f q u a l i t y > 0 i f n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " s e l f . q u a l i t y - = 1 e n d e n d e l s e # . . . e n d # . . . i f # . . . i f # . . . i f # . . . i f q u a l i t y > 0 i f n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " s e l f . q u a l i t y - = 1 e n d e n d e l s e # . . . e n d e l s e # . . . e n d e n d e n d
  63. d e f u p d a t e i

    f # . . . i f n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " i f q u a l i t y > 0 s e l f . q u a l i t y - = 1 e n d e n d e l s e # . . . e n d # . . . i f # . . . i f # . . . i f # . . . i f n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " i f q u a l i t y > 0 s e l f . q u a l i t y - = 1 e n d e n d e l s e # . . . e n d e l s e # . . . e n d e n d e n d
  64. d e f u p d a t e i

    f # . . . i f n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " d e c r e a s e _ q u a l i t y e n d e l s e # . . . e n d # . . . i f # . . . i f # . . . i f # . . . i f n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " d e c r e a s e _ q u a l i t y e n d e l s e # . . . e n d e l s e # . . . e n d e n d e n d d e f d e c r e a s e _ q u a l i t y i f q u a l i t y > 0 s e l f . q u a l i t y - = 1 e n d e n d
  65. Conjured Items Are we there yet?

  66. d e f u p d a t e i

    f n a m e ! = " A g e d B r i e " & & n a m e ! = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i f n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " d e c r e a s e _ q u a l i t y e n d e l s e i n c r e a s e _ q u a l i t y i f n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i f s e l l _ i n < 1 1 i n c r e a s e _ q u a l i t y e n d i f s e l l _ i n < 6 i n c r e a s e _ q u a l i t y e n d e n d e n d i f n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " s e l f . s e l l _ i n - = 1 e n d i f s e l l _ i n < 0 i f n a m e ! = " A g e d B r i e " i f n a m e ! = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i f n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " d e c r e a s e _ q u a l i t y e n d e l s e s e l f . q u a l i t y - = q u a l i t y e n d e l s e i n c r e a s e _ q u a l i t y e n d e n d e n d
  67. Group Similar Tasks

  68. d e f u p d a t e i

    f n a m e ! = " A g e d B r i e " & & n a m e ! = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i f n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " d e c r e a s e _ q u a l i t y e n d e l s e i n c r e a s e _ q u a l i t y i f n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i f s e l l _ i n < 1 1 i n c r e a s e _ q u a l i t y e n d i f s e l l _ i n < 6 i n c r e a s e _ q u a l i t y e n d e n d e n d i f n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " s e l f . s e l l _ i n - = 1 e n d i f s e l l _ i n < 0 i f n a m e ! = " A g e d B r i e " i f n a m e ! = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i f n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " d e c r e a s e _ q u a l i t y e n d e l s e s e l f . q u a l i t y - = q u a l i t y e n d e l s e i n c r e a s e _ q u a l i t y e n d e n d e n d
  69. d e f u p d a t e i

    f # . . . # . . . e l s e # . . . i f n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i f s e l l _ i n < 1 1 i n c r e a s e _ q u a l i t y e n d i f s e l l _ i n < 6 i n c r e a s e _ q u a l i t y e n d e n d e n d i f n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " s e l f . s e l l _ i n - = 1 e n d i f s e l l _ i n < 0 # . . . e n d e n d
  70. d e f u p d a t e i

    f n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " s e l f . s e l l _ i n - = 1 e n d i f # . . . # . . . e l s e # . . . i f n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i f s e l l _ i n < 1 0 i n c r e a s e _ q u a l i t y e n d i f s e l l _ i n < 5 i n c r e a s e _ q u a l i t y e n d e n d e n d i f s e l l _ i n < 0 # . . . e n d e n d
  71. d e f u p d a t e i

    f n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " s e l f . s e l l _ i n - = 1 e n d i f n a m e ! = " A g e d B r i e " & & n a m e ! = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i f n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " d e c r e a s e _ q u a l i t y e n d e l s e i n c r e a s e _ q u a l i t y i f n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i f s e l l _ i n < 1 0 i n c r e a s e _ q u a l i t y e n d i f s e l l _ i n < 5 i n c r e a s e _ q u a l i t y e n d e n d e n d i f s e l l _ i n < 0 i f n a m e ! = " A g e d B r i e " i f n a m e ! = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i f n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " d e c r e a s e _ q u a l i t y e n d e l s e s e l f . q u a l i t y - = q u a l i t y e n d e l s e i n c r e a s e _ q u a l i t y e n d e n d e n d
  72. d e f u p d a t e a

    g e i f n a m e ! = " A g e d B r i e " & & n a m e ! = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i f n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " d e c r e a s e _ q u a l i t y e n d e l s e i n c r e a s e _ q u a l i t y i f n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i f s e l l _ i n < 1 0 i n c r e a s e _ q u a l i t y e n d i f s e l l _ i n < 5 i n c r e a s e _ q u a l i t y e n d e n d e n d i f s e l l _ i n < 0 i f n a m e ! = " A g e d B r i e " i f n a m e ! = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i f n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " d e c r e a s e _ q u a l i t y e n d e l s e s e l f . q u a l i t y - = q u a l i t y e n d e l s e i n c r e a s e _ q u a l i t y e n d e n d e n d d e f a g e i f n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " s e l f . s e l l _ i n - = 1 e n d e n d
  73. d e f u p d a t e a

    g e u p d a t e _ q u a l i t y e n d d e f u p d a t e _ q u a l i t y i f n a m e ! = " A g e d B r i e " & & n a m e ! = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i f n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " d e c r e a s e _ q u a l i t y e n d e l s e i n c r e a s e _ q u a l i t y i f n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i f s e l l _ i n < 1 0 i n c r e a s e _ q u a l i t y e n d i f s e l l _ i n < 5 i n c r e a s e _ q u a l i t y e n d e n d e n d i f s e l l _ i n < 0 i f n a m e ! = " A g e d B r i e " i f n a m e ! = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i f n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " d e c r e a s e _ q u a l i t y e n d e l s e s e l f . q u a l i t y - = q u a l i t y e n d e l s e i n c r e a s e _ q u a l i t y e n d e n d e n d
  74. Conjured Items Are we there yet?

  75. d e f u p d a t e _

    q u a l i t y i f n a m e ! = " A g e d B r i e " & & n a m e ! = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i f n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " d e c r e a s e _ q u a l i t y e n d e l s e i n c r e a s e _ q u a l i t y i f n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i f s e l l _ i n < 1 0 i n c r e a s e _ q u a l i t y e n d i f s e l l _ i n < 5 i n c r e a s e _ q u a l i t y e n d e n d e n d i f s e l l _ i n < 0 i f n a m e ! = " A g e d B r i e " i f n a m e ! = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i f n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " d e c r e a s e _ q u a l i t y e n d e l s e s e l f . q u a l i t y - = q u a l i t y e n d e l s e i n c r e a s e _ q u a l i t y e n d e n d e n d
  76. Simplify Conditionals

  77. d e f u p d a t e _

    q u a l i t y i f n a m e ! = " A g e d B r i e " & & n a m e ! = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i f n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " d e c r e a s e _ q u a l i t y e n d e l s e i n c r e a s e _ q u a l i t y i f n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i f s e l l _ i n < 1 0 i n c r e a s e _ q u a l i t y e n d i f s e l l _ i n < 5 i n c r e a s e _ q u a l i t y e n d e n d e n d i f s e l l _ i n < 0 i f n a m e ! = " A g e d B r i e " i f n a m e ! = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i f n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " d e c r e a s e _ q u a l i t y e n d e l s e s e l f . q u a l i t y - = q u a l i t y e n d e l s e i n c r e a s e _ q u a l i t y e n d e n d e n d
  78. i f n a m e ! = " B

    a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i f n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " d e c r e a s e _ q u a l i t y e n d e l s e s e l f . q u a l i t y - = q u a l i t y e n d
  79. i f n a m e = = " B

    a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " s e l f . q u a l i t y - = q u a l i t y e l s e i f n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " d e c r e a s e _ q u a l i t y e n d e n d
  80. i f n a m e ! = " A

    g e d B r i e " i f n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " s e l f . q u a l i t y - = q u a l i t y e l s e i f n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " d e c r e a s e _ q u a l i t y e n d e n d e l s e i n c r e a s e _ q u a l i t y e n d
  81. i f n a m e = = " A

    g e d B r i e " i n c r e a s e _ q u a l i t y e l s e i f n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " s e l f . q u a l i t y - = q u a l i t y e l s e i f n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " d e c r e a s e _ q u a l i t y e n d e n d e n d
  82. i f n a m e ! = " A

    g e d B r i e " & & n a m e ! = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i f n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " d e c r e a s e _ q u a l i t y e n d e l s e i n c r e a s e _ q u a l i t y i f n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i f s e l l _ i n < 1 0 i n c r e a s e _ q u a l i t y e n d i f s e l l _ i n < 5 i n c r e a s e _ q u a l i t y e n d e n d e n d
  83. DeMorgan's Laws not (A and B) ==> (not A) or

    (not B) not (A or B) ==> (not A) and (not B)
  84. n a m e ! = " A g e

    d B r i e " & & n a m e ! = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t "
  85. n a m e ! = " A g e

    d B r i e " & & n a m e ! = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " # N e g a t e : ! ( n a m e ! = " A g e d B r i e " & & n a m e ! = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " )
  86. n a m e ! = " A g e

    d B r i e " & & n a m e ! = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " # N e g a t e : ! ( n a m e ! = " A g e d B r i e " & & n a m e ! = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " ) # D e M o r g a n : n o t ( A a n d B ) = = > ( n o t A ) o r ( n o t B ) ! ( n a m e ! = " A g e d B r i e " ) | | ! ( n a m e ! = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " )
  87. n a m e ! = " A g e

    d B r i e " & & n a m e ! = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " # N e g a t e : ! ( n a m e ! = " A g e d B r i e " & & n a m e ! = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " ) # D e M o r g a n : n o t ( A a n d B ) = = > ( n o t A ) o r ( n o t B ) ! ( n a m e ! = " A g e d B r i e " ) | | ! ( n a m e ! = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " ) # S i m p l i f y : n a m e = = " A g e d B r i e " | | n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t "
  88. i f n a m e ! = " A

    g e d B r i e " & & n a m e ! = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i f n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " d e c r e a s e _ q u a l i t y e n d e l s e i n c r e a s e _ q u a l i t y i f n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i f s e l l _ i n < 1 0 i n c r e a s e _ q u a l i t y e n d i f s e l l _ i n < 5 i n c r e a s e _ q u a l i t y e n d e n d e n d
  89. i f n a m e = = " A

    g e d B r i e " | | n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i n c r e a s e _ q u a l i t y i f n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i f s e l l _ i n < 1 0 i n c r e a s e _ q u a l i t y e n d i f s e l l _ i n < 5 i n c r e a s e _ q u a l i t y e n d e n d e l s e i f n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " d e c r e a s e _ q u a l i t y e n d e n d
  90. d e f u p d a t e _

    q u a l i t y i f # . . . # . . . e l s e i f # . . . # . . . e n d e n d i f # . . . i f # . . . # . . . e l s e i f # . . . # . . . e l s e i f # . . . # . . . e n d e n d e n d e n d e n d
  91. d e f u p d a t e _

    q u a l i t y i f # . . . # . . . e l s i f # . . . # . . . e n d i f # . . . i f # . . . # . . . e l s i f # . . . # . . . e l s i f # . . . # . . . e n d e n d e n d
  92. d e f u p d a t e _

    q u a l i t y i f n a m e = = " A g e d B r i e " | | n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i n c r e a s e _ q u a l i t y i f n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i f s e l l _ i n < 1 0 i n c r e a s e _ q u a l i t y e n d i f s e l l _ i n < 5 i n c r e a s e _ q u a l i t y e n d e n d e l s i f n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " d e c r e a s e _ q u a l i t y e n d i f s e l l _ i n < 0 i f n a m e = = " A g e d B r i e " i n c r e a s e _ q u a l i t y e l s i f n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " s e l f . q u a l i t y - = q u a l i t y e l s i f n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " d e c r e a s e _ q u a l i t y e n d e n d e n d
  93. d e f u p d a t e _

    q u a l i t y i f # . . . # . . . e l s i f n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " d e c r e a s e _ q u a l i t y e n d i f # . . . i f # . . . # . . . e l s i f n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " d e c r e a s e _ q u a l i t y e n d e n d e n d
  94. d e f u p d a t e _

    q u a l i t y r e t u r n i f n a m e = = " S u l f u r a s , H a n d o f R a g n a r o s " i f # . . . # . . . e l s e d e c r e a s e _ q u a l i t y e n d i f # . . . i f # . . . # . . . e l s e d e c r e a s e _ q u a l i t y e n d e n d e n d
  95. d e f u p d a t e a

    g e u p d a t e _ q u a l i t y e n d d e f a g e i f n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " s e l f . s e l l _ i n - = 1 e n d e n d d e f u p d a t e _ q u a l i t y r e t u r n i f n a m e = = " S u l f u r a s , H a n d o f R a g n a r o s " # . . . 2 2 l i n e s . . . e n d
  96. d e f u p d a t e a

    g e u p d a t e _ q u a l i t y e n d d e f a g e r e t u r n i f n a m e = = " S u l f u r a s , H a n d o f R a g n a r o s " s e l f . s e l l _ i n - = 1 e n d d e f u p d a t e _ q u a l i t y r e t u r n i f n a m e = = " S u l f u r a s , H a n d o f R a g n a r o s " # . . . 2 2 l i n e s . . . e n d
  97. d e f u p d a t e r

    e t u r n i f n a m e = = " S u l f u r a s , H a n d o f R a g n a r o s " a g e u p d a t e _ q u a l i t y e n d d e f a g e s e l f . s e l l _ i n - = 1 e n d d e f u p d a t e _ q u a l i t y # . . . 2 2 l i n e s . . . e n d
  98. d e f u p d a t e _

    q u a l i t y i f n a m e = = " A g e d B r i e " | | n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i n c r e a s e _ q u a l i t y i f n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i f s e l l _ i n < 1 0 i n c r e a s e _ q u a l i t y e n d i f s e l l _ i n < 5 i n c r e a s e _ q u a l i t y e n d e n d e l s e d e c r e a s e _ q u a l i t y e n d i f s e l l _ i n < 0 i f n a m e = = " A g e d B r i e " i n c r e a s e _ q u a l i t y e l s i f n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " s e l f . q u a l i t y - = q u a l i t y e l s e d e c r e a s e _ q u a l i t y e n d e n d e n d
  99. d e f u p d a t e _

    q u a l i t y i f n a m e = = " A g e d B r i e " i n c r e a s e _ q u a l i t y e l s i f n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i n c r e a s e _ q u a l i t y i f s e l l _ i n < 1 0 i n c r e a s e _ q u a l i t y e n d i f s e l l _ i n < 5 i n c r e a s e _ q u a l i t y e n d e l s e d e c r e a s e _ q u a l i t y e n d i f s e l l _ i n < 0 i f n a m e = = " A g e d B r i e " i n c r e a s e _ q u a l i t y e l s i f n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " s e l f . q u a l i t y - = q u a l i t y e l s e d e c r e a s e _ q u a l i t y e n d e n d e n d
  100. d e f u p d a t e _

    q u a l i t y i f n a m e = = " A g e d B r i e " i n c r e a s e _ q u a l i t y e l s i f n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i n c r e a s e _ q u a l i t y i f s e l l _ i n < 1 0 i n c r e a s e _ q u a l i t y e n d i f s e l l _ i n < 5 i n c r e a s e _ q u a l i t y e n d e l s e d e c r e a s e _ q u a l i t y i f s e l l _ i n < 0 d e c r e a s e _ q u a l i t y e n d e n d i f s e l l _ i n < 0 i f n a m e = = " A g e d B r i e " i n c r e a s e _ q u a l i t y e l s i f n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " s e l f . q u a l i t y - = q u a l i t y e n d e n d e n d
  101. d e f u p d a t e _

    q u a l i t y i f n a m e = = " A g e d B r i e " i n c r e a s e _ q u a l i t y e l s i f n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i n c r e a s e _ q u a l i t y i f s e l l _ i n < 1 0 i n c r e a s e _ q u a l i t y e n d i f s e l l _ i n < 5 i n c r e a s e _ q u a l i t y e n d i f s e l l _ i n < 0 s e l f . q u a l i t y - = q u a l i t y e n d e l s e d e c r e a s e _ q u a l i t y i f s e l l _ i n < 0 d e c r e a s e _ q u a l i t y e n d e n d i f s e l l _ i n < 0 i f n a m e = = " A g e d B r i e " i n c r e a s e _ q u a l i t y e n d e n d e n d
  102. d e f u p d a t e _

    q u a l i t y i f n a m e = = " A g e d B r i e " i n c r e a s e _ q u a l i t y i f s e l l _ i n < 0 i n c r e a s e _ q u a l i t y e n d e l s i f n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i n c r e a s e _ q u a l i t y i f s e l l _ i n < 1 0 i n c r e a s e _ q u a l i t y e n d i f s e l l _ i n < 5 i n c r e a s e _ q u a l i t y e n d i f s e l l _ i n < 0 s e l f . q u a l i t y - = q u a l i t y e n d e l s e d e c r e a s e _ q u a l i t y i f s e l l _ i n < 0 d e c r e a s e _ q u a l i t y e n d e n d e n d
  103. Conjured Items Are we there yet?

  104. d e f u p d a t e _

    q u a l i t y i f n a m e = = " A g e d B r i e " i n c r e a s e _ q u a l i t y i f s e l l _ i n < 0 i n c r e a s e _ q u a l i t y e n d e l s i f n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i n c r e a s e _ q u a l i t y i f s e l l _ i n < 1 0 i n c r e a s e _ q u a l i t y e n d i f s e l l _ i n < 5 i n c r e a s e _ q u a l i t y e n d i f s e l l _ i n < 0 s e l f . q u a l i t y - = q u a l i t y e n d e l s e d e c r e a s e _ q u a l i t y i f s e l l _ i n < 0 d e c r e a s e _ q u a l i t y e n d e n d e n d
  105. Yes!

  106. Make the Easy Change

  107. d e f u p d a t e _

    q u a l i t y i f n a m e = = " A g e d B r i e " i n c r e a s e _ q u a l i t y i f s e l l _ i n < 0 i n c r e a s e _ q u a l i t y e n d e l s i f n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i n c r e a s e _ q u a l i t y i f s e l l _ i n < 1 0 i n c r e a s e _ q u a l i t y e n d i f s e l l _ i n < 5 i n c r e a s e _ q u a l i t y e n d i f s e l l _ i n < 0 s e l f . q u a l i t y - = q u a l i t y e n d e l s e d e c r e a s e _ q u a l i t y i f s e l l _ i n < 0 d e c r e a s e _ q u a l i t y e n d e n d e n d
  108. Our Task Support Conjured items Conjured items degrade in quality

    twice as fast as normal items.
  109. d e f u p d a t e _

    q u a l i t y i f n a m e = = " A g e d B r i e " i n c r e a s e _ q u a l i t y i f s e l l _ i n < 0 i n c r e a s e _ q u a l i t y e n d e l s i f n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i n c r e a s e _ q u a l i t y i f s e l l _ i n < 1 0 i n c r e a s e _ q u a l i t y e n d i f s e l l _ i n < 5 i n c r e a s e _ q u a l i t y e n d i f s e l l _ i n < 0 s e l f . q u a l i t y - = q u a l i t y e n d e l s e d e c r e a s e _ q u a l i t y i f s e l l _ i n < 0 d e c r e a s e _ q u a l i t y e n d e n d e n d
  110. d e f u p d a t e _

    q u a l i t y i f n a m e = = " A g e d B r i e " i n c r e a s e _ q u a l i t y i f s e l l _ i n < 0 i n c r e a s e _ q u a l i t y e n d e l s i f n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i n c r e a s e _ q u a l i t y i f s e l l _ i n < 1 0 i n c r e a s e _ q u a l i t y e n d i f s e l l _ i n < 5 i n c r e a s e _ q u a l i t y e n d i f s e l l _ i n < 0 s e l f . q u a l i t y - = q u a l i t y e n d e l s i f n a m e = = " C o n j u r e d M a n a C a k e " d e c r e a s e _ q u a l i t y d e c r e a s e _ q u a l i t y i f s e l l _ i n < 0 d e c r e a s e _ q u a l i t y d e c r e a s e _ q u a l i t y e n d e l s e d e c r e a s e _ q u a l i t y i f s e l l _ i n < 0 d e c r e a s e _ q u a l i t y e n d e n d e n d
  111. d e f u p d a t e _

    q u a l i t y i f n a m e = = " A g e d B r i e " i n c r e a s e _ q u a l i t y i f s e l l _ i n < 0 i n c r e a s e _ q u a l i t y e n d e l s i f n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i n c r e a s e _ q u a l i t y i f s e l l _ i n < 1 0 i n c r e a s e _ q u a l i t y e n d i f s e l l _ i n < 5 i n c r e a s e _ q u a l i t y e n d i f s e l l _ i n < 0 s e l f . q u a l i t y - = q u a l i t y e n d e l s i f n a m e = = " C o n j u r e d M a n a C a k e " s e l f . q u a l i t y - = 2 # F a i l s t e s t s - w e c a n ' t d o t h i s i f s e l l _ i n < 0 s e l f . q u a l i t y - = 2 # F a i l s t e s t s - w e c a n ' t d o t h i s e n d e l s e d e c r e a s e _ q u a l i t y i f s e l l _ i n < 0 d e c r e a s e _ q u a l i t y e n d e n d e n d
  112. d e f u p d a t e _

    q u a l i t y i f n a m e = = " A g e d B r i e " i n c r e a s e _ q u a l i t y i f s e l l _ i n < 0 i n c r e a s e _ q u a l i t y e n d e l s i f n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i n c r e a s e _ q u a l i t y i f s e l l _ i n < 1 0 i n c r e a s e _ q u a l i t y e n d i f s e l l _ i n < 5 i n c r e a s e _ q u a l i t y e n d i f s e l l _ i n < 0 s e l f . q u a l i t y - = q u a l i t y e n d e l s i f n a m e = = " C o n j u r e d M a n a C a k e " d e c r e a s e _ q u a l i t y d e c r e a s e _ q u a l i t y i f s e l l _ i n < 0 d e c r e a s e _ q u a l i t y d e c r e a s e _ q u a l i t y e n d e l s e d e c r e a s e _ q u a l i t y i f s e l l _ i n < 0 d e c r e a s e _ q u a l i t y e n d e n d e n d
  113. Express Important Ideas

  114. c l a s s I t e m W

    r a p p e r d e f d e c r e a s e _ q u a l i t y i f q u a l i t y > 0 s e l f . q u a l i t y - = 1 e n d e n d d e f i n c r e a s e _ q u a l i t y i f q u a l i t y < 5 0 s e l f . q u a l i t y + = 1 e n d e n d e n d
  115. The Spec ... The quality of an item is never

    negative ... The quality of an item is never more than 50 ...
  116. c l a s s I t e m W

    r a p p e r d e f d e c r e a s e _ q u a l i t y i f q u a l i t y > 0 s e l f . q u a l i t y - = 1 e n d e n d d e f i n c r e a s e _ q u a l i t y i f q u a l i t y < 5 0 s e l f . q u a l i t y + = 1 e n d e n d e n d
  117. c l a s s I t e m W

    r a p p e r d e f d e c r e a s e _ q u a l i t y i f q u a l i t y > 0 s e l f . q u a l i t y - = 1 e n d e n d d e f i n c r e a s e _ q u a l i t y i f q u a l i t y < 5 0 s e l f . q u a l i t y + = 1 e n d e n d d e f q u a l i t y = ( n e w _ q u a l i t y ) s u p e r e n d e n d
  118. c l a s s I t e m W

    r a p p e r d e f d e c r e a s e _ q u a l i t y s e l f . q u a l i t y - = 1 e n d d e f i n c r e a s e _ q u a l i t y i f q u a l i t y < 5 0 s e l f . q u a l i t y + = 1 e n d e n d d e f q u a l i t y = ( n e w _ q u a l i t y ) n e w _ q u a l i t y = 0 i f n e w _ q u a l i t y < 0 s u p e r ( n e w _ q u a l i t y ) e n d e n d
  119. c l a s s I t e m W

    r a p p e r d e f d e c r e a s e _ q u a l i t y s e l f . q u a l i t y - = 1 e n d d e f i n c r e a s e _ q u a l i t y s e l f . q u a l i t y + = 1 e n d d e f q u a l i t y = ( n e w _ q u a l i t y ) n e w _ q u a l i t y = 0 i f n e w _ q u a l i t y < 0 n e w _ q u a l i t y = 5 0 i f n e w _ q u a l i t y > 5 0 s u p e r ( n e w _ q u a l i t y ) e n d e n d
  120. d e f u p d a t e _

    q u a l i t y i f n a m e = = " A g e d B r i e " i n c r e a s e _ q u a l i t y i f s e l l _ i n < 0 i n c r e a s e _ q u a l i t y e n d e l s i f n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i n c r e a s e _ q u a l i t y i f s e l l _ i n < 1 0 i n c r e a s e _ q u a l i t y e n d i f s e l l _ i n < 5 i n c r e a s e _ q u a l i t y e n d i f s e l l _ i n < 0 s e l f . q u a l i t y - = q u a l i t y e n d e l s i f n a m e = = " C o n j u r e d M a n a C a k e " d e c r e a s e _ q u a l i t y d e c r e a s e _ q u a l i t y i f s e l l _ i n < 0 d e c r e a s e _ q u a l i t y d e c r e a s e _ q u a l i t y e n d e l s e d e c r e a s e _ q u a l i t y i f s e l l _ i n < 0 d e c r e a s e _ q u a l i t y e n d e n d e n d d e f d e c r e a s e _ q u a l i t y s e l f . q u a l i t y - = 1 e n d
  121. d e f u p d a t e _

    q u a l i t y i f n a m e = = " A g e d B r i e " i n c r e a s e _ q u a l i t y i f s e l l _ i n < 0 i n c r e a s e _ q u a l i t y e n d e l s i f n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " i n c r e a s e _ q u a l i t y i f s e l l _ i n < 1 0 i n c r e a s e _ q u a l i t y e n d i f s e l l _ i n < 5 i n c r e a s e _ q u a l i t y e n d i f s e l l _ i n < 0 s e l f . q u a l i t y - = q u a l i t y e n d e l s i f n a m e = = " C o n j u r e d M a n a C a k e " s e l f . q u a l i t y - = 1 s e l f . q u a l i t y - = 1 i f s e l l _ i n < 0 s e l f . q u a l i t y - = 1 s e l f . q u a l i t y - = 1 e n d e l s e s e l f . q u a l i t y - = 1 i f s e l l _ i n < 0 s e l f . q u a l i t y - = 1 e n d e n d e n d d e f i n c r e a s e _ q u a l i t y s e l f . q u a l i t y + = 1 e n d
  122. d e f u p d a t e _

    q u a l i t y i f n a m e = = " A g e d B r i e " s e l f . q u a l i t y + = 1 i f s e l l _ i n < 0 s e l f . q u a l i t y + = 1 e n d e l s i f n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " s e l f . q u a l i t y + = 1 i f s e l l _ i n < 1 0 s e l f . q u a l i t y + = 1 e n d i f s e l l _ i n < 5 s e l f . q u a l i t y + = 1 e n d i f s e l l _ i n < 0 s e l f . q u a l i t y - = q u a l i t y e n d e l s i f n a m e = = " C o n j u r e d M a n a C a k e " s e l f . q u a l i t y - = 1 s e l f . q u a l i t y - = 1 i f s e l l _ i n < 0 s e l f . q u a l i t y - = 1 s e l f . q u a l i t y - = 1 e n d e l s e s e l f . q u a l i t y - = 1 i f s e l l _ i n < 0 s e l f . q u a l i t y - = 1 e n d e n d e n d
  123. d e f u p d a t e _

    q u a l i t y i f n a m e = = " A g e d B r i e " s e l f . q u a l i t y + = 1 i f s e l l _ i n < 0 s e l f . q u a l i t y + = 1 e n d e l s i f n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " s e l f . q u a l i t y + = 1 i f s e l l _ i n < 1 0 s e l f . q u a l i t y + = 1 e n d i f s e l l _ i n < 5 s e l f . q u a l i t y + = 1 e n d i f s e l l _ i n < 0 s e l f . q u a l i t y - = q u a l i t y e n d e l s i f n a m e = = " C o n j u r e d M a n a C a k e " s e l f . q u a l i t y - = 2 i f s e l l _ i n < 0 s e l f . q u a l i t y - = 2 e n d e l s e s e l f . q u a l i t y - = 1 i f s e l l _ i n < 0 s e l f . q u a l i t y - = 1 e n d e n d e n d
  124. d e f u p d a t e _

    q u a l i t y s e l f . q u a l i t y + = q u a l i t y _ a d j u s t m e n t e n d d e f q u a l i t y _ a d j u s t m e n t i f n a m e = = " A g e d B r i e " a d j u s t m e n t = 1 i f s e l l _ i n < 0 a d j u s t m e n t = 2 e n d e l s i f n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " a d j u s t m e n t = 1 i f s e l l _ i n < 1 0 a d j u s t m e n t = 2 e n d i f s e l l _ i n < 5 a d j u s t m e n t = 3 e n d i f s e l l _ i n < 0 a d j u s t m e n t = - q u a l i t y e n d e l s i f n a m e = = " C o n j u r e d M a n a C a k e " a d j u s t m e n t = - 2 i f s e l l _ i n < 0 a d j u s t m e n t = - 4 e n d e l s e a d j u s t m e n t = - 1 i f s e l l _ i n < 0 a d j u s t m e n t = - 2 e n d e n d a d j u s t m e n t e n d
  125. Replace Conditional With Polymorphism

  126. c l a s s I t e m W

    r a p p e r < S i m p l e D e l e g a t o r # . . . e n d c l a s s G i l d e d R o s e d e f u p d a t e _ q u a l i t y @ i t e m s . e a c h d o | i t e m | I t e m W r a p p e r . n e w ( i t e m ) . u p d a t e e n d e n d e n d
  127. c l a s s I t e m W

    r a p p e r < S i m p l e D e l e g a t o r d e f s e l f . w r a p ( i t e m ) n e w ( i t e m ) e n d # . . . e n d c l a s s G i l d e d R o s e d e f u p d a t e _ q u a l i t y @ i t e m s . e a c h d o | i t e m | I t e m W r a p p e r . w r a p ( i t e m ) . u p d a t e e n d e n d e n d
  128. c l a s s I t e m W

    r a p p e r d e f s e l f . w r a p ( i t e m ) n e w ( i t e m ) e n d d e f q u a l i t y _ a d j u s t m e n t i f n a m e = = " A g e d B r i e " a d j u s t m e n t = 1 i f s e l l _ i n < 0 a d j u s t m e n t = 2 e n d e l s i f n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " # . . . e l s i f n a m e = = " C o n j u r e d M a n a C a k e " # . . . e l s e # . . . e n d a d j u s t m e n t e n d e n d
  129. c l a s s I t e m W

    r a p p e r d e f s e l f . w r a p ( i t e m ) i f i t e m . n a m e = = " A g e d B r i e " A g e d B r i e . n e w ( i t e m ) e l s e n e w ( i t e m ) e n d e n d d e f q u a l i t y _ a d j u s t m e n t i f n a m e = = " A g e d B r i e " a d j u s t m e n t = 1 i f s e l l _ i n < 0 a d j u s t m e n t = 2 e n d e l s i f n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " # . . . e l s i f n a m e = = " C o n j u r e d M a n a C a k e " # . . . e l s e # . . . e n d a d j u s t m e n t e n d e n d c l a s s A g e d B r i e < I t e m W r a p p e r e n d
  130. c l a s s I t e m W

    r a p p e r d e f s e l f . w r a p ( i t e m ) i f i t e m . n a m e = = " A g e d B r i e " A g e d B r i e . n e w ( i t e m ) e l s e n e w ( i t e m ) e n d e n d d e f q u a l i t y _ a d j u s t m e n t i f n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " # . . . e l s i f n a m e = = " C o n j u r e d M a n a C a k e " # . . . e l s e # . . . e n d a d j u s t m e n t e n d e n d c l a s s A g e d B r i e < I t e m W r a p p e r d e f q u a l i t y _ a d j u s t m e n t a d j u s t m e n t = 1 i f s e l l _ i n < 0 a d j u s t m e n t = 2 e n d a d j u s t m e n t e n d e n d
  131. c l a s s I t e m W

    r a p p e r < S i m p l e D e l e g a t o r d e f s e l f . w r a p ( i t e m ) i f i t e m . n a m e = = " A g e d B r i e " A g e d B r i e . n e w ( i t e m ) e l s i f i t e m . n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " B a c k s t a g e P a s s . n e w ( i t e m ) e l s e n e w ( i t e m ) e n d e n d d e f q u a l i t y _ a d j u s t m e n t i f n a m e = = " C o n j u r e d M a n a C a k e " # . . . e l s e # . . . e n d a d j u s t m e n t e n d e n d c l a s s B a c k s t a g e P a s s < I t e m W r a p p e r d e f q u a l i t y _ a d j u s t m e n t a d j u s t m e n t = 1 i f s e l l _ i n < 1 0 a d j u s t m e n t = 2 e n d i f s e l l _ i n < 5 a d j u s t m e n t = 3 e n d i f s e l l _ i n < 0 a d j u s t m e n t = - q u a l i t y e n d a d j u s t m e n t e n d e n d
  132. c l a s s I t e m W

    r a p p e r < S i m p l e D e l e g a t o r d e f s e l f . w r a p ( i t e m ) i f i t e m . n a m e = = " A g e d B r i e " A g e d B r i e . n e w ( i t e m ) e l s i f i t e m . n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " B a c k s t a g e P a s s . n e w ( i t e m ) e l s i f i t e m . n a m e = = " C o n j u r e d M a n a C a k e " C o n j u r e d I t e m . n e w ( i t e m ) e l s e n e w ( i t e m ) e n d e n d d e f q u a l i t y _ a d j u s t m e n t # . . . a d j u s t m e n t e n d e n d c l a s s C o n j u r e d I t e m < I t e m W r a p p e r d e f q u a l i t y _ a d j u s t m e n t a d j u s t m e n t = - 2 i f s e l l _ i n < 0 a d j u s t m e n t = - 4 e n d a d j u s t m e n t e n d e n d
  133. c l a s s I t e m W

    r a p p e r < S i m p l e D e l e g a t o r d e f s e l f . w r a p ( i t e m ) i f i t e m . n a m e = = " A g e d B r i e " A g e d B r i e . n e w ( i t e m ) e l s i f i t e m . n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " B a c k s t a g e P a s s . n e w ( i t e m ) e l s i f i t e m . n a m e = = " C o n j u r e d M a n a C a k e " C o n j u r e d I t e m . n e w ( i t e m ) e l s e n e w ( i t e m ) e n d e n d d e f u p d a t e r e t u r n i f n a m e = = " S u l f u r a s , H a n d o f R a g n a r o s " a g e u p d a t e _ q u a l i t y e n d e n d
  134. The Spec ... "Sulfuras", being a legendary item, never has

    to be sold or decreases in quality
  135. c l a s s I t e m W

    r a p p e r < S i m p l e D e l e g a t o r d e f s e l f . w r a p ( i t e m ) i f i t e m . n a m e = = " A g e d B r i e " A g e d B r i e . n e w ( i t e m ) e l s i f i t e m . n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " B a c k s t a g e P a s s . n e w ( i t e m ) e l s i f i t e m . n a m e = = " C o n j u r e d M a n a C a k e " C o n j u r e d I t e m . n e w ( i t e m ) e l s i f i t e m . n a m e = = " S u l f u r a s , H a n d o f R a g n a r o s " L e g e n d a r y I t e m . n e w ( i t e m ) e l s e n e w ( i t e m ) e n d e n d d e f u p d a t e r e t u r n i f n a m e = = " S u l f u r a s , H a n d o f R a g n a r o s " a g e u p d a t e _ q u a l i t y e n d e n d c l a s s L e g e n d a r y I t e m < I t e m W r a p p e r e n d
  136. c l a s s I t e m W

    r a p p e r < S i m p l e D e l e g a t o r d e f s e l f . w r a p ( i t e m ) i f i t e m . n a m e = = " A g e d B r i e " A g e d B r i e . n e w ( i t e m ) e l s i f i t e m . n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " B a c k s t a g e P a s s . n e w ( i t e m ) e l s i f i t e m . n a m e = = " C o n j u r e d M a n a C a k e " C o n j u r e d I t e m . n e w ( i t e m ) e l s i f i t e m . n a m e = = " S u l f u r a s , H a n d o f R a g n a r o s " L e g e n d a r y I t e m . n e w ( i t e m ) e l s e n e w ( i t e m ) e n d e n d d e f u p d a t e a g e u p d a t e _ q u a l i t y e n d e n d c l a s s L e g e n d a r y I t e m < I t e m W r a p p e r d e f u p d a t e # N o t h i n g t o d o - L e g e n d a r y i t e m s d o n ' t c h a n g e e n d e n d
  137. c l a s s I t e m W

    r a p p e r < S i m p l e D e l e g a t o r d e f s e l f . w r a p ( i t e m ) i f i t e m . n a m e = = " A g e d B r i e " A g e d B r i e . n e w ( i t e m ) e l s i f i t e m . n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " B a c k s t a g e P a s s . n e w ( i t e m ) e l s i f i t e m . n a m e = = " C o n j u r e d M a n a C a k e " C o n j u r e d I t e m . n e w ( i t e m ) e l s i f i t e m . n a m e = = " S u l f u r a s , H a n d o f R a g n a r o s " L e g e n d a r y I t e m . n e w ( i t e m ) e l s e n e w ( i t e m ) e n d e n d e n d
  138. c l a s s I t e m W

    r a p p e r < S i m p l e D e l e g a t o r d e f s e l f . w r a p ( i t e m ) c a s e i t e m . n a m e w h e n " A g e d B r i e " A g e d B r i e . n e w ( i t e m ) w h e n " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " B a c k s t a g e P a s s . n e w ( i t e m ) w h e n " C o n j u r e d M a n a C a k e " C o n j u r e d I t e m . n e w ( i t e m ) w h e n " S u l f u r a s , H a n d o f R a g n a r o s " L e g e n d a r y I t e m . n e w ( i t e m ) e l s e n e w ( i t e m ) e n d e n d e n d
  139. Express Domain Concepts

  140. The Spec Once the sell-by date has passed, quality degrades

    twice as fast
  141. c l a s s I t e m W

    r a p p e r < S i m p l e D e l e g a t o r d e f q u a l i t y _ a d j u s t m e n t a d j u s t m e n t = - 1 i f s e l l _ i n < 0 a d j u s t m e n t = - 2 e n d a d j u s t m e n t e n d e n d
  142. c l a s s I t e m W

    r a p p e r < S i m p l e D e l e g a t o r d e f q u a l i t y _ a d j u s t m e n t i f s e l l _ i n < 0 p a s t _ d a t e _ a d j u s t m e n t e l s e n o r m a l _ a d j u s t m e n t e n d e n d d e f n o r m a l _ a d j u s t m e n t - 1 e n d d e f p a s t _ d a t e _ a d j u s t m e n t 2 * n o r m a l _ a d j u s t m e n t e n d e n d
  143. The Spec ... "Aged Brie" actually increases in quality the

    older it gets
  144. c l a s s A g e d B

    r i e < I t e m W r a p p e r d e f q u a l i t y _ a d j u s t m e n t a d j u s t m e n t = 1 i f s e l l _ i n < 0 a d j u s t m e n t = 2 e n d a d j u s t m e n t e n d e n d
  145. c l a s s A g e d B

    r i e < I t e m W r a p p e r d e f n o r m a l _ a d j u s t m e n t - s u p e r e n d e n d
  146. The Spec ... Conjured items degrade in quality twice as

    fast as normal items.
  147. c l a s s C o n j u

    r e d I t e m < I t e m W r a p p e r d e f q u a l i t y _ a d j u s t m e n t a d j u s t m e n t = - 2 i f s e l l _ i n < 0 a d j u s t m e n t = - 4 e n d a d j u s t m e n t e n d e n d
  148. c l a s s C o n j u

    r e d I t e m < I t e m W r a p p e r d e f n o r m a l _ a d j u s t m e n t 2 * s u p e r e n d e n d
  149. The Spec ... "Backstage passes" ... quality drops to 0

    after the concert.
  150. c l a s s B a c k s

    t a g e P a s s < I t e m W r a p p e r d e f q u a l i t y _ a d j u s t m e n t a d j u s t m e n t = 1 i f s e l l _ i n < 1 0 a d j u s t m e n t = 2 e n d i f s e l l _ i n < 5 a d j u s t m e n t = 3 e n d i f s e l l _ i n < 0 a d j u s t m e n t = - q u a l i t y e n d a d j u s t m e n t e n d e n d
  151. c l a s s B a c k s

    t a g e P a s s < I t e m W r a p p e r d e f n o r m a l _ a d j u s t m e n t a d j u s t m e n t = 1 i f s e l l _ i n < 1 0 a d j u s t m e n t = 2 e n d i f s e l l _ i n < 5 a d j u s t m e n t = 3 e n d a d j u s t m e n t e n d d e f p a s t _ d a t e _ a d j u s t m e n t - q u a l i t y e n d e n d
  152. c l a s s B a c k s

    t a g e P a s s < I t e m W r a p p e r d e f n o r m a l _ a d j u s t m e n t a d j u s t m e n t = 1 i f s e l l _ i n < 1 0 a d j u s t m e n t = 2 e n d i f s e l l _ i n < 5 a d j u s t m e n t = 3 e n d a d j u s t m e n t e n d e n d
  153. c l a s s B a c k s

    t a g e P a s s < I t e m W r a p p e r d e f n o r m a l _ a d j u s t m e n t i f s e l l _ i n < 5 3 e l s i f s e l l _ i n < 1 0 2 e l s e 1 e n d e n d e n d
  154. The Spec ... "Backstage passes" ... quality increases by 2

    when there are 10 days or less and by 3 when there are 5 days or less, ...
  155. c l a s s B a c k s

    t a g e P a s s < I t e m W r a p p e r d e f n o r m a l _ a d j u s t m e n t i f s e l l _ i n < 5 3 e l s i f s e l l _ i n < 1 0 2 e l s e 1 e n d e n d e n d
  156. Don't Blindly Fix Bugs Sometimes people or other systems rely

    on the current behavior.
  157. Final Code

  158. d e f u p d a t e _

    q u a l i t y f o r i i n 0 . . ( @ i t e m s . s i z e - 1 ) i f ( @ i t e m s [ i ] . n a m e ! = " A g e d B r i e " & & @ i t e m s [ i ] . n a m e ! = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " ) i f ( @ i t e m s [ i ] . q u a l i t y > 0 ) i f ( @ i t e m s [ i ] . n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " ) @ i t e m s [ i ] . q u a l i t y = @ i t e m s [ i ] . q u a l i t y - 1 e n d e n d e l s e i f ( @ i t e m s [ i ] . q u a l i t y < 5 0 ) @ i t e m s [ i ] . q u a l i t y = @ i t e m s [ i ] . q u a l i t y + 1 i f ( @ i t e m s [ i ] . n a m e = = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " ) i f ( @ i t e m s [ i ] . s e l l _ i n < 1 1 ) i f ( @ i t e m s [ i ] . q u a l i t y < 5 0 ) @ i t e m s [ i ] . q u a l i t y = @ i t e m s [ i ] . q u a l i t y + 1 e n d e n d i f ( @ i t e m s [ i ] . s e l l _ i n < 6 ) i f ( @ i t e m s [ i ] . q u a l i t y < 5 0 ) @ i t e m s [ i ] . q u a l i t y = @ i t e m s [ i ] . q u a l i t y + 1 e n d e n d e n d e n d e n d # . . . c o n t i n u e d . . .
  159. # . . . c o n t i n

    u e d . . . i f ( @ i t e m s [ i ] . n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " ) @ i t e m s [ i ] . s e l l _ i n = @ i t e m s [ i ] . s e l l _ i n - 1 ; e n d i f ( @ i t e m s [ i ] . s e l l _ i n < 0 ) i f ( @ i t e m s [ i ] . n a m e ! = " A g e d B r i e " ) i f ( @ i t e m s [ i ] . n a m e ! = " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " ) i f ( @ i t e m s [ i ] . q u a l i t y > 0 ) i f ( @ i t e m s [ i ] . n a m e ! = " S u l f u r a s , H a n d o f R a g n a r o s " ) @ i t e m s [ i ] . q u a l i t y = @ i t e m s [ i ] . q u a l i t y - 1 e n d e n d e l s e @ i t e m s [ i ] . q u a l i t y = @ i t e m s [ i ] . q u a l i t y - @ i t e m s [ i ] . q u a l i t y e n d e l s e i f ( @ i t e m s [ i ] . q u a l i t y < 5 0 ) @ i t e m s [ i ] . q u a l i t y = @ i t e m s [ i ] . q u a l i t y + 1 e n d e n d e n d e n d e n d
  160. Flog 179.5: flog total 155.1: GildedRose#update_quality

  161. 80 Micro-Refactorings Later...

  162. r e q u i r e ' . /

    i t e m . r b ' r e q u i r e ' d e l e g a t e ' c l a s s G i l d e d R o s e @ i t e m s = [ ] d e f i n i t i a l i z e @ i t e m s = [ ] @ i t e m s < < I t e m . n e w ( " + 5 D e x t e r i t y V e s t " , 1 0 , 2 0 ) @ i t e m s < < I t e m . n e w ( " A g e d B r i e " , 2 , 0 ) @ i t e m s < < I t e m . n e w ( " E l i x i r o f t h e M o n g o o s e " , 5 , 7 ) @ i t e m s < < I t e m . n e w ( " S u l f u r a s , H a n d o f R a g n a r o s " , 0 , 8 0 ) @ i t e m s < < I t e m . n e w ( " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " , 1 5 , 2 0 ) @ i t e m s < < I t e m . n e w ( " C o n j u r e d M a n a C a k e " , 3 , 6 ) e n d d e f u p d a t e _ q u a l i t y @ i t e m s . e a c h d o | i t e m | I t e m W r a p p e r . w r a p ( i t e m ) . u p d a t e e n d e n d e n d
  163. c l a s s I t e m W

    r a p p e r < S i m p l e D e l e g a t o r d e f s e l f . w r a p ( i t e m ) c a s e i t e m . n a m e w h e n " A g e d B r i e " A g e d B r i e . n e w ( i t e m ) w h e n " B a c k s t a g e p a s s e s t o a T A F K A L 8 0 E T C c o n c e r t " B a c k s t a g e P a s s . n e w ( i t e m ) w h e n " C o n j u r e d M a n a C a k e " C o n j u r e d I t e m . n e w ( i t e m ) w h e n " S u l f u r a s , H a n d o f R a g n a r o s " L e g e n d a r y I t e m . n e w ( i t e m ) e l s e n e w ( i t e m ) e n d e n d # . . . c o n t i n u e d . . .
  164. # . . . c o n t i n

    u e d . . . d e f u p d a t e a g e u p d a t e _ q u a l i t y e n d d e f a g e s e l f . s e l l _ i n - = 1 e n d # . . . c o n t i n u e d . . .
  165. # . . . c o n t i n

    u e d . . . d e f u p d a t e _ q u a l i t y s e l f . q u a l i t y + = q u a l i t y _ a d j u s t m e n t e n d d e f q u a l i t y _ a d j u s t m e n t i f s e l l _ i n < 0 p a s t _ d a t e _ a d j u s t m e n t e l s e n o r m a l _ a d j u s t m e n t e n d e n d d e f n o r m a l _ a d j u s t m e n t - 1 e n d d e f p a s t _ d a t e _ a d j u s t m e n t 2 * n o r m a l _ a d j u s t m e n t e n d d e f q u a l i t y = ( n e w _ q u a l i t y ) n e w _ q u a l i t y = 0 i f n e w _ q u a l i t y < 0 n e w _ q u a l i t y = 5 0 i f n e w _ q u a l i t y > 5 0 s u p e r ( n e w _ q u a l i t y ) e n d e n d
  166. c l a s s A g e d B

    r i e < I t e m W r a p p e r d e f n o r m a l _ a d j u s t m e n t - s u p e r e n d e n d c l a s s B a c k s t a g e P a s s < I t e m W r a p p e r d e f n o r m a l _ a d j u s t m e n t i f s e l l _ i n < 5 3 e l s i f s e l l _ i n < 1 0 2 e l s e 1 e n d e n d d e f p a s t _ d a t e _ a d j u s t m e n t - q u a l i t y e n d e n d c l a s s C o n j u r e d I t e m < I t e m W r a p p e r d e f n o r m a l _ a d j u s t m e n t 2 * s u p e r e n d e n d c l a s s L e g e n d a r y I t e m < I t e m W r a p p e r d e f u p d a t e # N o t h i n g t o d o - L e g e n d a r y i t e m s d o n ' t c h a n g e e n d e n d
  167. Flog 67.1: flog total 18.2: GildedRose#initialize 9.5: ItemWrapper::wrap

  168. Takeaways

  169. Slow and Steady Wins the Race

  170. Make the Change Easy, Then Make the Easy Change

  171. Make Simple Mechanical Changes First

  172. Reduce Noise

  173. Remove Duplication

  174. Express Domain Concepts and Important Ideas

  175. Don't Mindlessly Fix Bugs

  176. https://github.com/randycoulman/GildedRose

  177. Acknowledgements Key Technology (http://www.key.net/) Zeal (@codingzeal) Kent Beck (@kentbeck)

  178. References Gilded Rose Kata Working Effectively With Legacy Code -

    Michael Feathers Refactoring - Martin Fowler
  179. Questions?

  180. Randy Coulman http://speakerrate.com/randycoulman https://speakerdeck.com/randycoulman http://randycoulman.com @randycoulman randycoulman