From 5f8918b3f0ef3077a594ca65f16e09f783c3ccb6 Mon Sep 17 00:00:00 2001 From: Xavier Levaux Date: Fri, 25 Sep 2020 09:15:45 +0200 Subject: [PATCH] Refactored quality update using strategy and factory patterns --- Java/build.gradle | 1 + .../gildedrose/AgedBrieQualityUpdater.java | 26 +++++++ .../BackstageBrieQualityUpdater.java | 36 ++++++++++ .../com/gildedrose/DefaultQualityUpdater.java | 25 +++++++ .../main/java/com/gildedrose/GildedRose.java | 67 ++++--------------- .../ItemQualityUpdateStrategyFactory.java | 12 ++++ .../com/gildedrose/ItemQualityUpdater.java | 5 ++ .../com/gildedrose/SulfrasQualityUpdater.java | 13 ++++ .../ItemQualityUpdateStrategyFactoryTest.java | 23 +++++++ 9 files changed, 155 insertions(+), 53 deletions(-) create mode 100644 Java/src/main/java/com/gildedrose/AgedBrieQualityUpdater.java create mode 100644 Java/src/main/java/com/gildedrose/BackstageBrieQualityUpdater.java create mode 100644 Java/src/main/java/com/gildedrose/DefaultQualityUpdater.java create mode 100644 Java/src/main/java/com/gildedrose/ItemQualityUpdateStrategyFactory.java create mode 100644 Java/src/main/java/com/gildedrose/ItemQualityUpdater.java create mode 100644 Java/src/main/java/com/gildedrose/SulfrasQualityUpdater.java create mode 100644 Java/src/test/java/com/gildedrose/ItemQualityUpdateStrategyFactoryTest.java diff --git a/Java/build.gradle b/Java/build.gradle index 24fb40d5..a693c89d 100644 --- a/Java/build.gradle +++ b/Java/build.gradle @@ -11,6 +11,7 @@ dependencies { testImplementation 'org.junit.jupiter:junit-jupiter-params:5.7.0' testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.7.0' testImplementation 'com.approvaltests:approvaltests:9.3.0' + testCompile group: 'org.assertj', name: 'assertj-core', version: '3.17.2' } group = 'com.gildedrose' diff --git a/Java/src/main/java/com/gildedrose/AgedBrieQualityUpdater.java b/Java/src/main/java/com/gildedrose/AgedBrieQualityUpdater.java new file mode 100644 index 00000000..9c029d4c --- /dev/null +++ b/Java/src/main/java/com/gildedrose/AgedBrieQualityUpdater.java @@ -0,0 +1,26 @@ +package com.gildedrose; + +public class AgedBrieQualityUpdater implements ItemQualityUpdater { + + private final Item item; + + public AgedBrieQualityUpdater(Item item) { + this.item = item; + } + + @Override + public void updateQuality() { + if (item.quality < 50) { + item.quality = item.quality + 1; + } + + item.sellIn = item.sellIn - 1; + + if (item.sellIn < 0) { + if (item.quality < 50) { + item.quality = item.quality + 1; + } + } + + } +} diff --git a/Java/src/main/java/com/gildedrose/BackstageBrieQualityUpdater.java b/Java/src/main/java/com/gildedrose/BackstageBrieQualityUpdater.java new file mode 100644 index 00000000..5558616f --- /dev/null +++ b/Java/src/main/java/com/gildedrose/BackstageBrieQualityUpdater.java @@ -0,0 +1,36 @@ +package com.gildedrose; + +public class BackstageBrieQualityUpdater implements ItemQualityUpdater { + + private final Item item; + + public BackstageBrieQualityUpdater(Item item) { + this.item = item; + } + + @Override + public void updateQuality() { + 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/DefaultQualityUpdater.java b/Java/src/main/java/com/gildedrose/DefaultQualityUpdater.java new file mode 100644 index 00000000..de46c85e --- /dev/null +++ b/Java/src/main/java/com/gildedrose/DefaultQualityUpdater.java @@ -0,0 +1,25 @@ +package com.gildedrose; + +public class DefaultQualityUpdater implements ItemQualityUpdater { + + private final Item item; + + public DefaultQualityUpdater(Item item) { + this.item = item; + } + + @Override + public void updateQuality() { + if (item.quality > 0) { + item.quality = item.quality - 1; + } + + item.sellIn = item.sellIn - 1; + + if (item.sellIn < 0) { + if (item.quality > 0) { + item.quality = item.quality - 1; + } + } + } +} diff --git a/Java/src/main/java/com/gildedrose/GildedRose.java b/Java/src/main/java/com/gildedrose/GildedRose.java index e6feb751..eabd2eea 100644 --- a/Java/src/main/java/com/gildedrose/GildedRose.java +++ b/Java/src/main/java/com/gildedrose/GildedRose.java @@ -1,62 +1,23 @@ package com.gildedrose; +import static com.gildedrose.ItemQualityUpdateStrategyFactory.itemQualityUpdaterFor; + +import java.util.Arrays; + class GildedRose { - Item[] items; - public GildedRose(Item[] items) { - this.items = items; - } + Item[] 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 GildedRose(Item[] items) { + this.items = items; + } - 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; - } - } + public void updateQuality() { + Arrays.stream(items).forEach(this::updateQuality); + } - if (items[i].sellIn < 6) { - if (items[i].quality < 50) { - items[i].quality = items[i].quality + 1; - } - } - } - } - } + private void updateQuality(Item item) { + itemQualityUpdaterFor(item).updateQuality(); + } - 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; - } - } - } - } - } } \ No newline at end of file diff --git a/Java/src/main/java/com/gildedrose/ItemQualityUpdateStrategyFactory.java b/Java/src/main/java/com/gildedrose/ItemQualityUpdateStrategyFactory.java new file mode 100644 index 00000000..2d32e207 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/ItemQualityUpdateStrategyFactory.java @@ -0,0 +1,12 @@ +package com.gildedrose; + +public class ItemQualityUpdateStrategyFactory { + public static ItemQualityUpdater itemQualityUpdaterFor(Item item) { + switch (item.name) { + case "Sulfuras, Hand of Ragnaros": return new SulfrasQualityUpdater(item); + case "Aged Brie": return new AgedBrieQualityUpdater(item); + case "Backstage passes to a TAFKAL80ETC concert": return new BackstageBrieQualityUpdater(item); + default: return new DefaultQualityUpdater(item); + } + } +} diff --git a/Java/src/main/java/com/gildedrose/ItemQualityUpdater.java b/Java/src/main/java/com/gildedrose/ItemQualityUpdater.java new file mode 100644 index 00000000..e1d0bd91 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/ItemQualityUpdater.java @@ -0,0 +1,5 @@ +package com.gildedrose; + +public interface ItemQualityUpdater { + void updateQuality(); +} diff --git a/Java/src/main/java/com/gildedrose/SulfrasQualityUpdater.java b/Java/src/main/java/com/gildedrose/SulfrasQualityUpdater.java new file mode 100644 index 00000000..a840fdab --- /dev/null +++ b/Java/src/main/java/com/gildedrose/SulfrasQualityUpdater.java @@ -0,0 +1,13 @@ +package com.gildedrose; + +public class SulfrasQualityUpdater implements ItemQualityUpdater { + + private final Item item; + + public SulfrasQualityUpdater(Item item) { + this.item = item; + } + + public void updateQuality() { + } +} diff --git a/Java/src/test/java/com/gildedrose/ItemQualityUpdateStrategyFactoryTest.java b/Java/src/test/java/com/gildedrose/ItemQualityUpdateStrategyFactoryTest.java new file mode 100644 index 00000000..9a2404e3 --- /dev/null +++ b/Java/src/test/java/com/gildedrose/ItemQualityUpdateStrategyFactoryTest.java @@ -0,0 +1,23 @@ +package com.gildedrose; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.Test; + +class ItemQualityUpdateStrategyFactoryTest { + + @Test + void itemQualityUpdaterFor() { + testFactoryFor("Sulfuras, Hand of Ragnaros", SulfrasQualityUpdater.class); + testFactoryFor("Aged Brie", AgedBrieQualityUpdater.class); + testFactoryFor("Backstage passes to a TAFKAL80ETC concert", BackstageBrieQualityUpdater.class); + testFactoryFor("xyz", DefaultQualityUpdater.class); + } + + void testFactoryFor(String name, Class clazz) { + ItemQualityUpdater qualityUpdater = ItemQualityUpdateStrategyFactory + .itemQualityUpdaterFor(new Item(name, 0, 0)); + assertThat(qualityUpdater).isInstanceOf(clazz); + } + +} \ No newline at end of file