Move items to their own classes

This commit is contained in:
Maarten Parmentier 2023-06-27 21:53:46 +02:00
parent 815ba7ce24
commit fbae17fd32
6 changed files with 106 additions and 67 deletions

View File

@ -1,3 +1,9 @@
require_relative 'items/backstage_pass_item'
require_relative 'items/brie_item'
require_relative 'items/conjured_item'
require_relative 'items/normal_item'
require_relative 'items/sulfura_item'
class GildedRose class GildedRose
QUALITY_LOWER_LIMIT = 0 QUALITY_LOWER_LIMIT = 0
QUALITY_UPPER_LIMIT = 50 QUALITY_UPPER_LIMIT = 50
@ -10,80 +16,18 @@ class GildedRose
@items.each do |item| @items.each do |item|
case item.name case item.name
when 'Aged Brie' when 'Aged Brie'
update_aged_brie_quality(item) BrieItem.new(item).spend_day_in_shop
when 'Backstage passes to a TAFKAL80ETC concert' when 'Backstage passes to a TAFKAL80ETC concert'
update_backstage_passes_quality(item) BackstagePassItem.new(item).spend_day_in_shop
when 'Conjured Mana Cake' when 'Conjured Mana Cake'
update_conjured_quality(item) ConjuredItem.new(item).spend_day_in_shop
when 'Sulfuras, Hand of Ragnaros' when 'Sulfuras, Hand of Ragnaros'
update_sulfuras_quality(item) SulfuraItem.new(item).spend_day_in_shop
else else
update_normal_quality(item) NormalItem.new(item).spend_day_in_shop
end end
end end
end end
def update_aged_brie_quality(item)
decrease_sell_in_day(item)
increase_item_quality(item)
increase_item_quality(item) if item.sell_in.negative?
keep_quality_upper_limit_in_bounds(item)
end
def update_backstage_passes_quality(item)
decrease_sell_in_day(item)
return item.quality = 0 if item.sell_in.negative?
increase_item_quality(item)
increase_item_quality(item) if item.sell_in < 10
increase_item_quality(item) if item.sell_in < 5
keep_quality_upper_limit_in_bounds(item)
end
def update_conjured_quality(item)
decrease_sell_in_day(item)
decrease_item_quality(item, 2)
decrease_item_quality(item, 2) if item.sell_in.negative?
keep_quality_lower_limit_in_bounds(item)
end
def update_normal_quality(item)
decrease_sell_in_day(item)
decrease_item_quality(item)
decrease_item_quality(item) if item.sell_in.negative?
keep_quality_lower_limit_in_bounds(item)
end
def update_sulfuras_quality(item); end
private
def decrease_sell_in_day(item)
item.sell_in -= 1
end
def increase_item_quality(item)
item.quality += 1
end
def decrease_item_quality(item, by = 1)
item.quality -= by
end
def keep_quality_upper_limit_in_bounds(item)
item.quality = QUALITY_UPPER_LIMIT if item.quality > QUALITY_UPPER_LIMIT
end
def keep_quality_lower_limit_in_bounds(item)
item.quality = QUALITY_LOWER_LIMIT if item.quality < QUALITY_LOWER_LIMIT
end
end end
class Item class Item

View File

@ -0,0 +1,16 @@
require_relative 'normal_item'
class BackstagePassItem < NormalItem
def spend_day_in_shop
decrease_sell_in_day
return item.quality = 0 if item.sell_in.negative?
increase_quality
increase_quality if item.sell_in < 10
increase_quality if item.sell_in < 5
keep_quality_upper_limit_in_bounds
self
end
end

14
ruby/items/brie_item.rb Normal file
View File

@ -0,0 +1,14 @@
require_relative 'normal_item'
class BrieItem < NormalItem
def spend_day_in_shop
decrease_sell_in_day
increase_quality
increase_quality if item.sell_in.negative?
keep_quality_upper_limit_in_bounds
self
end
end

View File

@ -0,0 +1,19 @@
require_relative 'normal_item'
class ConjuredItem< NormalItem
def spend_day_in_shop
decrease_sell_in_day
decrease_quality
decrease_quality
if item.sell_in.negative?
decrease_quality
decrease_quality
end
keep_quality_lower_limit_in_bounds
self
end
end

41
ruby/items/normal_item.rb Normal file
View File

@ -0,0 +1,41 @@
class NormalItem
attr_reader :item
def initialize(item)
@item = item
end
def spend_day_in_shop
decrease_sell_in_day
decrease_quality
decrease_quality if item.sell_in.negative?
keep_quality_lower_limit_in_bounds
keep_quality_upper_limit_in_bounds
self
end
private
def decrease_sell_in_day
item.sell_in -= 1
end
def decrease_quality
item.quality -= 1
end
def increase_quality
item.quality += 1
end
def keep_quality_lower_limit_in_bounds
item.quality = GildedRose::QUALITY_LOWER_LIMIT if item.quality < GildedRose::QUALITY_LOWER_LIMIT
end
def keep_quality_upper_limit_in_bounds
item.quality = GildedRose::QUALITY_UPPER_LIMIT if item.quality > GildedRose::QUALITY_UPPER_LIMIT
end
end

View File

@ -0,0 +1,5 @@
require_relative 'normal_item'
class SulfuraItem < NormalItem
def spend_day_in_shop; end
end