mirror of
https://github.com/emilybache/GildedRose-Refactoring-Kata.git
synced 2026-02-14 22:21:20 +00:00
introduces Template Pattern with abstract class CustomisedItem
This commit is contained in:
parent
9b308c8e22
commit
77e9669f6e
@ -1,9 +1,7 @@
|
||||
package com.gildedrose;
|
||||
|
||||
import com.gildedrose.item.CustomisedItem;
|
||||
import com.gildedrose.item.Item;
|
||||
import com.gildedrose.item.CustomisedItemFactory;
|
||||
import com.gildedrose.item.QualityValues;
|
||||
|
||||
class GildedRose {
|
||||
|
||||
@ -17,20 +15,7 @@ class GildedRose {
|
||||
|
||||
public void updateQuality() {
|
||||
for (Item item : items) {
|
||||
itemFactory.customiseItem(item).updateState();
|
||||
if (hasReachedLowestQualityValue(item)) {
|
||||
item.quality = QualityValues.lowestValuePossible();
|
||||
} else if (hasReachedHighestQualityValue(item)) {
|
||||
item.quality = QualityValues.highestValuePossible(item);
|
||||
}
|
||||
itemFactory.customiseItem(item).updateState(item);
|
||||
}
|
||||
}
|
||||
|
||||
private boolean hasReachedLowestQualityValue(Item item) {
|
||||
return item.quality < QualityValues.lowestValuePossible();
|
||||
}
|
||||
|
||||
private boolean hasReachedHighestQualityValue(Item item) {
|
||||
return item.quality > QualityValues.highestValuePossible(item);
|
||||
}
|
||||
}
|
||||
@ -1,6 +1,6 @@
|
||||
package com.gildedrose.item;
|
||||
|
||||
public class AgedBrie implements CustomisedItem {
|
||||
public class AgedBrie extends CustomisedItem {
|
||||
|
||||
private final Item item;
|
||||
|
||||
@ -8,16 +8,23 @@ public class AgedBrie implements CustomisedItem {
|
||||
this.item = item;
|
||||
}
|
||||
|
||||
public void updateState() {
|
||||
decreaseSellByDayValueByOne();
|
||||
increaseQualityByOne();
|
||||
@Override
|
||||
int updatedItemSellIn() {
|
||||
return item.sellIn -= 1;
|
||||
}
|
||||
|
||||
private void decreaseSellByDayValueByOne() {
|
||||
item.sellIn -= 1;
|
||||
@Override
|
||||
int updatedItemQuality() {
|
||||
return item.quality += 1;
|
||||
}
|
||||
|
||||
private void increaseQualityByOne() {
|
||||
item.quality += 1;
|
||||
@Override
|
||||
protected boolean hasReachedHighestQualityValue() {
|
||||
return item.quality > QualityValues.highestValuePossible(item);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean hasReachedLowestQualityValue() {
|
||||
return item.quality < QualityValues.lowestValuePossible();
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
package com.gildedrose.item;
|
||||
|
||||
public class BackstagePassesItem implements CustomisedItem {
|
||||
public class BackstagePassesItem extends CustomisedItem {
|
||||
|
||||
private final Item item;
|
||||
|
||||
@ -8,32 +8,43 @@ public class BackstagePassesItem implements CustomisedItem {
|
||||
this.item = item;
|
||||
}
|
||||
|
||||
public void updateState() {
|
||||
decreaseSellByDayValueByOne();
|
||||
@Override
|
||||
int updatedItemSellIn() {
|
||||
return item.sellIn -= 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
int updatedItemQuality() {
|
||||
if (sellByDayValueIsOver(10)) {
|
||||
increaseQualityBy(1);
|
||||
return qualityIncreasedBy(1);
|
||||
} else if (sellByDayValueIsOver(5)) {
|
||||
increaseQualityBy(2);
|
||||
return qualityIncreasedBy(2);
|
||||
} else if (sellByDayValueIsOver(0)) {
|
||||
increaseQualityBy(3);
|
||||
return qualityIncreasedBy(3);
|
||||
} else {
|
||||
dropQualityToZero();
|
||||
return qualityDroppedToZero();
|
||||
}
|
||||
}
|
||||
|
||||
private void decreaseSellByDayValueByOne() {
|
||||
item.sellIn -= 1;
|
||||
@Override
|
||||
protected boolean hasReachedHighestQualityValue() {
|
||||
return item.quality > QualityValues.highestValuePossible(item);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean hasReachedLowestQualityValue() {
|
||||
return item.quality < QualityValues.lowestValuePossible();
|
||||
}
|
||||
|
||||
private boolean sellByDayValueIsOver(int dayNumber) {
|
||||
return item.sellIn > dayNumber;
|
||||
}
|
||||
|
||||
private void increaseQualityBy(int qualityValue) {
|
||||
item.quality += qualityValue;
|
||||
private int qualityIncreasedBy(int qualityValue) {
|
||||
return item.quality += qualityValue;
|
||||
}
|
||||
|
||||
private void dropQualityToZero() {
|
||||
item.quality = 0;
|
||||
private int qualityDroppedToZero() {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,13 +1,38 @@
|
||||
package com.gildedrose.item;
|
||||
|
||||
public class ConjuredItem extends StandardItem {
|
||||
public class ConjuredItem extends CustomisedItem {
|
||||
|
||||
private final Item item;
|
||||
|
||||
public ConjuredItem(Item item) {
|
||||
super(item);
|
||||
this.item = item;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int decreasingValueOverZeroDaysToSell() {
|
||||
return 2;
|
||||
protected boolean hasReachedHighestQualityValue() {
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,5 +1,23 @@
|
||||
package com.gildedrose.item;
|
||||
|
||||
public interface CustomisedItem {
|
||||
void updateState();
|
||||
public abstract class CustomisedItem {
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
@ -13,7 +13,7 @@ public class CustomisedItemFactory {
|
||||
public final static String CONJURED_ITEM = "Conjured";
|
||||
|
||||
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(BACKSTAGE_PASSES_ITEM, BackstagePassesItem::new);
|
||||
ITEM_TYPES_LIST.put(CONJURED_ITEM, ConjuredItem::new);
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
package com.gildedrose.item;
|
||||
|
||||
public class StandardItem implements CustomisedItem {
|
||||
public class StandardItem extends CustomisedItem {
|
||||
|
||||
private final Item item;
|
||||
|
||||
@ -8,32 +8,31 @@ public class StandardItem implements CustomisedItem {
|
||||
this.item = item;
|
||||
}
|
||||
|
||||
public void updateState() {
|
||||
decreaseSellByDayValueByOne();
|
||||
@Override
|
||||
int updatedItemSellIn() {
|
||||
return item.sellIn -= 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
int updatedItemQuality() {
|
||||
if (sellByDayValueIsOverZero()) {
|
||||
decreaseQualityBy(decreasingValueOverZeroDaysToSell());
|
||||
return item.quality -= 1;
|
||||
} else {
|
||||
decreaseQualityBy(decreasingValueForZeroOrLessDaysToSell());
|
||||
return item.quality -= 2;
|
||||
}
|
||||
}
|
||||
|
||||
public int decreasingValueOverZeroDaysToSell() {
|
||||
return 1;
|
||||
@Override
|
||||
protected boolean hasReachedHighestQualityValue() {
|
||||
return item.quality > QualityValues.highestValuePossible(item);
|
||||
}
|
||||
|
||||
private void decreaseSellByDayValueByOne() {
|
||||
item.sellIn -= 1;
|
||||
@Override
|
||||
protected boolean hasReachedLowestQualityValue() {
|
||||
return item.quality < QualityValues.lowestValuePossible();
|
||||
}
|
||||
|
||||
private boolean sellByDayValueIsOverZero() {
|
||||
return item.sellIn > 0;
|
||||
}
|
||||
|
||||
private void decreaseQualityBy(int qualityValue) {
|
||||
item.quality -= qualityValue;
|
||||
}
|
||||
|
||||
private int decreasingValueForZeroOrLessDaysToSell() {
|
||||
return decreasingValueOverZeroDaysToSell() * 2;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,7 +1,30 @@
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
@ -74,7 +74,7 @@ public class GildedRoseTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void backstagePassesItemDecreasesQualityByOneIfSellByDayMoreThanEleven() {
|
||||
public void backstagePassesItemIncreasesQualityByOneIfSellByDayMoreThanEleven() {
|
||||
GildedRose app = newGildedRose(CustomisedItemFactory.BACKSTAGE_PASSES_ITEM, 12, 1);
|
||||
|
||||
app.updateQuality();
|
||||
@ -83,7 +83,7 @@ public class GildedRoseTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void backstagePassesItemDecreasesQualityByTwoIfSellByDayIsMoreThanSix() {
|
||||
public void backstagePassesItemIncreasesQualityByTwoIfSellByDayIsMoreThanSix() {
|
||||
GildedRose app = newGildedRose(CustomisedItemFactory.BACKSTAGE_PASSES_ITEM, 10, 1);
|
||||
|
||||
app.updateQuality();
|
||||
@ -92,7 +92,7 @@ public class GildedRoseTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void backstagePassesItemDecreasesQualityByThreeIfSellByDayIsMoreThanZero() {
|
||||
public void backstagePassesItemIncreasesQualityByThreeIfSellByDayIsMoreThanZero() {
|
||||
GildedRose app = newGildedRose(CustomisedItemFactory.BACKSTAGE_PASSES_ITEM, 5, 1);
|
||||
|
||||
app.updateQuality();
|
||||
|
||||
Loading…
Reference in New Issue
Block a user