From 6a2c95d1a81cf9ed0f6648aa5111a43f4b61205f Mon Sep 17 00:00:00 2001 From: Richard Xu Date: Thu, 22 Dec 2022 16:27:09 -0500 Subject: [PATCH] Use map for string and handler class --- Java/pom.xml | 14 +++++ .../java/com/gildedrose/AgedBrieItem.java | 10 ---- .../com/gildedrose/AgedBrieItemHandler.java | 14 +++++ .../com/gildedrose/BackstagePassesItem.java | 18 ------- .../BackstagePassesItemHandler.java | 20 +++++++ ...nericItem.java => GenericItemHandler.java} | 6 ++- .../main/java/com/gildedrose/GildedRose.java | 46 +++++++++------- Java/src/main/java/com/gildedrose/Item.java | 25 +++++---- .../main/java/com/gildedrose/ItemHandler.java | 6 +++ .../main/java/com/gildedrose/ItemType.java | 3 ++ .../java/com/gildedrose/SulfurasItem.java | 4 -- .../com/gildedrose/SulfurasItemHandler.java | 3 ++ .../java/com/gildedrose/GildedRoseTest.java | 54 +++++++++++-------- .../java/com/gildedrose/TexttestFixture.java | 53 +++++++++--------- 14 files changed, 164 insertions(+), 112 deletions(-) delete mode 100644 Java/src/main/java/com/gildedrose/AgedBrieItem.java create mode 100644 Java/src/main/java/com/gildedrose/AgedBrieItemHandler.java delete mode 100644 Java/src/main/java/com/gildedrose/BackstagePassesItem.java create mode 100644 Java/src/main/java/com/gildedrose/BackstagePassesItemHandler.java rename Java/src/main/java/com/gildedrose/{GenericItem.java => GenericItemHandler.java} (63%) create mode 100644 Java/src/main/java/com/gildedrose/ItemHandler.java create mode 100644 Java/src/main/java/com/gildedrose/ItemType.java delete mode 100644 Java/src/main/java/com/gildedrose/SulfurasItem.java create mode 100644 Java/src/main/java/com/gildedrose/SulfurasItemHandler.java diff --git a/Java/pom.xml b/Java/pom.xml index 3bd6aff8..9ed838ed 100644 --- a/Java/pom.xml +++ b/Java/pom.xml @@ -40,6 +40,20 @@ maven-surefire-plugin ${maven.maven-surefire-plugin.version} + + org.apache.maven.plugins + maven-compiler-plugin + + 9 + 9 + + + + com.hubspot.maven.plugins + prettier-maven-plugin + + 0.8 + diff --git a/Java/src/main/java/com/gildedrose/AgedBrieItem.java b/Java/src/main/java/com/gildedrose/AgedBrieItem.java deleted file mode 100644 index 410635b6..00000000 --- a/Java/src/main/java/com/gildedrose/AgedBrieItem.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.gildedrose; - -public class AgedBrieItem { - public static void handleDay(Item item) { - if (item.quality != 50) { - item.quality += 1; - } - item.sellIn -= 1; - } -} diff --git a/Java/src/main/java/com/gildedrose/AgedBrieItemHandler.java b/Java/src/main/java/com/gildedrose/AgedBrieItemHandler.java new file mode 100644 index 00000000..a0eb58f0 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/AgedBrieItemHandler.java @@ -0,0 +1,14 @@ +package com.gildedrose; + +public class AgedBrieItemHandler extends ItemHandler { + + public AgedBrieItemHandler() {} + + @Override + public void handleDay(Item item) { + if (item.quality != 50) { + item.quality += 1; + } + item.sellIn -= 1; + } +} diff --git a/Java/src/main/java/com/gildedrose/BackstagePassesItem.java b/Java/src/main/java/com/gildedrose/BackstagePassesItem.java deleted file mode 100644 index fd8cf19b..00000000 --- a/Java/src/main/java/com/gildedrose/BackstagePassesItem.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.gildedrose; - -public class BackstagePassesItem { - public static void handleDay(Item item) { - // todo: make it so these items can't be initialized with over 50 - if (item.quality == 50) { - return; - } - if (item.sellIn == 0) { - item.quality = 0; - } else if (item.sellIn <= 5) { - item.quality += 3; - } else if (item.sellIn <= 10) { - item.quality += 2; - } - item.sellIn -= 1; - } -} diff --git a/Java/src/main/java/com/gildedrose/BackstagePassesItemHandler.java b/Java/src/main/java/com/gildedrose/BackstagePassesItemHandler.java new file mode 100644 index 00000000..337031ff --- /dev/null +++ b/Java/src/main/java/com/gildedrose/BackstagePassesItemHandler.java @@ -0,0 +1,20 @@ +package com.gildedrose; + +public class BackstagePassesItemHandler extends ItemHandler { + + @Override + public void handleDay(Item item) { + // todo: make it so these items can't be initialized with over 50 + if (item.quality == 50) { + return; + } + if (item.sellIn == 0) { + item.quality = 0; + } else if (item.sellIn <= 5) { + item.quality += 3; + } else if (item.sellIn <= 10) { + item.quality += 2; + } + item.sellIn -= 1; + } +} diff --git a/Java/src/main/java/com/gildedrose/GenericItem.java b/Java/src/main/java/com/gildedrose/GenericItemHandler.java similarity index 63% rename from Java/src/main/java/com/gildedrose/GenericItem.java rename to Java/src/main/java/com/gildedrose/GenericItemHandler.java index a7f5c942..beba8258 100644 --- a/Java/src/main/java/com/gildedrose/GenericItem.java +++ b/Java/src/main/java/com/gildedrose/GenericItemHandler.java @@ -1,7 +1,9 @@ package com.gildedrose; -public class GenericItem { - public static void handleDay(Item item) { +public class GenericItemHandler extends ItemHandler { + + @Override + public void handleDay(Item item) { item.sellIn -= 1; if (item.quality == 0) { return; diff --git a/Java/src/main/java/com/gildedrose/GildedRose.java b/Java/src/main/java/com/gildedrose/GildedRose.java index 61587415..f3d98db6 100644 --- a/Java/src/main/java/com/gildedrose/GildedRose.java +++ b/Java/src/main/java/com/gildedrose/GildedRose.java @@ -1,35 +1,45 @@ package com.gildedrose; +import java.lang.reflect.InvocationTargetException; import java.util.Arrays; import java.util.List; +import java.util.Map; class GildedRose { public static final String AGED_BRIE = "Aged Brie"; public static final String SULFURAS = "Sulfuras, Hand of Ragnaros"; - public static final String BACKSTAGE_PASSES = "Backstage passes to a TAFKAL80ETC concert"; - - final List items; + public static final String BACKSTAGE_PASSES = + "Backstage passes to a TAFKAL80ETC concert"; + private static Map> itemHandlerMap = Map.of( + AGED_BRIE, + AgedBrieItemHandler.class, + SULFURAS, + SulfurasItemHandler.class, + BACKSTAGE_PASSES, + BackstagePassesItemHandler.class + ); + // make package-private + public final List items; public GildedRose(Item[] items) { this.items = Arrays.asList(items); } + // todo: refactor this to use Guice + private static void handleDay(Item item) { + // todo: refactor to use enum + try { + ItemHandler itemHandler = itemHandlerMap + .getOrDefault(item.name, GenericItemHandler.class) + .getDeclaredConstructor() + .newInstance(); + itemHandler.handleDay(item); + } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { + throw new RuntimeException(e); + } + } + public void updateQuality() { items.forEach(GildedRose::handleDay); } - - private static void handleDay(Item item) { - switch (item.name) { - case AGED_BRIE: - AgedBrieItem.handleDay(item); - return; - case SULFURAS: - return; - case BACKSTAGE_PASSES: - BackstagePassesItem.handleDay(item); - return; - default: - GenericItem.handleDay(item); - } - } } diff --git a/Java/src/main/java/com/gildedrose/Item.java b/Java/src/main/java/com/gildedrose/Item.java index 465729ec..8728dcf7 100644 --- a/Java/src/main/java/com/gildedrose/Item.java +++ b/Java/src/main/java/com/gildedrose/Item.java @@ -1,21 +1,20 @@ package com.gildedrose; public class Item { + public String name; - public String name; + public int sellIn; - public int sellIn; + public int quality; - public int quality; + public Item(String name, int sellIn, int quality) { + this.name = name; + this.sellIn = sellIn; + this.quality = quality; + } - public Item(String name, int sellIn, int quality) { - this.name = name; - this.sellIn = sellIn; - this.quality = quality; - } - - @Override - public String toString() { - return this.name + ", " + this.sellIn + ", " + this.quality; - } + @Override + public String toString() { + return this.name + ", " + this.sellIn + ", " + this.quality; + } } diff --git a/Java/src/main/java/com/gildedrose/ItemHandler.java b/Java/src/main/java/com/gildedrose/ItemHandler.java new file mode 100644 index 00000000..2395d81d --- /dev/null +++ b/Java/src/main/java/com/gildedrose/ItemHandler.java @@ -0,0 +1,6 @@ +package com.gildedrose; + +public abstract class ItemHandler { + + public void handleDay(Item item) {} +} diff --git a/Java/src/main/java/com/gildedrose/ItemType.java b/Java/src/main/java/com/gildedrose/ItemType.java new file mode 100644 index 00000000..02d73908 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/ItemType.java @@ -0,0 +1,3 @@ +package com.gildedrose; + +public enum ItemType {} diff --git a/Java/src/main/java/com/gildedrose/SulfurasItem.java b/Java/src/main/java/com/gildedrose/SulfurasItem.java deleted file mode 100644 index 7aaef7cb..00000000 --- a/Java/src/main/java/com/gildedrose/SulfurasItem.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.gildedrose; - -public class SulfurasItem { -} diff --git a/Java/src/main/java/com/gildedrose/SulfurasItemHandler.java b/Java/src/main/java/com/gildedrose/SulfurasItemHandler.java new file mode 100644 index 00000000..935b6abc --- /dev/null +++ b/Java/src/main/java/com/gildedrose/SulfurasItemHandler.java @@ -0,0 +1,3 @@ +package com.gildedrose; + +public class SulfurasItemHandler extends ItemHandler {} diff --git a/Java/src/test/java/com/gildedrose/GildedRoseTest.java b/Java/src/test/java/com/gildedrose/GildedRoseTest.java index 975bf66a..0a9f10f1 100644 --- a/Java/src/test/java/com/gildedrose/GildedRoseTest.java +++ b/Java/src/test/java/com/gildedrose/GildedRoseTest.java @@ -1,15 +1,15 @@ package com.gildedrose; -import org.junit.jupiter.api.Test; - import static org.junit.jupiter.api.Assertions.assertEquals; +import org.junit.jupiter.api.Test; + class GildedRoseTest { private static final int SULFURAS_QUALITY = 80; @Test public void agedBrieIncreasesInQualityByOneEachDay() { - Item[] items = new Item[]{new Item(GildedRose.AGED_BRIE, 2, 0)}; + Item[] items = new Item[] { new Item(GildedRose.AGED_BRIE, 2, 0) }; GildedRose app = new GildedRose(items); app.updateQuality(); assertEquals(app.items.get(0).quality, 1); @@ -20,7 +20,9 @@ class GildedRoseTest { @Test public void sulfurasSellInDateNeverChanges() { int sellIn = 10; - Item[] items = new Item[]{new Item(GildedRose.SULFURAS, sellIn, SULFURAS_QUALITY)}; + Item[] items = new Item[] { + new Item(GildedRose.SULFURAS, sellIn, SULFURAS_QUALITY) + }; GildedRose app = new GildedRose(items); app.updateQuality(); assertEquals(app.items.get(0).sellIn, sellIn); @@ -30,7 +32,9 @@ class GildedRoseTest { @Test public void sulfurasValueNeverChanges() { - Item[] items = new Item[]{new Item(GildedRose.SULFURAS, 10, SULFURAS_QUALITY)}; + Item[] items = new Item[] { + new Item(GildedRose.SULFURAS, 10, SULFURAS_QUALITY) + }; GildedRose app = new GildedRose(items); app.updateQuality(); assertEquals(app.items.get(0).quality, SULFURAS_QUALITY); @@ -40,7 +44,9 @@ class GildedRoseTest { @Test public void sulfurasValueIsAlways80() { - Item[] items = new Item[]{new Item(GildedRose.SULFURAS, 10, SULFURAS_QUALITY)}; + Item[] items = new Item[] { + new Item(GildedRose.SULFURAS, 10, SULFURAS_QUALITY) + }; GildedRose app = new GildedRose(items); app.updateQuality(); assertEquals(app.items.get(0).quality, SULFURAS_QUALITY); @@ -49,7 +55,9 @@ class GildedRoseTest { @Test public void backstagePassesQualityIncreasesByTwoWhenThereAreTenDaysOrLessBeforeTheConcert() { int quality = 0; - Item[] items = new Item[]{new Item(GildedRose.BACKSTAGE_PASSES, 10, quality)}; + Item[] items = new Item[] { + new Item(GildedRose.BACKSTAGE_PASSES, 10, quality) + }; GildedRose app = new GildedRose(items); app.updateQuality(); assertEquals(app.items.get(0).quality, 2); @@ -60,7 +68,9 @@ class GildedRoseTest { @Test public void backstagePassesQualityIncreasesByThreeWhenThereAreFiveDaysOrLessBeforeTheConcert() { int quality = 0; - Item[] items = new Item[]{new Item(GildedRose.BACKSTAGE_PASSES, 5, quality)}; + Item[] items = new Item[] { + new Item(GildedRose.BACKSTAGE_PASSES, 5, quality) + }; GildedRose app = new GildedRose(items); app.updateQuality(); assertEquals(app.items.get(0).quality, 3); @@ -73,7 +83,9 @@ class GildedRoseTest { @Test public void backstagePassesQualityDropsToZeroAfterTheConcert() { int quality = 10; - Item[] items = new Item[]{new Item(GildedRose.BACKSTAGE_PASSES, 1, quality)}; + Item[] items = new Item[] { + new Item(GildedRose.BACKSTAGE_PASSES, 1, quality) + }; GildedRose app = new GildedRose(items); app.updateQuality(); assertEquals(app.items.get(0).quality, 13); @@ -85,7 +97,7 @@ class GildedRoseTest { public void qualityIsNeverNegativeForGenericItems() { // todo: should add a similar case for conjured int quality = 1; - Item[] items = new Item[]{new Item("generic item", 5, quality)}; + Item[] items = new Item[] { new Item("generic item", 5, quality) }; GildedRose app = new GildedRose(items); app.updateQuality(); assertEquals(app.items.get(0).quality, 0); @@ -97,7 +109,7 @@ class GildedRoseTest { @Test public void qualityIsNeverOverFiftyForAgedBrie() { - Item[] items = new Item[]{new Item(GildedRose.AGED_BRIE, 5, 50)}; + Item[] items = new Item[] { new Item(GildedRose.AGED_BRIE, 5, 50) }; GildedRose app = new GildedRose(items); app.updateQuality(); assertEquals(app.items.get(0).quality, 50); @@ -109,7 +121,7 @@ class GildedRoseTest { @Test public void qualityIsNeverOverFiftyForBackstagePasses() { - Item[] items = new Item[]{new Item(GildedRose.BACKSTAGE_PASSES, 5, 50)}; + Item[] items = new Item[] { new Item(GildedRose.BACKSTAGE_PASSES, 5, 50) }; GildedRose app = new GildedRose(items); app.updateQuality(); assertEquals(app.items.get(0).quality, 50); @@ -121,7 +133,7 @@ class GildedRoseTest { @Test public void qualityDecreasesByOneEachDayForGenericItems() { - Item[] items = new Item[]{new Item("generic item", 5, 5)}; + Item[] items = new Item[] { new Item("generic item", 5, 5) }; GildedRose app = new GildedRose(items); app.updateQuality(); assertEquals(app.items.get(0).quality, 4); @@ -133,7 +145,7 @@ class GildedRoseTest { @Test public void qualityDecreasesByTwoEachDayForGenericItemsAfterSellInDate() { - Item[] items = new Item[]{new Item("generic item", 1, 6)}; + Item[] items = new Item[] { new Item("generic item", 1, 6) }; GildedRose app = new GildedRose(items); app.updateQuality(); assertEquals(app.items.get(0).quality, 5); @@ -145,7 +157,7 @@ class GildedRoseTest { @Test public void sellInDateDecreasesByOneEachDayForAgedBrie() { - Item[] items = new Item[]{new Item(GildedRose.AGED_BRIE, 5, 1)}; + Item[] items = new Item[] { new Item(GildedRose.AGED_BRIE, 5, 1) }; GildedRose app = new GildedRose(items); app.updateQuality(); assertEquals(app.items.get(0).sellIn, 4); @@ -157,7 +169,7 @@ class GildedRoseTest { @Test public void sellInDateDecreasesByOneEachDayForBackstagePasses() { - Item[] items = new Item[]{new Item(GildedRose.BACKSTAGE_PASSES, 5, 1)}; + Item[] items = new Item[] { new Item(GildedRose.BACKSTAGE_PASSES, 5, 1) }; GildedRose app = new GildedRose(items); app.updateQuality(); assertEquals(app.items.get(0).sellIn, 4); @@ -169,7 +181,7 @@ class GildedRoseTest { @Test public void sellInDateDecreasesByOneEachDayForGenericItems() { - Item[] items = new Item[]{new Item("generic item", 5, 1)}; + Item[] items = new Item[] { new Item("generic item", 5, 1) }; GildedRose app = new GildedRose(items); app.updateQuality(); assertEquals(app.items.get(0).sellIn, 4); @@ -181,7 +193,7 @@ class GildedRoseTest { @Test public void sellInDateCanBeNegativeForGenericItems() { - Item[] items = new Item[]{new Item("generic item", 1, 1)}; + Item[] items = new Item[] { new Item("generic item", 1, 1) }; GildedRose app = new GildedRose(items); app.updateQuality(); assertEquals(app.items.get(0).sellIn, 0); @@ -193,7 +205,7 @@ class GildedRoseTest { @Test public void sellInDateCanBeNegativeForAgedBrie() { - Item[] items = new Item[]{new Item(GildedRose.AGED_BRIE, 1, 1)}; + Item[] items = new Item[] { new Item(GildedRose.AGED_BRIE, 1, 1) }; GildedRose app = new GildedRose(items); app.updateQuality(); assertEquals(app.items.get(0).sellIn, 0); @@ -205,7 +217,7 @@ class GildedRoseTest { @Test public void sellInDateCanBeNegativeForBackStagePasses() { - Item[] items = new Item[]{new Item(GildedRose.BACKSTAGE_PASSES, 1, 1)}; + Item[] items = new Item[] { new Item(GildedRose.BACKSTAGE_PASSES, 1, 1) }; GildedRose app = new GildedRose(items); app.updateQuality(); assertEquals(app.items.get(0).sellIn, 0); @@ -217,7 +229,7 @@ class GildedRoseTest { @Test public void itUpdatesAllItemsPassedIn() { - Item[] items = new Item[]{ + Item[] items = new Item[] { new Item("generic item 1", 5, 5), new Item("generic item 2", 5, 10) }; diff --git a/Java/src/test/java/com/gildedrose/TexttestFixture.java b/Java/src/test/java/com/gildedrose/TexttestFixture.java index 35060206..6bb4490a 100644 --- a/Java/src/test/java/com/gildedrose/TexttestFixture.java +++ b/Java/src/test/java/com/gildedrose/TexttestFixture.java @@ -1,35 +1,36 @@ package com.gildedrose; public class TexttestFixture { - public static void main(String[] args) { - 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) }; - GildedRose app = new GildedRose(items); + public static void main(String[] args) { + 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) + }; - int days = 2; - if (args.length > 0) { - days = Integer.parseInt(args[0]) + 1; - } + GildedRose app = new GildedRose(items); - for (int i = 0; i < days; i++) { - System.out.println("-------- day " + i + " --------"); - System.out.println("name, sellIn, quality"); - for (Item item : items) { - System.out.println(item); - } - System.out.println(); - app.updateQuality(); - } + int days = 2; + if (args.length > 0) { + days = Integer.parseInt(args[0]) + 1; } + for (int i = 0; i < days; i++) { + System.out.println("-------- day " + i + " --------"); + System.out.println("name, sellIn, quality"); + for (Item item : items) { + System.out.println(item); + } + System.out.println(); + app.updateQuality(); + } + } }