Extract the standard Gilded Rose item behaviour

This commit is contained in:
rverlind 2023-12-05 22:06:08 +01:00
parent 31d2cb5a7b
commit ce308107f2
6 changed files with 149 additions and 50 deletions

View File

@ -1,5 +1,10 @@
package com.gildedrose; package com.gildedrose;
import com.gildedrose.items.GildedRoseItem;
import com.gildedrose.items.GildedRoseItemFactory;
import java.util.Arrays;
class GildedRose { class GildedRose {
Item[] items; Item[] items;
@ -8,55 +13,11 @@ class GildedRose {
} }
public void updateQuality() { public void updateQuality() {
for (int i = 0; i < items.length; i++) { items = Arrays.stream(items)
if (!items[i].name.equals("Aged Brie") .map(GildedRoseItemFactory::create)
&& !items[i].name.equals("Backstage passes to a TAFKAL80ETC concert")) { .map(GildedRoseItem::updateQuality)
if (items[i].quality > 0) { .map(GildedRoseItem::getItem)
if (!items[i].name.equals("Sulfuras, Hand of Ragnaros")) { .toArray(Item[]::new);
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;
}
}
}
}
} }
} }

View File

@ -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;
}
}

View File

@ -0,0 +1,10 @@
package com.gildedrose.items;
import com.gildedrose.Item;
public interface GildedRoseItem {
Item getItem();
GildedRoseItem updateQuality();
}

View File

@ -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);
}
}
}

View File

@ -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;
}
}
}
}
}

View File

@ -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;
}
}