mirror of
https://github.com/emilybache/GildedRose-Refactoring-Kata.git
synced 2026-02-14 22:21:20 +00:00
introduces CustomisedItem interface so that Item class is not altered
This commit is contained in:
parent
a2b84d2659
commit
e8780706a1
@ -2,11 +2,11 @@ package com.gildedrose;
|
||||
|
||||
import com.gildedrose.item.Item;
|
||||
import com.gildedrose.item.ItemFactory;
|
||||
import com.gildedrose.item.QualityValues;
|
||||
|
||||
class GildedRose {
|
||||
|
||||
private static final int LOWEST_QUALITY_LEVEL_POSSIBLE = 0;
|
||||
private static final int HIGHEST_QUALITY_LEVEL_POSSIBLE = 50;
|
||||
private static final int LOWEST_QUALITY_VALUE_POSSIBLE = 0;
|
||||
private final ItemFactory itemFactory;
|
||||
Item[] items;
|
||||
|
||||
@ -16,28 +16,21 @@ class GildedRose {
|
||||
}
|
||||
|
||||
public void updateQuality() {
|
||||
customizeItems();
|
||||
for (Item item : items) {
|
||||
item.updateYourState();
|
||||
if (hasReachedLowestQualityLimit(item.quality)) {
|
||||
item.quality = LOWEST_QUALITY_LEVEL_POSSIBLE;
|
||||
} else if (hasReachedHighestQualityLimit(item.quality)) {
|
||||
item.quality = HIGHEST_QUALITY_LEVEL_POSSIBLE;
|
||||
itemFactory.customiseItem(item).updateState();
|
||||
if (hasReachedLowestQualityValue(item)) {
|
||||
item.quality = LOWEST_QUALITY_VALUE_POSSIBLE;
|
||||
} else if (hasReachedHighestQualityValue(item)) {
|
||||
item.quality = QualityValues.highestValuePossible(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void customizeItems() {
|
||||
for (Item item : items) {
|
||||
items = new Item[]{itemFactory.createItem(item.name, item.sellIn, item.quality)};
|
||||
}
|
||||
private boolean hasReachedLowestQualityValue(Item item) {
|
||||
return item.quality < LOWEST_QUALITY_VALUE_POSSIBLE;
|
||||
}
|
||||
|
||||
private boolean hasReachedLowestQualityLimit(int itemQuality) {
|
||||
return itemQuality < LOWEST_QUALITY_LEVEL_POSSIBLE;
|
||||
}
|
||||
|
||||
private boolean hasReachedHighestQualityLimit(int itemQuality) {
|
||||
return itemQuality > HIGHEST_QUALITY_LEVEL_POSSIBLE;
|
||||
private boolean hasReachedHighestQualityValue(Item item) {
|
||||
return item.quality > QualityValues.highestValuePossible(item);
|
||||
}
|
||||
}
|
||||
@ -1,13 +1,15 @@
|
||||
package com.gildedrose.item;
|
||||
|
||||
public class AgedBrie extends Item {
|
||||
public class AgedBrie implements CustomisedItem {
|
||||
|
||||
public AgedBrie(String name, int sellIn, int quality) {
|
||||
super(name, sellIn, quality);
|
||||
public Item item;
|
||||
|
||||
public AgedBrie(Item item) {
|
||||
this.item = item;
|
||||
}
|
||||
|
||||
public void updateYourState() {
|
||||
sellIn -= 1;
|
||||
quality += 1;
|
||||
public void updateState() {
|
||||
item.sellIn -= 1;
|
||||
item.quality += 1;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,21 +1,23 @@
|
||||
package com.gildedrose.item;
|
||||
|
||||
public class BackstagePassesItem extends Item {
|
||||
public class BackstagePassesItem implements CustomisedItem {
|
||||
|
||||
public BackstagePassesItem(String name, int sellIn, int quality) {
|
||||
super(name, sellIn, quality);
|
||||
public Item item;
|
||||
|
||||
public BackstagePassesItem(Item item) {
|
||||
this.item = item;
|
||||
}
|
||||
|
||||
public void updateYourState() {
|
||||
sellIn -= 1;
|
||||
if (sellIn >= 11) {
|
||||
quality += 1;
|
||||
} else if (sellIn > 5) {
|
||||
quality += 2;
|
||||
} else if (sellIn > 0) {
|
||||
quality += 3;
|
||||
public void updateState() {
|
||||
item.sellIn -= 1;
|
||||
if (item.sellIn >= 11) {
|
||||
item.quality += 1;
|
||||
} else if (item.sellIn > 5) {
|
||||
item.quality += 2;
|
||||
} else if (item.sellIn > 0) {
|
||||
item.quality += 3;
|
||||
} else {
|
||||
quality = 0;
|
||||
item.quality = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,5 @@
|
||||
package com.gildedrose.item;
|
||||
|
||||
public interface CustomisedItem {
|
||||
void updateState();
|
||||
}
|
||||
@ -18,7 +18,4 @@ public class Item {
|
||||
public String toString() {
|
||||
return this.name + ", " + this.sellIn + ", " + this.quality;
|
||||
}
|
||||
|
||||
public void updateYourState() {
|
||||
}
|
||||
}
|
||||
|
||||
@ -2,15 +2,15 @@ package com.gildedrose.item;
|
||||
|
||||
public class ItemFactory {
|
||||
|
||||
public Item createItem(String itemName, int sellIn, int quality) {
|
||||
if (itemName.equals("Sulfuras, Hand of Ragnaros")) {
|
||||
return new Sulfuras(itemName, sellIn, quality);
|
||||
} else if (itemName.equals("Aged Brie")) {
|
||||
return new AgedBrie(itemName, sellIn, quality);
|
||||
} else if (itemName.equals("Backstage passes to a TAFKAL80ETC concert")) {
|
||||
return new BackstagePassesItem(itemName, sellIn, quality);
|
||||
public CustomisedItem customiseItem(Item item) {
|
||||
if (item.name.equals("Sulfuras, Hand of Ragnaros")) {
|
||||
return new Sulfuras(item);
|
||||
} else if (item.name.equals("Aged Brie")) {
|
||||
return new AgedBrie(item);
|
||||
} else if (item.name.equals("Backstage passes to a TAFKAL80ETC concert")) {
|
||||
return new BackstagePassesItem(item);
|
||||
} else {
|
||||
return new StandardItem(itemName, sellIn, quality);
|
||||
return new StandardItem(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
11
Java/src/main/java/com/gildedrose/item/QualityValues.java
Normal file
11
Java/src/main/java/com/gildedrose/item/QualityValues.java
Normal file
@ -0,0 +1,11 @@
|
||||
package com.gildedrose.item;
|
||||
|
||||
public final class QualityValues {
|
||||
|
||||
public static int highestValuePossible(Item item) {
|
||||
if (item.name.equals("Sulfuras, Hand of Ragnaros")) {
|
||||
return 80;
|
||||
}
|
||||
return 50;
|
||||
}
|
||||
}
|
||||
@ -1,17 +1,21 @@
|
||||
package com.gildedrose.item;
|
||||
|
||||
public class StandardItem extends Item {
|
||||
public class StandardItem implements CustomisedItem {
|
||||
|
||||
public StandardItem(String name, int sellIn, int quality) {
|
||||
super(name, sellIn, quality);
|
||||
public Item item;
|
||||
|
||||
public StandardItem(Item item) {
|
||||
this.item = item;
|
||||
}
|
||||
|
||||
public void updateYourState() {
|
||||
sellIn -= 1;
|
||||
if (sellIn > 0) {
|
||||
quality -= 1;
|
||||
public void updateState() {
|
||||
item.sellIn -= 1;
|
||||
if (item.sellIn > 0) {
|
||||
item.quality -= 1;
|
||||
} else {
|
||||
quality -= 2;
|
||||
item.quality -= 2;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -1,11 +1,12 @@
|
||||
package com.gildedrose.item;
|
||||
|
||||
public class Sulfuras extends Item {
|
||||
public class Sulfuras implements CustomisedItem {
|
||||
|
||||
public Sulfuras(String name, int sellIn, int quality) {
|
||||
super(name, sellIn, quality);
|
||||
public Item item;
|
||||
|
||||
public Sulfuras(Item item) {
|
||||
}
|
||||
|
||||
public void updateYourState() {
|
||||
public void updateState() {
|
||||
}
|
||||
}
|
||||
|
||||
@ -43,22 +43,13 @@ public class GildedRoseTest {
|
||||
assertEquals(-1, itemSellByDayNumber(app));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void sulfurasItemDoesNotDecreaseSellByDayNumberEachTime() {
|
||||
GildedRose app = newGildedRose("Sulfuras, Hand of Ragnaros", 0, 0);
|
||||
|
||||
app.updateQuality();
|
||||
|
||||
assertEquals(0, itemSellByDayNumber(app));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void brieIncreasesInQualityEachTime() {
|
||||
GildedRose app = newGildedRose("Aged Brie", 1, 1);
|
||||
|
||||
app.updateQuality();
|
||||
|
||||
assertEquals(2, itemQualityNumber(app));
|
||||
assertEquals(2, itemQualityValue(app));
|
||||
}
|
||||
|
||||
@Test
|
||||
@ -68,7 +59,7 @@ public class GildedRoseTest {
|
||||
app.updateQuality();
|
||||
app.updateQuality();
|
||||
|
||||
assertEquals(50, itemQualityNumber(app));
|
||||
assertEquals(50, itemQualityValue(app));
|
||||
}
|
||||
|
||||
@Test
|
||||
@ -77,70 +68,86 @@ public class GildedRoseTest {
|
||||
|
||||
app.updateQuality();
|
||||
|
||||
assertEquals(2, itemQualityNumber(app));
|
||||
assertEquals(2, itemQualityValue(app));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void backstagePassesItemDecreasesQualityByTwoIfSellByDayLessThanEleven() {
|
||||
public void backstagePassesItemDecreasesQualityByTwoIfSellByDayIsMoreThanSix() {
|
||||
GildedRose app = newGildedRose("Backstage passes to a TAFKAL80ETC concert", 10, 1);
|
||||
|
||||
app.updateQuality();
|
||||
|
||||
assertEquals(3, itemQualityNumber(app));
|
||||
assertEquals(3, itemQualityValue(app));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void backstagePassesItemDecreasesQualityByThreeIfSellByDayLessThanSix() {
|
||||
public void backstagePassesItemDecreasesQualityByThreeIfSellByDayIsMoreThanZero() {
|
||||
GildedRose app = newGildedRose("Backstage passes to a TAFKAL80ETC concert", 5, 1);
|
||||
|
||||
app.updateQuality();
|
||||
|
||||
assertEquals(4, itemQualityNumber(app));
|
||||
assertEquals(4, itemQualityValue(app));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void backstagePassesItemQualityDropsToZeroIfSellByDayHasPassed() {
|
||||
public void backstagePassesItemQualityDropsToZeroIfSellByDayIsZeroOrLess() {
|
||||
GildedRose app = newGildedRose("Backstage passes to a TAFKAL80ETC concert", 0,50);
|
||||
|
||||
app.updateQuality();
|
||||
|
||||
assertEquals(0, itemQualityNumber(app));
|
||||
assertEquals(0, itemQualityValue(app));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void normalItemDecreasesQualityByOneIfSellByDayIsAboveZero() {
|
||||
public void backstagePassesItemQualityCannotGoAboveFiftyWhenIncreasing() {
|
||||
GildedRose app = newGildedRose("Backstage passes to a TAFKAL80ETC concert", 5, 50);
|
||||
|
||||
app.updateQuality();
|
||||
|
||||
assertEquals(50, itemQualityValue(app));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void standardItemDecreasesQualityByOneIfSellByDayIsAboveZero() {
|
||||
GildedRose app = newGildedRose("foo", 2, 1);
|
||||
|
||||
app.updateQuality();
|
||||
|
||||
assertEquals(0, itemQualityNumber(app));
|
||||
assertEquals(0, itemQualityValue(app));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void normalItemDecreasesQualityByTwoOnceSellByDayHasPassed() {
|
||||
public void standardItemDecreasesQualityByTwoOnceSellByDayIsZeroOrLess() {
|
||||
GildedRose app = newGildedRose("foo",0, 5);
|
||||
|
||||
app.updateQuality();
|
||||
|
||||
assertEquals(3, itemQualityNumber(app));
|
||||
assertEquals(3, itemQualityValue(app));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void normalItemCannotHaveQualityBelowZero() {
|
||||
public void standardItemCannotHaveQualityBelowZero() {
|
||||
GildedRose app = newGildedRose("foo", 0, 0);
|
||||
|
||||
app.updateQuality();
|
||||
|
||||
assertEquals(0, itemQualityNumber(app));
|
||||
assertEquals(0, itemQualityValue(app));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void nothingHappensToSulfurasItem() {
|
||||
GildedRose app = newGildedRose("Sulfuras, Hand of Ragnaros", 1, 1);
|
||||
public void sulfurasHasQualityEighty() {
|
||||
GildedRose app = newGildedRose("Sulfuras, Hand of Ragnaros", 1, 80);
|
||||
|
||||
assertEquals(80, itemQualityValue(app));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void sulfurasItemDoesNotAlterValues() {
|
||||
GildedRose app = newGildedRose("Sulfuras, Hand of Ragnaros", 1, 80);
|
||||
|
||||
app.updateQuality();
|
||||
|
||||
assertEquals(1, itemQualityNumber(app));
|
||||
assertEquals(80, itemQualityValue(app));
|
||||
assertEquals(1, itemSellByDayNumber(app));
|
||||
}
|
||||
|
||||
@ -153,7 +160,7 @@ public class GildedRoseTest {
|
||||
return app.items[0].sellIn;
|
||||
}
|
||||
|
||||
private int itemQualityNumber(GildedRose app) {
|
||||
private int itemQualityValue(GildedRose app) {
|
||||
return app.items[0].quality;
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user