From 1c99c4d55e27f3f58a37fbf908a37ae5ff7bf44b Mon Sep 17 00:00:00 2001 From: Janis Saldabols Date: Fri, 5 Jul 2024 09:33:42 +0300 Subject: [PATCH] Add conjured item functionality --- .../com/gildedrose/AgedBrieItemUpdater.java | 9 ++++ .../BackstagePassesItemUpdater.java | 24 +++++++++ .../com/gildedrose/ConjuredItemUpdater.java | 9 ++++ .../main/java/com/gildedrose/GildedRose.java | 52 ++----------------- .../main/java/com/gildedrose/ItemUpdater.java | 31 +++++++++++ .../com/gildedrose/ItemUpdaterFactory.java | 23 ++++++++ .../com/gildedrose/RegularItemUpdater.java | 9 ++++ .../com/gildedrose/SulfurasItemUpdater.java | 14 +++++ 8 files changed, 122 insertions(+), 49 deletions(-) create mode 100644 Java/src/main/java/com/gildedrose/AgedBrieItemUpdater.java create mode 100644 Java/src/main/java/com/gildedrose/BackstagePassesItemUpdater.java create mode 100644 Java/src/main/java/com/gildedrose/ConjuredItemUpdater.java create mode 100644 Java/src/main/java/com/gildedrose/ItemUpdater.java create mode 100644 Java/src/main/java/com/gildedrose/ItemUpdaterFactory.java create mode 100644 Java/src/main/java/com/gildedrose/RegularItemUpdater.java create mode 100644 Java/src/main/java/com/gildedrose/SulfurasItemUpdater.java diff --git a/Java/src/main/java/com/gildedrose/AgedBrieItemUpdater.java b/Java/src/main/java/com/gildedrose/AgedBrieItemUpdater.java new file mode 100644 index 00000000..85ea9bfb --- /dev/null +++ b/Java/src/main/java/com/gildedrose/AgedBrieItemUpdater.java @@ -0,0 +1,9 @@ +package com.gildedrose; + +public class AgedBrieItemUpdater extends ItemUpdater { + + @Override + int getIncrementValue() { + return 1; + } +} diff --git a/Java/src/main/java/com/gildedrose/BackstagePassesItemUpdater.java b/Java/src/main/java/com/gildedrose/BackstagePassesItemUpdater.java new file mode 100644 index 00000000..4dfa2c08 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/BackstagePassesItemUpdater.java @@ -0,0 +1,24 @@ +package com.gildedrose; + +public class BackstagePassesItemUpdater extends ItemUpdater { + + @Override + public void update(Item item) { + updateQuality(item, getIncrementValue()); + if (item.sellIn <= 10) { + updateQuality(item, getIncrementValue()); + } + if (item.sellIn <= 5) { + updateQuality(item, getIncrementValue()); + } + updateSellIn(item); + if (isExpired(item)) { + item.quality = 0; + } + } + + @Override + int getIncrementValue() { + return 1; + } +} diff --git a/Java/src/main/java/com/gildedrose/ConjuredItemUpdater.java b/Java/src/main/java/com/gildedrose/ConjuredItemUpdater.java new file mode 100644 index 00000000..8be029b6 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/ConjuredItemUpdater.java @@ -0,0 +1,9 @@ +package com.gildedrose; + +public class ConjuredItemUpdater extends ItemUpdater { + + @Override + int getIncrementValue() { + return -2; + } +} diff --git a/Java/src/main/java/com/gildedrose/GildedRose.java b/Java/src/main/java/com/gildedrose/GildedRose.java index 87a3b926..71389f03 100644 --- a/Java/src/main/java/com/gildedrose/GildedRose.java +++ b/Java/src/main/java/com/gildedrose/GildedRose.java @@ -8,55 +8,9 @@ class GildedRose { } public void updateQuality() { - for (int i = 0; i < items.length; i++) { - if (!items[i].name.equals("Aged Brie") - && !items[i].name.equals("Backstage passes to a TAFKAL80ETC concert")) { - if (items[i].quality > 0) { - if (!items[i].name.equals("Sulfuras, Hand of Ragnaros")) { - items[i].quality = items[i].quality - 1; - } - } - } else { - if (items[i].quality < 50) { - items[i].quality = items[i].quality + 1; - - if (items[i].name.equals("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.equals("Sulfuras, Hand of Ragnaros")) { - items[i].sellIn = items[i].sellIn - 1; - } - - if (items[i].sellIn < 0) { - if (!items[i].name.equals("Aged Brie")) { - if (!items[i].name.equals("Backstage passes to a TAFKAL80ETC concert")) { - if (items[i].quality > 0) { - if (!items[i].name.equals("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; - } - } - } + for (Item item : items) { + ItemUpdater itemUpdater = ItemUpdaterFactory.getUpdater(item); + itemUpdater.update(item); } } } diff --git a/Java/src/main/java/com/gildedrose/ItemUpdater.java b/Java/src/main/java/com/gildedrose/ItemUpdater.java new file mode 100644 index 00000000..3fe6e072 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/ItemUpdater.java @@ -0,0 +1,31 @@ +package com.gildedrose; + +import static java.lang.Math.max; +import static java.lang.Math.min; + +public abstract class ItemUpdater { + public static final int QUALITY_MIN = 0; + public static final int QUALITY_MAX = 50; + + protected void update(Item item){ + updateQuality(item, getIncrementValue()); + updateSellIn(item); + if (isExpired(item)) { + updateQuality(item, getIncrementValue()); + } + } + + abstract int getIncrementValue(); + + boolean isExpired(Item item) { + return item.sellIn < 0; + } + + void updateQuality(Item item, int increment){ + item.quality = max(QUALITY_MIN, min(QUALITY_MAX, item.quality + increment)); + } + + final void updateSellIn(Item item) { + item.sellIn = (int) max(Integer.MIN_VALUE, min(Integer.MAX_VALUE, ((long) item.sellIn) - 1)); + } +} diff --git a/Java/src/main/java/com/gildedrose/ItemUpdaterFactory.java b/Java/src/main/java/com/gildedrose/ItemUpdaterFactory.java new file mode 100644 index 00000000..85bde5f8 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/ItemUpdaterFactory.java @@ -0,0 +1,23 @@ +package com.gildedrose; + +public final class ItemUpdaterFactory { + + private ItemUpdaterFactory() { + throw new UnsupportedOperationException("Class cannot be instantiated"); + } + + public static ItemUpdater getUpdater(Item item) { + switch (item.name) { + case "Aged Brie": + return new AgedBrieItemUpdater(); + case "Backstage passes to a TAFKAL80ETC concert": + return new BackstagePassesItemUpdater(); + case "Sulfuras, Hand of Ragnaros": + return new SulfurasItemUpdater(); + case "Conjured Mana Cake": + return new ConjuredItemUpdater(); + default: + return new RegularItemUpdater(); + } + } +} diff --git a/Java/src/main/java/com/gildedrose/RegularItemUpdater.java b/Java/src/main/java/com/gildedrose/RegularItemUpdater.java new file mode 100644 index 00000000..ef99dae5 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/RegularItemUpdater.java @@ -0,0 +1,9 @@ +package com.gildedrose; + +public class RegularItemUpdater extends ItemUpdater { + + @Override + int getIncrementValue() { + return -1; + } +} diff --git a/Java/src/main/java/com/gildedrose/SulfurasItemUpdater.java b/Java/src/main/java/com/gildedrose/SulfurasItemUpdater.java new file mode 100644 index 00000000..cd8d9d2a --- /dev/null +++ b/Java/src/main/java/com/gildedrose/SulfurasItemUpdater.java @@ -0,0 +1,14 @@ +package com.gildedrose; + +public class SulfurasItemUpdater extends ItemUpdater { + + @Override + public void update(Item item) { + // Don't change legendary item + } + + @Override + int getIncrementValue() { + return 0; + } +}