diff --git a/Java/src/main/java/com/gildedrose/GildedRose.java b/Java/src/main/java/com/gildedrose/GildedRose.java index 87a3b926..489e829c 100644 --- a/Java/src/main/java/com/gildedrose/GildedRose.java +++ b/Java/src/main/java/com/gildedrose/GildedRose.java @@ -1,5 +1,10 @@ package com.gildedrose; +import com.gildedrose.items.GildedRoseItem; +import com.gildedrose.items.GildedRoseItemFactory; + +import java.util.Arrays; + class GildedRose { Item[] items; @@ -8,55 +13,11 @@ 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; - } - } - } - } + items = Arrays.stream(items) + .map(GildedRoseItemFactory::create) + .map(GildedRoseItem::updateQuality) + .map(GildedRoseItem::getItem) + .toArray(Item[]::new); } + } diff --git a/Java/src/main/java/com/gildedrose/items/AbstractGildedRoseItem.java b/Java/src/main/java/com/gildedrose/items/AbstractGildedRoseItem.java new file mode 100644 index 00000000..1613afbe --- /dev/null +++ b/Java/src/main/java/com/gildedrose/items/AbstractGildedRoseItem.java @@ -0,0 +1,17 @@ +package com.gildedrose.items; + +import com.gildedrose.Item; + +public abstract class AbstractGildedRoseItem implements GildedRoseItem{ + + protected final Item item; + + public AbstractGildedRoseItem(Item item) { + this.item = item; + } + + @Override + public Item getItem() { + return item; + } +} diff --git a/Java/src/main/java/com/gildedrose/items/GildedRoseItem.java b/Java/src/main/java/com/gildedrose/items/GildedRoseItem.java new file mode 100644 index 00000000..f885e048 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/items/GildedRoseItem.java @@ -0,0 +1,10 @@ +package com.gildedrose.items; + +import com.gildedrose.Item; + +public interface GildedRoseItem { + + Item getItem(); + GildedRoseItem updateQuality(); + +} diff --git a/Java/src/main/java/com/gildedrose/items/GildedRoseItemFactory.java b/Java/src/main/java/com/gildedrose/items/GildedRoseItemFactory.java new file mode 100644 index 00000000..65486c4f --- /dev/null +++ b/Java/src/main/java/com/gildedrose/items/GildedRoseItemFactory.java @@ -0,0 +1,25 @@ +package com.gildedrose.items; + +import com.gildedrose.Item; + +import java.util.regex.Pattern; + +import static java.util.regex.Pattern.CASE_INSENSITIVE; + +public class GildedRoseItemFactory { + + static final Pattern LEGENDARY_NAME_PATTERN = Pattern.compile("Sulfuras.*", CASE_INSENSITIVE); + static final Pattern AGING_ITEM = Pattern.compile("", CASE_INSENSITIVE); + static final Pattern CONJURED_ITEM = Pattern.compile("Conjured.*", CASE_INSENSITIVE); + + public static GildedRoseItem create(Item item) { + if (LEGENDARY_NAME_PATTERN.matcher(item.name).matches() + || AGING_ITEM.matcher(item.name).matches() + || CONJURED_ITEM.matcher(item.name).matches()) { + return new NonStandardGildedRoseItem(item); + } else { + return new StandardGildedRoseItem(item); + } + } + +} diff --git a/Java/src/main/java/com/gildedrose/items/NonStandardGildedRoseItem.java b/Java/src/main/java/com/gildedrose/items/NonStandardGildedRoseItem.java new file mode 100644 index 00000000..1828fe25 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/items/NonStandardGildedRoseItem.java @@ -0,0 +1,67 @@ +package com.gildedrose.items; + +import com.gildedrose.Item; + +public class NonStandardGildedRoseItem extends AbstractGildedRoseItem { + + public NonStandardGildedRoseItem(Item item) { + super(item); + } + + @Override + public GildedRoseItem updateQuality() { + legacyUpdateQuality(item); + return this; + } + + public void legacyUpdateQuality(Item item) { + if (!item.name.equals("Aged Brie") + && !item.name.equals("Backstage passes to a TAFKAL80ETC concert")) { + if (item.quality > 0) { + if (!item.name.equals("Sulfuras, Hand of Ragnaros")) { + item.quality = item.quality - 1; + } + } + } else { + if (item.quality < 50) { + item.quality = item.quality + 1; + + if (item.name.equals("Backstage passes to a TAFKAL80ETC concert")) { + 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; + } + } + } + } + } + + if (!item.name.equals("Sulfuras, Hand of Ragnaros")) { + item.sellIn = item.sellIn - 1; + } + + if (item.sellIn < 0) { + if (!item.name.equals("Aged Brie")) { + if (!item.name.equals("Backstage passes to a TAFKAL80ETC concert")) { + if (item.quality > 0) { + if (!item.name.equals("Sulfuras, Hand of Ragnaros")) { + item.quality = item.quality - 1; + } + } + } else { + item.quality = item.quality - item.quality; + } + } else { + if (item.quality < 50) { + item.quality = item.quality + 1; + } + } + } + } +} diff --git a/Java/src/main/java/com/gildedrose/items/StandardGildedRoseItem.java b/Java/src/main/java/com/gildedrose/items/StandardGildedRoseItem.java new file mode 100644 index 00000000..1af16e92 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/items/StandardGildedRoseItem.java @@ -0,0 +1,19 @@ +package com.gildedrose.items; + +import com.gildedrose.Item; + +public class StandardGildedRoseItem extends AbstractGildedRoseItem { + + private final static int MAX_QUALITY = 50; + + public StandardGildedRoseItem(Item item) { + super(item); + item.quality = Math.min(item.quality, MAX_QUALITY); + } + + public GildedRoseItem updateQuality() { + item.sellIn = item.sellIn - 1; + item.quality = item.sellIn < 0 ? Math.max(item.quality - 2, 0) : Math.max(item.quality - 1, 0); + return this; + } +}