mirror of
https://github.com/emilybache/GildedRose-Refactoring-Kata.git
synced 2026-02-15 06:21:29 +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;
|
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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();
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user