introduces Template Pattern with abstract class CustomisedItem

This commit is contained in:
Gabba 2018-01-15 17:37:04 +00:00
parent 9b308c8e22
commit 77e9669f6e
9 changed files with 134 additions and 66 deletions

View File

@ -1,9 +1,7 @@
package com.gildedrose; package com.gildedrose;
import com.gildedrose.item.CustomisedItem;
import com.gildedrose.item.Item; import com.gildedrose.item.Item;
import com.gildedrose.item.CustomisedItemFactory; import com.gildedrose.item.CustomisedItemFactory;
import com.gildedrose.item.QualityValues;
class GildedRose { class GildedRose {
@ -17,20 +15,7 @@ class GildedRose {
public void updateQuality() { public void updateQuality() {
for (Item item : items) { for (Item item : items) {
itemFactory.customiseItem(item).updateState(); itemFactory.customiseItem(item).updateState(item);
if (hasReachedLowestQualityValue(item)) {
item.quality = QualityValues.lowestValuePossible();
} else if (hasReachedHighestQualityValue(item)) {
item.quality = QualityValues.highestValuePossible(item);
}
} }
} }
private boolean hasReachedLowestQualityValue(Item item) {
return item.quality < QualityValues.lowestValuePossible();
}
private boolean hasReachedHighestQualityValue(Item item) {
return item.quality > QualityValues.highestValuePossible(item);
}
} }

View File

@ -1,6 +1,6 @@
package com.gildedrose.item; package com.gildedrose.item;
public class AgedBrie implements CustomisedItem { public class AgedBrie extends CustomisedItem {
private final Item item; private final Item item;
@ -8,16 +8,23 @@ public class AgedBrie implements CustomisedItem {
this.item = item; this.item = item;
} }
public void updateState() { @Override
decreaseSellByDayValueByOne(); int updatedItemSellIn() {
increaseQualityByOne(); return item.sellIn -= 1;
} }
private void decreaseSellByDayValueByOne() { @Override
item.sellIn -= 1; int updatedItemQuality() {
return item.quality += 1;
} }
private void increaseQualityByOne() { @Override
item.quality += 1; protected boolean hasReachedHighestQualityValue() {
return item.quality > QualityValues.highestValuePossible(item);
}
@Override
protected boolean hasReachedLowestQualityValue() {
return item.quality < QualityValues.lowestValuePossible();
} }
} }

View File

@ -1,6 +1,6 @@
package com.gildedrose.item; package com.gildedrose.item;
public class BackstagePassesItem implements CustomisedItem { public class BackstagePassesItem extends CustomisedItem {
private final Item item; private final Item item;
@ -8,32 +8,43 @@ public class BackstagePassesItem implements CustomisedItem {
this.item = item; this.item = item;
} }
public void updateState() { @Override
decreaseSellByDayValueByOne(); int updatedItemSellIn() {
return item.sellIn -= 1;
}
@Override
int updatedItemQuality() {
if (sellByDayValueIsOver(10)) { if (sellByDayValueIsOver(10)) {
increaseQualityBy(1); return qualityIncreasedBy(1);
} else if (sellByDayValueIsOver(5)) { } else if (sellByDayValueIsOver(5)) {
increaseQualityBy(2); return qualityIncreasedBy(2);
} else if (sellByDayValueIsOver(0)) { } else if (sellByDayValueIsOver(0)) {
increaseQualityBy(3); return qualityIncreasedBy(3);
} else { } else {
dropQualityToZero(); return qualityDroppedToZero();
} }
} }
private void decreaseSellByDayValueByOne() { @Override
item.sellIn -= 1; protected boolean hasReachedHighestQualityValue() {
return item.quality > QualityValues.highestValuePossible(item);
}
@Override
protected boolean hasReachedLowestQualityValue() {
return item.quality < QualityValues.lowestValuePossible();
} }
private boolean sellByDayValueIsOver(int dayNumber) { private boolean sellByDayValueIsOver(int dayNumber) {
return item.sellIn > dayNumber; return item.sellIn > dayNumber;
} }
private void increaseQualityBy(int qualityValue) { private int qualityIncreasedBy(int qualityValue) {
item.quality += qualityValue; return item.quality += qualityValue;
} }
private void dropQualityToZero() { private int qualityDroppedToZero() {
item.quality = 0; return 0;
} }
} }

View File

@ -1,13 +1,38 @@
package com.gildedrose.item; package com.gildedrose.item;
public class ConjuredItem extends StandardItem { public class ConjuredItem extends CustomisedItem {
private final Item item;
public ConjuredItem(Item item) { public ConjuredItem(Item item) {
super(item); this.item = item;
} }
@Override @Override
public int decreasingValueOverZeroDaysToSell() { protected boolean hasReachedHighestQualityValue() {
return 2; return item.quality > QualityValues.highestValuePossible(item);
}
@Override
protected boolean hasReachedLowestQualityValue() {
return item.quality < QualityValues.lowestValuePossible();
}
@Override
int updatedItemSellIn() {
return item.sellIn -= 1;
}
@Override
int updatedItemQuality() {
if (sellByDayValueIsOverZero()) {
return item.quality -= 2;
} else {
return item.quality -= 4;
}
}
private boolean sellByDayValueIsOverZero() {
return item.sellIn > 0;
} }
} }

View File

