From d559f07acddd815f89a5e5d4112da4ffbf514665 Mon Sep 17 00:00:00 2001 From: Ahmed Abdeen Date: Wed, 15 Jan 2025 21:19:20 +0100 Subject: [PATCH] feat: conjured-items - Refactored the code to use the strategies. --- .../gildedrose/AgedBrieItemStrategyImpl.java | 14 --- .../gildedrose/BackStageItemStrategyImpl.java | 26 ----- .../gildedrose/ConjuredItemStrategyImpl.java | 9 -- .../main/java/com/gildedrose/GildedRose.java | 105 +++++++++--------- .../java/com/gildedrose/ItemStrategy.java | 13 --- .../strategy/AgedBrieItemStrategyImpl.java | 12 ++ .../strategy/BackStageItemStrategyImpl.java | 24 ++++ .../strategy/ConjuredItemStrategyImpl.java | 12 ++ .../com/gildedrose/strategy/ItemStrategy.java | 24 ++++ .../SulfurasItemStrategyImpl.java | 6 +- .../java/com/gildedrose/GildedRoseTest.java | 12 +- .../java/com/gildedrose/TexttestFixture.java | 21 ++-- 12 files changed, 143 insertions(+), 135 deletions(-) delete mode 100644 Java/src/main/java/com/gildedrose/AgedBrieItemStrategyImpl.java delete mode 100644 Java/src/main/java/com/gildedrose/BackStageItemStrategyImpl.java delete mode 100644 Java/src/main/java/com/gildedrose/ConjuredItemStrategyImpl.java delete mode 100644 Java/src/main/java/com/gildedrose/ItemStrategy.java create mode 100644 Java/src/main/java/com/gildedrose/strategy/AgedBrieItemStrategyImpl.java create mode 100644 Java/src/main/java/com/gildedrose/strategy/BackStageItemStrategyImpl.java create mode 100644 Java/src/main/java/com/gildedrose/strategy/ConjuredItemStrategyImpl.java create mode 100644 Java/src/main/java/com/gildedrose/strategy/ItemStrategy.java rename Java/src/main/java/com/gildedrose/{ => strategy}/SulfurasItemStrategyImpl.java (53%) diff --git a/Java/src/main/java/com/gildedrose/AgedBrieItemStrategyImpl.java b/Java/src/main/java/com/gildedrose/AgedBrieItemStrategyImpl.java deleted file mode 100644 index acd67918..00000000 --- a/Java/src/main/java/com/gildedrose/AgedBrieItemStrategyImpl.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.gildedrose; - -public class AgedBrieItemStrategyImpl implements ItemStrategy { - @Override - public void updateQuality(Item item) { - if (item.quality < 50) { - item.quality = item.quality + 1; - } - item.sellIn = item.sellIn - 1; - if (item.sellIn < 0) { - item.quality = item.quality < 50 ? item.quality + 1 : 50; - } - } -} diff --git a/Java/src/main/java/com/gildedrose/BackStageItemStrategyImpl.java b/Java/src/main/java/com/gildedrose/BackStageItemStrategyImpl.java deleted file mode 100644 index b9cf959e..00000000 --- a/Java/src/main/java/com/gildedrose/BackStageItemStrategyImpl.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.gildedrose; - -public class BackStageItemStrategyImpl implements ItemStrategy { - @Override - public void updateQuality(Item item) { - if (item.quality < 50) { - item.quality = item.quality + 1; - if (item.sellIn < 11) { - if (item.quality < 50) { - item.quality = item.quality + 1; - } - } - - if (item.sellIn < 6) { - if (item.quality < 50) { - item.quality = item.quality + 1; - } - } - } - item.sellIn = item.sellIn - 1; - - if (item.sellIn < 0) { - item.quality = 0; - } - } -} diff --git a/Java/src/main/java/com/gildedrose/ConjuredItemStrategyImpl.java b/Java/src/main/java/com/gildedrose/ConjuredItemStrategyImpl.java deleted file mode 100644 index 5b2ed3d1..00000000 --- a/Java/src/main/java/com/gildedrose/ConjuredItemStrategyImpl.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.gildedrose; - -public class ConjuredItemStrategyImpl implements ItemStrategy { - @Override - public void updateQuality(Item item) { - item.quality = item.quality > 2 ? item.quality - 2 : 0; - item.sellIn = item.sellIn - 1; - } -} diff --git a/Java/src/main/java/com/gildedrose/GildedRose.java b/Java/src/main/java/com/gildedrose/GildedRose.java index 87a3b926..c49c4ddb 100644 --- a/Java/src/main/java/com/gildedrose/GildedRose.java +++ b/Java/src/main/java/com/gildedrose/GildedRose.java @@ -1,62 +1,61 @@ package com.gildedrose; +import com.gildedrose.strategy.AgedBrieItemStrategyImpl; +import com.gildedrose.strategy.BackStageItemStrategyImpl; +import com.gildedrose.strategy.ConjuredItemStrategyImpl; +import com.gildedrose.strategy.ItemStrategy; +import com.gildedrose.strategy.SulfurasItemStrategyImpl; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + class GildedRose { - Item[] items; + private static final ItemStrategy DEFAULT_STRATEGY = new ItemStrategy() { + }; + private static final Map STRATEGIES = new TreeMap<>(); - public GildedRose(Item[] items) { - this.items = items; + static final String AGED_BRIE = "Aged Brie"; + static final String CONJURED = "Conjured Mana Cake"; + static final String DEXTERITY_VEST = "+5 Dexterity Vest"; + static final String SULFURAS = "Sulfuras, Hand of Ragnaros"; + static final String ELIXIR_OF_THE_MONGOOSE = "Elixir of the Mongoose"; + static final String BACKSTAGE_PASSES = "Backstage passes to a TAFKAL80ETC concert"; + + private static final List KNOWN_ITEM_NAMES = + List.of(AGED_BRIE, CONJURED, DEXTERITY_VEST, SULFURAS, ELIXIR_OF_THE_MONGOOSE, + BACKSTAGE_PASSES); + + static { + STRATEGIES.put(DEXTERITY_VEST, DEFAULT_STRATEGY); + STRATEGIES.put(ELIXIR_OF_THE_MONGOOSE, DEFAULT_STRATEGY); + STRATEGIES.put(AGED_BRIE, new AgedBrieItemStrategyImpl()); + STRATEGIES.put(CONJURED, new ConjuredItemStrategyImpl()); + STRATEGIES.put(SULFURAS, new SulfurasItemStrategyImpl()); + STRATEGIES.put(BACKSTAGE_PASSES, new BackStageItemStrategyImpl()); + } + + private final Item[] items; + + public GildedRose(Item[] items) { + if (items == null || items.length == 0) { + throw new IllegalArgumentException("Items cannot be empty"); } + this.items = items; + } - 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; + public void updateQuality() { + Arrays.stream(items).forEach(item -> findStrategy(item).updateQuality(item)); + } - 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; - } - } - } - } + private ItemStrategy findStrategy(Item item) { + if (KNOWN_ITEM_NAMES.contains(item.name)) { + return STRATEGIES.get(item.name); } + return DEFAULT_STRATEGY; + } + + public Item[] getItems() { + return items; + } } diff --git a/Java/src/main/java/com/gildedrose/ItemStrategy.java b/Java/src/main/java/com/gildedrose/ItemStrategy.java deleted file mode 100644 index 29cff3fc..00000000 --- a/Java/src/main/java/com/gildedrose/ItemStrategy.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.gildedrose; - -public interface ItemStrategy { - default void updateQuality(Item item) { - if (item.quality > 0) { - item.quality = item.quality - 1; - } - item.sellIn = item.sellIn - 1; - if (item.sellIn < 0 && item.quality > 0) { - item.quality = item.quality - 1; - } - } -} diff --git a/Java/src/main/java/com/gildedrose/strategy/AgedBrieItemStrategyImpl.java b/Java/src/main/java/com/gildedrose/strategy/AgedBrieItemStrategyImpl.java new file mode 100644 index 00000000..127430e5 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/strategy/AgedBrieItemStrategyImpl.java @@ -0,0 +1,12 @@ +package com.gildedrose.strategy; + +import com.gildedrose.Item; + +public class AgedBrieItemStrategyImpl implements ItemStrategy { + @Override + public void updateQuality(Item item) { + item.sellIn--; + int increment = item.sellIn < 0 ? 2 * INCREASE_RATE : INCREASE_RATE; + increaseQuality(item, increment); + } +} diff --git a/Java/src/main/java/com/gildedrose/strategy/BackStageItemStrategyImpl.java b/Java/src/main/java/com/gildedrose/strategy/BackStageItemStrategyImpl.java new file mode 100644 index 00000000..5f08f51f --- /dev/null +++ b/Java/src/main/java/com/gildedrose/strategy/BackStageItemStrategyImpl.java @@ -0,0 +1,24 @@ +package com.gildedrose.strategy; + +import com.gildedrose.Item; + +public class BackStageItemStrategyImpl implements ItemStrategy { + @Override + public void updateQuality(Item item) { + item.sellIn--; + + if (item.sellIn < 0) { + item.quality = 0; + return; + } + + int increment = INCREASE_RATE; + if (item.sellIn < 5) { + increment += 2; + } else if (item.sellIn < 10) { + increment++; + } + + increaseQuality(item, increment); + } +} diff --git a/Java/src/main/java/com/gildedrose/strategy/ConjuredItemStrategyImpl.java b/Java/src/main/java/com/gildedrose/strategy/ConjuredItemStrategyImpl.java new file mode 100644 index 00000000..d7268983 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/strategy/ConjuredItemStrategyImpl.java @@ -0,0 +1,12 @@ +package com.gildedrose.strategy; + +import com.gildedrose.Item; + +public class ConjuredItemStrategyImpl implements ItemStrategy { + @Override + public void updateQuality(Item item) { + item.sellIn--; + int decrement = item.sellIn < 0 ? 4 * DEGRADATION_RATE : 2 * DEGRADATION_RATE; + decreaseQuality(item, decrement); + } +} diff --git a/Java/src/main/java/com/gildedrose/strategy/ItemStrategy.java b/Java/src/main/java/com/gildedrose/strategy/ItemStrategy.java new file mode 100644 index 00000000..5505a0d6 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/strategy/ItemStrategy.java @@ -0,0 +1,24 @@ +package com.gildedrose.strategy; + +import com.gildedrose.Item; + +public interface ItemStrategy { + int MINIMUM_QUALITY = 0; + int MAXIMUM_QUALITY = 50; + int DEGRADATION_RATE = 1; + int INCREASE_RATE = 1; + + default void updateQuality(Item item) { + item.sellIn--; + int decrement = item.sellIn < 0 ? 2 * DEGRADATION_RATE : DEGRADATION_RATE; + decreaseQuality(item, decrement); + } + + default void increaseQuality(Item item, int amount) { + item.quality = Math.min(MAXIMUM_QUALITY, item.quality + amount); + } + + default void decreaseQuality(Item item, int amount) { + item.quality = Math.max(MINIMUM_QUALITY, item.quality - amount); + } +} diff --git a/Java/src/main/java/com/gildedrose/SulfurasItemStrategyImpl.java b/Java/src/main/java/com/gildedrose/strategy/SulfurasItemStrategyImpl.java similarity index 53% rename from Java/src/main/java/com/gildedrose/SulfurasItemStrategyImpl.java rename to Java/src/main/java/com/gildedrose/strategy/SulfurasItemStrategyImpl.java index fb053401..e74cded5 100644 --- a/Java/src/main/java/com/gildedrose/SulfurasItemStrategyImpl.java +++ b/Java/src/main/java/com/gildedrose/strategy/SulfurasItemStrategyImpl.java @@ -1,8 +1,10 @@ -package com.gildedrose; +package com.gildedrose.strategy; + +import com.gildedrose.Item; public class SulfurasItemStrategyImpl implements ItemStrategy { @Override public void updateQuality(Item item) { - // Quality remains intact. Not for sel! + // Quality remains unchanged. Not for sale! } } diff --git a/Java/src/test/java/com/gildedrose/GildedRoseTest.java b/Java/src/test/java/com/gildedrose/GildedRoseTest.java index 8ae29eec..18cb1af9 100644 --- a/Java/src/test/java/com/gildedrose/GildedRoseTest.java +++ b/Java/src/test/java/com/gildedrose/GildedRoseTest.java @@ -1,17 +1,15 @@ package com.gildedrose; -import org.junit.jupiter.api.Test; - import static org.junit.jupiter.api.Assertions.assertEquals; -class GildedRoseTest { +import org.junit.jupiter.api.Test; +class GildedRoseTest { @Test - void foo() { - Item[] items = new Item[] { new Item("foo", 0, 0) }; + void test() { + Item[] items = new Item[] {new Item("foo", 0, 0)}; GildedRose app = new GildedRose(items); app.updateQuality(); - assertEquals("fixme", app.items[0].name); + assertEquals("foo", app.getItems()[0].name); } - } diff --git a/Java/src/test/java/com/gildedrose/TexttestFixture.java b/Java/src/test/java/com/gildedrose/TexttestFixture.java index d059c88f..927a6c06 100644 --- a/Java/src/test/java/com/gildedrose/TexttestFixture.java +++ b/Java/src/test/java/com/gildedrose/TexttestFixture.java @@ -5,16 +5,16 @@ public class TexttestFixture { System.out.println("OMGHAI!"); Item[] items = new Item[] { - new Item("+5 Dexterity Vest", 10, 20), // - new Item("Aged Brie", 2, 0), // - new Item("Elixir of the Mongoose", 5, 7), // - new Item("Sulfuras, Hand of Ragnaros", 0, 80), // - new Item("Sulfuras, Hand of Ragnaros", -1, 80), - new Item("Backstage passes to a TAFKAL80ETC concert", 15, 20), - new Item("Backstage passes to a TAFKAL80ETC concert", 10, 49), - new Item("Backstage passes to a TAFKAL80ETC concert", 5, 49), - // this conjured item does not work properly yet - new Item("Conjured Mana Cake", 3, 6) }; + new Item(GildedRose.DEXTERITY_VEST, 10, 20), // + new Item(GildedRose.AGED_BRIE, 2, 0), // + new Item(GildedRose.ELIXIR_OF_THE_MONGOOSE, 5, 7), // + new Item(GildedRose.SULFURAS, 0, 80), // + new Item(GildedRose.SULFURAS, -1, 80), + new Item(GildedRose.BACKSTAGE_PASSES, 15, 20), + new Item(GildedRose.BACKSTAGE_PASSES, 10, 49), + new Item(GildedRose.BACKSTAGE_PASSES, 5, 49), + // this conjured item does not work properly yet + new Item(GildedRose.CONJURED, 3, 6)}; GildedRose app = new GildedRose(items); @@ -33,5 +33,4 @@ public class TexttestFixture { app.updateQuality(); } } - }