REFACTOR: extract helper methods and domain constants

This commit is contained in:
fiatcode 2026-02-18 12:39:31 +07:00
parent 7a17790915
commit c2994ce63c

View file

@ -11,6 +11,20 @@ class Item {
String toString() => '$name, $sellIn, $quality'; 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 /// Strategy pattern: Each item type has its own update behavior
abstract class ItemUpdater { abstract class ItemUpdater {
void update(Item item); void update(Item item);
@ -20,15 +34,13 @@ class NormalItemUpdater implements ItemUpdater {
@override @override
void update(Item item) { void update(Item item) {
// Quality decreases by 1 each day // Quality decreases by 1 each day
if (item.quality > 0) { _degradeQuality(item, 1);
item.quality -= 1;
}
item.sellIn -= 1; item.sellIn -= 1;
// After sell-by date, quality degrades twice as fast // After sell-by date, quality degrades twice as fast
if (item.sellIn < 0 && item.quality > 0) { if (item.sellIn < 0) {
item.quality -= 1; _degradeQuality(item, 1);
} }
} }
} }
@ -37,15 +49,13 @@ class AgedBrieUpdater implements ItemUpdater {
@override @override
void update(Item item) { void update(Item item) {
// Quality increases as it ages // Quality increases as it ages
if (item.quality < 50) { _improveQuality(item, 1);
item.quality += 1;
}
item.sellIn -= 1; item.sellIn -= 1;
// After sell-by date, quality increases twice as fast // After sell-by date, quality increases twice as fast
if (item.sellIn < 0 && item.quality < 50) { if (item.sellIn < 0) {
item.quality += 1; _improveQuality(item, 1);
} }
} }
} }
@ -53,26 +63,24 @@ class AgedBrieUpdater implements ItemUpdater {
class BackstagePassUpdater implements ItemUpdater { class BackstagePassUpdater implements ItemUpdater {
@override @override
void update(Item item) { void update(Item item) {
// Quality increases as concert approaches // Base quality increase
if (item.quality < 50) { _improveQuality(item, 1);
item.quality += 1;
// 10 days or less: +2 quality/day // 10 days or less: +1 additional
if (item.sellIn < 11 && item.quality < 50) { if (item.sellIn <= 10) {
item.quality += 1; _improveQuality(item, 1);
} }
// 5 days or less: +3 quality/day // 5 days or less: +1 additional (total +3/day)
if (item.sellIn < 6 && item.quality < 50) { if (item.sellIn <= 5) {
item.quality += 1; _improveQuality(item, 1);
}
} }
item.sellIn -= 1; item.sellIn -= 1;
// After concert, quality drops to 0 // After concert, quality drops to 0
if (item.sellIn < 0) { if (item.sellIn < 0) {
item.quality = 0; item.quality = _minQuality;
} }
} }
} }