Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class Product
- attr_reader :days_remaining, :quality
- def initialize(days_remaining:, quality:)
- @days_remaining = days_remaining
- @quality = quality
- end
- def tick; end
- private
- attr_writer :days_remaining, :quality
- end
- class NormalItem < Product
- def tick
- self.days_remaining = days_remaining - 1
- if days_remaining > 0
- self.quality = quality > 1 ? quality - 1 : 0
- else
- self.quality = quality > 2 ? quality - 2 : 0
- end
- end
- end
- class ConjuredManaCake < Product
- def tick
- self.days_remaining = days_remaining - 1
- if days_remaining > 0
- self.quality = quality > 1 ? quality - 2 : 0
- else
- self.quality = quality > 3 ? quality - 4 : 0
- end
- end
- end
- class AgedBrie < Product
- def tick
- self.days_remaining = days_remaining - 1
- if days_remaining > 0
- self.quality = quality < 50 ? quality + 1 : 50
- else
- self.quality = quality < 49 ? quality + 2 : 50
- end
- end
- end
- class BackstagePasses < Product
- def tick
- self.days_remaining = days_remaining - 1
- if days_remaining > 9
- self.quality = quality < 50 ? quality + 1 : 50
- elsif days_remaining > 4
- self.quality = quality < 50 ? quality + 2 : 50
- elsif days_remaining >= 0
- self.quality = quality < 50 ? quality + 3 : 50
- else
- self.quality = 0
- end
- end
- end
- class GildedRose
- PRODUCT = {
- 'Conjured Mana Cake' => 'ConjuredManaCake',
- 'Aged Brie' => 'AgedBrie',
- 'Backstage passes to a TAFKAL80ETC concert' => 'BackstagePasses',
- 'Normal Item' => 'NormalItem'
- }.freeze
- attr_reader :product
- def initialize(name:, days_remaining:, quality:)
- @product = product_by(name).new(days_remaining: days_remaining, quality: quality)
- end
- def tick
- product.tick
- end
- def days_remaining
- product.days_remaining
- end
- def quality
- product.quality
- end
- private
- def product_by(name)
- Object.const_get(PRODUCT[name] || 'Product')
- end
- end
Add Comment
Please, Sign In to add comment