From c2994ce63c27e73bfcfc72ce3bbac4abcb7da70c Mon Sep 17 00:00:00 2001 From: fiatcode Date: Wed, 18 Feb 2026 12:39:31 +0700 Subject: [PATCH] REFACTOR: extract helper methods and domain constants --- lib/gilded_rose.dart | 52 +++++++++++++++++++++++++------------------- 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/lib/gilded_rose.dart b/lib/gilded_rose.dart index 413c60f..604c119 100644 --- a/lib/gilded_rose.dart +++ b/lib/gilded_rose.dart @@ -11,6 +11,20 @@ class Item { String toString() => '$name, $sellIn, $quality'; } +/// Quality bounds - domain constraints +const int _minQuality = 0; +const int _maxQuality = 50; +const int _legendaryQuality = 80; // unused, just for documentation + +/// Helper methods for quality management +void _degradeQuality(Item item, int amount) { + item.quality = (item.quality - amount).clamp(_minQuality, _maxQuality); +} + +void _improveQuality(Item item, int amount) { + item.quality = (item.quality + amount).clamp(_minQuality, _maxQuality); +} + /// Strategy pattern: Each item type has its own update behavior abstract class ItemUpdater { void update(Item item); @@ -20,15 +34,13 @@ class NormalItemUpdater implements ItemUpdater { @override void update(Item item) { // Quality decreases by 1 each day - if (item.quality > 0) { - item.quality -= 1; - } + _degradeQuality(item, 1); item.sellIn -= 1; // After sell-by date, quality degrades twice as fast - if (item.sellIn < 0 && item.quality > 0) { - item.quality -= 1; + if (item.sellIn < 0) { + _degradeQuality(item, 1); } } } @@ -37,15 +49,13 @@ class AgedBrieUpdater implements ItemUpdater { @override void update(Item item) { // Quality increases as it ages - if (item.quality < 50) { - item.quality += 1; - } + _improveQuality(item, 1); item.sellIn -= 1; // After sell-by date, quality increases twice as fast - if (item.sellIn < 0 && item.quality < 50) { - item.quality += 1; + if (item.sellIn < 0) { + _improveQuality(item, 1); } } } @@ -53,26 +63,24 @@ class AgedBrieUpdater implements ItemUpdater { class BackstagePassUpdater implements ItemUpdater { @override void update(Item item) { - // Quality increases as concert approaches - if (item.quality < 50) { - item.quality += 1; + // Base quality increase + _improveQuality(item, 1); - // 10 days or less: +2 quality/day - if (item.sellIn < 11 && item.quality < 50) { - item.quality += 1; - } + // 10 days or less: +1 additional + if (item.sellIn <= 10) { + _improveQuality(item, 1); + } - // 5 days or less: +3 quality/day - if (item.sellIn < 6 && item.quality < 50) { - item.quality += 1; - } + // 5 days or less: +1 additional (total +3/day) + if (item.sellIn <= 5) { + _improveQuality(item, 1); } item.sellIn -= 1; // After concert, quality drops to 0 if (item.sellIn < 0) { - item.quality = 0; + item.quality = _minQuality; } } }