@ -1,5 +1,23 @@
package com.gildedrose.item; package com.gildedrose.item;
public interface CustomisedItem { public abstract class CustomisedItem {
void updateState();
public final void updateState(Item item) {
item.sellIn = updatedItemSellIn();
item.quality = updatedItemQuality();
if (hasReachedLowestQualityValue()) {
item.quality = QualityValues.lowestValuePossible();
} else if (hasReachedHighestQualityValue()) {
item.quality = QualityValues.highestValuePossible(item);
}
}
abstract int updatedItemSellIn();
abstract int updatedItemQuality();
protected abstract boolean hasReachedHighestQualityValue();
protected abstract boolean hasReachedLowestQualityValue();
} }

View File

@ -13,7 +13,7 @@ public class CustomisedItemFactory {
public final static String CONJURED_ITEM = "Conjured"; public final static String CONJURED_ITEM = "Conjured";
public CustomisedItemFactory() { public CustomisedItemFactory() {
ITEM_TYPES_LIST.put(SULFURAS, (item) -> new Sulfuras()); ITEM_TYPES_LIST.put(SULFURAS, Sulfuras::new);
ITEM_TYPES_LIST.put(BRIE, AgedBrie::new); ITEM_TYPES_LIST.put(BRIE, AgedBrie::new);
ITEM_TYPES_LIST.put(BACKSTAGE_PASSES_ITEM, BackstagePassesItem::new); ITEM_TYPES_LIST.put(BACKSTAGE_PASSES_ITEM, BackstagePassesItem::new);
ITEM_TYPES_LIST.put(CONJURED_ITEM, ConjuredItem::new); ITEM_TYPES_LIST.put(CONJURED_ITEM, ConjuredItem::new);

View File

@ -1,6 +1,6 @@
package com.gildedrose.item; package com.gildedrose.item;
public class StandardItem implements CustomisedItem { public class StandardItem extends CustomisedItem {
private final Item item; private final Item item;
@ -8,32 +8,31 @@ public class StandardItem implements CustomisedItem {
this.item = item; this.item = item;
} }
public void updateState() { @Override
decreaseSellByDayValueByOne(); int updatedItemSellIn() {
return item.sellIn -= 1;
}
@Override
int updatedItemQuality() {
if (sellByDayValueIsOverZero()) { if (sellByDayValueIsOverZero()) {
decreaseQualityBy(decreasingValueOverZeroDaysToSell()); return item.quality -= 1;
} else { } else {
decreaseQualityBy(decreasingValueForZeroOrLessDaysToSell()); return item.quality -= 2;
} }
} }
public int decreasingValueOverZeroDaysToSell() { @Override
return 1; protected boolean hasReachedHighestQualityValue() {
return item.quality > QualityValues.highestValuePossible(item);
} }
private void decreaseSellByDayValueByOne() { @Override
item.sellIn -= 1; protected boolean hasReachedLowestQualityValue() {
return item.quality < QualityValues.lowestValuePossible();
} }
private boolean sellByDayValueIsOverZero() { private boolean sellByDayValueIsOverZero() {
return item.sellIn > 0; return item.sellIn > 0;
} }
private void decreaseQualityBy(int qualityValue) {
item.quality -= qualityValue;
}
private int decreasingValueForZeroOrLessDaysToSell() {
return decreasingValueOverZeroDaysToSell() * 2;
}
} }

View File

@ -1,7 +1,30 @@
package com.gildedrose.item; package com.gildedrose.item;
public class Sulfuras implements CustomisedItem { public class Sulfuras extends CustomisedItem {
public void updateState() { private final Item item;
public Sulfuras(Item item) {
this.item = item;
}
@Override
int updatedItemSellIn() {
return item.sellIn;
}
@Override
int updatedItemQuality() {
return item.quality;
}
@Override
protected boolean hasReachedHighestQualityValue() {
return item.quality > QualityValues.highestValuePossible(item) ;
}
@Override
protected boolean hasReachedLowestQualityValue() {
return item.quality < QualityValues.lowestValuePossible();
} }
} }

View File

@ -74,7 +74,7 @@ public class GildedRoseTest {
} }
@Test @Test
public void backstagePassesItemDecreasesQualityByOneIfSellByDayMoreThanEleven() { public void backstagePassesItemIncreasesQualityByOneIfSellByDayMoreThanEleven() {
GildedRose app = newGildedRose(CustomisedItemFactory.BACKSTAGE_PASSES_ITEM, 12, 1); GildedRose app = newGildedRose(CustomisedItemFactory.BACKSTAGE_PASSES_ITEM, 12, 1);
app.updateQuality(); app.updateQuality();
@ -83,7 +83,7 @@ public class GildedRoseTest {
} }
@Test @Test
public void backstagePassesItemDecreasesQualityByTwoIfSellByDayIsMoreThanSix() { public void backstagePassesItemIncreasesQualityByTwoIfSellByDayIsMoreThanSix() {
GildedRose app = newGildedRose(CustomisedItemFactory.BACKSTAGE_PASSES_ITEM, 10, 1); GildedRose app = newGildedRose(CustomisedItemFactory.BACKSTAGE_PASSES_ITEM, 10, 1);
app.updateQuality(); app.updateQuality();
@ -92,7 +92,7 @@ public class GildedRoseTest {
} }
@Test @Test
public void backstagePassesItemDecreasesQualityByThreeIfSellByDayIsMoreThanZero() { public void backstagePassesItemIncreasesQualityByThreeIfSellByDayIsMoreThanZero() {
GildedRose app = newGildedRose(CustomisedItemFactory.BACKSTAGE_PASSES_ITEM, 5, 1); GildedRose app = newGildedRose(CustomisedItemFactory.BACKSTAGE_PASSES_ITEM, 5, 1);
app.updateQuality(); app.updateQuality();