REFACTOR: extract helper methods and domain constants
This commit is contained in:
parent
7a17790915
commit
c2994ce63c
1 changed files with 30 additions and 22 deletions
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue