REFACTOR: extract item type methods from nested conditionals

This commit is contained in:
fiatcode 2026-02-18 12:35:02 +07:00
parent 7f05229104
commit 5655326543

View file

@ -17,55 +17,73 @@ class GildedRose {
GildedRose(this.items); GildedRose(this.items);
void updateQuality() { void updateQuality() {
for (var i = 0; i < items.length; i++) { for (final item in items) {
if (items[i].name != 'Aged Brie' && if (item.name == 'Sulfuras, Hand of Ragnaros') {
items[i].name != 'Backstage passes to a TAFKAL80ETC concert') { _updateSulfuras(item);
if (items[i].quality > 0) { } else if (item.name == 'Aged Brie') {
if (items[i].name != 'Sulfuras, Hand of Ragnaros') { _updateAgedBrie(item);
items[i].quality = items[i].quality - 1; } else if (item.name == 'Backstage passes to a TAFKAL80ETC concert') {
} _updateBackstagePasses(item);
}
} else { } else {
if (items[i].quality < 50) { _updateNormalItem(item);
items[i].quality = items[i].quality + 1;
if (items[i].name == 'Backstage passes to a TAFKAL80ETC concert') {
if (items[i].sellIn < 11) {
if (items[i].quality < 50) {
items[i].quality = items[i].quality + 1;
}
}
if (items[i].sellIn < 6) {
if (items[i].quality < 50) {
items[i].quality = items[i].quality + 1;
}
}
}
}
}
if (items[i].name != 'Sulfuras, Hand of Ragnaros') {
items[i].sellIn = items[i].sellIn - 1;
}
if (items[i].sellIn < 0) {
if (items[i].name != 'Aged Brie') {
if (items[i].name != 'Backstage passes to a TAFKAL80ETC concert') {
if (items[i].quality > 0) {
if (items[i].name != 'Sulfuras, Hand of Ragnaros') {
items[i].quality = items[i].quality - 1;
}
}
} else {
items[i].quality = items[i].quality - items[i].quality;
}
} else {
if (items[i].quality < 50) {
items[i].quality = items[i].quality + 1;
}
}
} }
} }
} }
void _updateNormalItem(Item item) {
// Quality decreases by 1 each day
if (item.quality > 0) {
item.quality -= 1;
}
item.sellIn -= 1;
// After sell-by date, quality degrades twice as fast
if (item.sellIn < 0 && item.quality > 0) {
item.quality -= 1;
}
}
void _updateAgedBrie(Item item) {
// Quality increases as it ages
if (item.quality < 50) {
item.quality += 1;
}
item.sellIn -= 1;
// After sell-by date, quality increases twice as fast
if (item.sellIn < 0 && item.quality < 50) {
item.quality += 1;
}
}
void _updateBackstagePasses(Item item) {
// Quality increases as concert approaches
if (item.quality < 50) {
item.quality += 1;
// 10 days or less: +2 quality/day
if (item.sellIn < 11 && item.quality < 50) {
item.quality += 1;
}
// 5 days or less: +3 quality/day
if (item.sellIn < 6 && item.quality < 50) {
item.quality += 1;
}
}
item.sellIn -= 1;
// After concert, quality drops to 0
if (item.sellIn < 0) {
item.quality = 0;
}
}
void _updateSulfuras(Item item) {
// Legendary item never changes
// Quality always 80, sellIn never decreases
}
} }