mirror of
https://github.com/emilybache/GildedRose-Refactoring-Kata.git
synced 2026-02-04 09:11:39 +00:00
Refactoring improvements:
- Extract complex nested if-else logic into well-named private methods
- Separate concerns: each item type has its own update method
- Use constants for item names and quality limits
- Add comprehensive docstrings for all methods
- Improve code readability and maintainability
Conjured items implementation:
- Conjured items degrade in quality twice as fast as normal items
- After sell-by date, Conjured items degrade 4x faster (2x normal rate * 2x after sell-by)
- Quality never goes below 0
- Uses prefix matching for flexibility ('Conjured' prefix)
All tests pass, including the new Conjured items tests.
119 lines
3.9 KiB
Python
Executable File
119 lines
3.9 KiB
Python
Executable File
# -*- coding: utf-8 -*-
|
|
|
|
|
|
class GildedRose(object):
|
|
"""Manages the inventory of items at the Gilded Rose inn."""
|
|
|
|
# Item type constants
|
|
AGED_BRIE = "Aged Brie"
|
|
BACKSTAGE_PASSES = "Backstage passes to a TAFKAL80ETC concert"
|
|
SULFURAS = "Sulfuras, Hand of Ragnaros"
|
|
CONJURED_PREFIX = "Conjured"
|
|
|
|
# Quality constraints
|
|
MAX_QUALITY = 50
|
|
MIN_QUALITY = 0
|
|
SULFURAS_QUALITY = 80
|
|
|
|
def __init__(self, items):
|
|
self.items = items
|
|
|
|
def update_quality(self):
|
|
"""Updates the quality and sell_in values for all items."""
|
|
for item in self.items:
|
|
self._update_item(item)
|
|
|
|
def _update_item(self, item):
|
|
"""Updates a single item's quality and sell_in values."""
|
|
if self._is_sulfuras(item):
|
|
# Sulfuras never changes
|
|
return
|
|
|
|
# Update sell_in date
|
|
item.sell_in -= 1
|
|
|
|
# Update quality based on item type
|
|
if self._is_aged_brie(item):
|
|
self._update_aged_brie(item)
|
|
elif self._is_backstage_passes(item):
|
|
self._update_backstage_passes(item)
|
|
elif self._is_conjured(item):
|
|
self._update_conjured_item(item)
|
|
else:
|
|
self._update_normal_item(item)
|
|
|
|
def _is_sulfuras(self, item):
|
|
"""Check if item is Sulfuras."""
|
|
return item.name == self.SULFURAS
|
|
|
|
def _is_aged_brie(self, item):
|
|
"""Check if item is Aged Brie."""
|
|
return item.name == self.AGED_BRIE
|
|
|
|
def _is_backstage_passes(self, item):
|
|
"""Check if item is Backstage passes."""
|
|
return item.name == self.BACKSTAGE_PASSES
|
|
|
|
def _is_conjured(self, item):
|
|
"""Check if item is a Conjured item."""
|
|
return item.name.startswith(self.CONJURED_PREFIX)
|
|
|
|
def _update_normal_item(self, item):
|
|
"""Update quality for normal items."""
|
|
degradation_rate = self._get_degradation_rate(item)
|
|
self._decrease_quality(item, degradation_rate)
|
|
|
|
def _update_conjured_item(self, item):
|
|
"""Update quality for Conjured items (degrade twice as fast)."""
|
|
degradation_rate = self._get_degradation_rate(item) * 2
|
|
self._decrease_quality(item, degradation_rate)
|
|
|
|
def _update_aged_brie(self, item):
|
|
"""Update quality for Aged Brie (increases with age)."""
|
|
self._increase_quality(item)
|
|
if self._is_past_sell_by_date(item):
|
|
self._increase_quality(item)
|
|
|
|
def _update_backstage_passes(self, item):
|
|
"""Update quality for Backstage passes."""
|
|
if self._is_past_sell_by_date(item):
|
|
# Quality drops to 0 after the concert
|
|
item.quality = 0
|
|
else:
|
|
self._increase_quality(item)
|
|
if item.sell_in < 10:
|
|
self._increase_quality(item)
|
|
if item.sell_in < 5:
|
|
self._increase_quality(item)
|
|
|
|
def _get_degradation_rate(self, item):
|
|
"""Get the degradation rate based on sell_in date."""
|
|
if self._is_past_sell_by_date(item):
|
|
return 2 # Degrades twice as fast after sell by date
|
|
return 1 # Normal degradation rate
|
|
|
|
def _is_past_sell_by_date(self, item):
|
|
"""Check if item is past its sell by date."""
|
|
return item.sell_in < 0
|
|
|
|
def _increase_quality(self, item):
|
|
"""Increase item quality by 1, respecting maximum quality cap."""
|
|
if item.quality < self.MAX_QUALITY:
|
|
item.quality += 1
|
|
|
|
def _decrease_quality(self, item, amount):
|
|
"""Decrease item quality by specified amount, respecting minimum quality."""
|
|
item.quality = max(self.MIN_QUALITY, item.quality - amount)
|
|
|
|
|
|
class Item:
|
|
"""Represents an item in the inventory."""
|
|
|
|
def __init__(self, name, sell_in, quality):
|
|
self.name = name
|
|
self.sell_in = sell_in
|
|
self.quality = quality
|
|
|
|
def __repr__(self):
|
|
return "%s, %s, %s" % (self.name, self.sell_in, self.quality)
|