Skip to content

Instantly share code, notes, and snippets.

@YabZhang
Created December 1, 2019 07:53
Show Gist options
  • Select an option

  • Save YabZhang/58c552c7cf6840ac59f6d32a3e80e173 to your computer and use it in GitHub Desktop.

Select an option

Save YabZhang/58c552c7cf6840ac59f6d32a3e80e173 to your computer and use it in GitHub Desktop.
GildedRoseRefact
# -*- coding: utf-8 -*-
class GildedRose(object):
def __init__(self, items):
self.items = items
def update_quality(self):
for item in self.items:
refresher_factory(item).refresh()
class Item:
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)
class RoseRefresher(object):
def __init__(self, item):
self.item = item
def is_sellin_passed(self):
return self.item.sell_in < 0
def is_good_quality(self):
return self.item.quality > 0
def degrade_quality(self, n=1):
self.item.quality -= n
def do_update_quality(self):
if self.is_good_quality():
self.degrade_quality()
def update_daily_quality(self):
self.do_update_quality()
def refresh_left_days(self):
self.item.sell_in -= 1
def update_expired_quality(self):
self.do_update_quality()
def refresh(self):
self.update_daily_quality()
self.refresh_left_days()
if self.is_sellin_passed():
self.update_expired_quality()
class AgeBrieRefresher(RoseRefresher):
def is_good_quality(self):
return self.item.quality < 50
def increase_quality(self, n=1):
self.item.quality += n
def do_update_quality(self):
if self.is_good_quality():
self.increase_quality()
class BackstageRefresher(RoseRefresher):
def is_good_quality(self):
return self.item.quality < 50
def increase_quality(self, n=1):
self.item.quality += 1
def do_update_quality(self):
if self.is_good_quality():
self.increase_quality()
def update_daily_quality(self):
self.do_update_quality()
if self.item.sell_in < 11:
self.do_update_quality()
if self.item.sell_in < 6:
self.do_update_quality()
def update_expired_quality(self):
self.item.quality = 0
class LegendaryRefresher(RoseRefresher):
def do_update_quality(self):
pass
def refresh_left_days(self):
pass
RefreshHanlderRegistry = {
"Aged Brie": AgeBrieRefresher,
"Backstage passes to a TAFKAL80ETC concert": BackstageRefresher,
"Sulfuras, Hand of Ragnaros": LegendaryRefresher,
"default": RoseRefresher,
}
def refresher_factory(item):
default_refresher = RefreshHanlderRegistry.get("default")
refresher = RefreshHanlderRegistry.get(item.name, default_refresher)
return refresher(item)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment