mirror of
https://github.com/emilybache/GildedRose-Refactoring-Kata.git
synced 2026-02-10 20:21:26 +00:00
Refactor: Implement Strategy pattern for item updaters
This commit is contained in:
parent
7e94dbd722
commit
35f9e753a6
14
Java/src/main/java/com/gildedrose/AgedBrieUpdater.java
Normal file
14
Java/src/main/java/com/gildedrose/AgedBrieUpdater.java
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
package com.gildedrose;
|
||||||
|
|
||||||
|
public class AgedBrieUpdater extends BaseItemUpdater {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void update(Item item) {
|
||||||
|
decreaseSellIn(item);
|
||||||
|
if (item.sellIn < 0) {
|
||||||
|
increaseQuality(item , 2);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
increaseQuality(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
20
Java/src/main/java/com/gildedrose/BackstagePassUpdater.java
Normal file
20
Java/src/main/java/com/gildedrose/BackstagePassUpdater.java
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
package com.gildedrose;
|
||||||
|
|
||||||
|
public class BackstagePassUpdater extends BaseItemUpdater{
|
||||||
|
@Override
|
||||||
|
public void update(Item item) {
|
||||||
|
decreaseSellIn(item);
|
||||||
|
if (item.sellIn <0) {
|
||||||
|
item.quality = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (item.sellIn <= 5) {
|
||||||
|
increaseQuality(item , 3);
|
||||||
|
}
|
||||||
|
else if (item.sellIn <= 10) {
|
||||||
|
increaseQuality(item , 2);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
increaseQuality(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
22
Java/src/main/java/com/gildedrose/BaseItemUpdater.java
Normal file
22
Java/src/main/java/com/gildedrose/BaseItemUpdater.java
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
package com.gildedrose;
|
||||||
|
|
||||||
|
public abstract class BaseItemUpdater implements ItemUpdater {
|
||||||
|
|
||||||
|
public abstract void update(Item item);
|
||||||
|
protected void decreaseQuality(Item item) {
|
||||||
|
item.quality = Math.max(item.quality - 1, 0);
|
||||||
|
}
|
||||||
|
protected void decreaseQuality(Item item , int amount) {
|
||||||
|
item.quality = Math.max(0, item.quality - amount);
|
||||||
|
}
|
||||||
|
protected void increaseQuality(Item item) {
|
||||||
|
item.quality = Math.min(item.quality + 1, 50);
|
||||||
|
}
|
||||||
|
protected void increaseQuality(Item item , int amount) {
|
||||||
|
item.quality = Math.min(item.quality + amount, 50);
|
||||||
|
}
|
||||||
|
protected void decreaseSellIn(Item item) {
|
||||||
|
item.sellIn--;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
12
Java/src/main/java/com/gildedrose/ConjuredItemUpdater.java
Normal file
12
Java/src/main/java/com/gildedrose/ConjuredItemUpdater.java
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
package com.gildedrose;
|
||||||
|
|
||||||
|
public class ConjuredItemUpdater extends BaseItemUpdater {
|
||||||
|
@Override
|
||||||
|
public void update(Item item) {
|
||||||
|
decreaseSellIn(item);
|
||||||
|
if (item.sellIn < 0) {
|
||||||
|
decreaseQuality(item, 4);
|
||||||
|
}
|
||||||
|
else decreaseQuality(item, 2);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,62 +1,14 @@
|
|||||||
package com.gildedrose;
|
package com.gildedrose;
|
||||||
|
public class GildedRose {
|
||||||
class GildedRose {
|
public Item[] items;
|
||||||
Item[] items;
|
|
||||||
|
|
||||||
public GildedRose(Item[] items) {
|
public GildedRose(Item[] items) {
|
||||||
this.items = items;
|
this.items = items;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateQuality() {
|
public void updateQuality() {
|
||||||
for (int i = 0; i < items.length; i++) {
|
for (Item item : items) {
|
||||||
if (!items[i].name.equals("Aged Brie")
|
ItemUpdater updater = ItemUpdaterFactory.getItemUpdater(item);
|
||||||
&& !items[i].name.equals("Backstage passes to a TAFKAL80ETC concert")) {
|
updater.update(item);
|
||||||
if (items[i].quality > 0) {
|
|
||||||
if (!items[i].name.equals("Sulfuras, Hand of Ragnaros")) {
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
5
Java/src/main/java/com/gildedrose/ItemUpdater.java
Normal file
5
Java/src/main/java/com/gildedrose/ItemUpdater.java
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
package com.gildedrose;
|
||||||
|
|
||||||
|
public interface ItemUpdater {
|
||||||
|
void update(Item item);
|
||||||
|
}
|
||||||
19
Java/src/main/java/com/gildedrose/ItemUpdaterFactory.java
Normal file
19
Java/src/main/java/com/gildedrose/ItemUpdaterFactory.java
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
package com.gildedrose;
|
||||||
|
|
||||||
|
public class ItemUpdaterFactory {
|
||||||
|
public static ItemUpdater getItemUpdater(Item item) {
|
||||||
|
if (item.name.contains("Aged Brie"))
|
||||||
|
return new AgedBrieUpdater();
|
||||||
|
|
||||||
|
if (item.name.contains("Sulfuras"))
|
||||||
|
return new SulfurasUpdater();
|
||||||
|
|
||||||
|
if (item.name.contains("Backstage"))
|
||||||
|
return new BackstagePassUpdater();
|
||||||
|
|
||||||
|
if (item.name.contains("Conjured"))
|
||||||
|
return new ConjuredItemUpdater();
|
||||||
|
|
||||||
|
return new NormalItemUpdater();
|
||||||
|
}
|
||||||
|
}
|
||||||
14
Java/src/main/java/com/gildedrose/NormalItemUpdater.java
Normal file
14
Java/src/main/java/com/gildedrose/NormalItemUpdater.java
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
package com.gildedrose;
|
||||||
|
|
||||||
|
public class NormalItemUpdater extends BaseItemUpdater {
|
||||||
|
@Override
|
||||||
|
public void update(Item item) {
|
||||||
|
decreaseSellIn(item);
|
||||||
|
if (item.sellIn <0) {
|
||||||
|
decreaseQuality(item, 2);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
decreaseQuality(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
8
Java/src/main/java/com/gildedrose/SulfurasUpdater.java
Normal file
8
Java/src/main/java/com/gildedrose/SulfurasUpdater.java
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
package com.gildedrose;
|
||||||
|
|
||||||
|
public class SulfurasUpdater extends BaseItemUpdater {
|
||||||
|
@Override
|
||||||
|
public void update(Item item) {
|
||||||
|
System.out.println("Legendary Item can not be updated");
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,17 +1,52 @@
|
|||||||
package com.gildedrose;
|
package com.gildedrose;
|
||||||
|
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
class GildedRoseTest {
|
class GildedRoseTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void foo() {
|
void normalItemDegrades() {
|
||||||
Item[] items = new Item[] { new Item("foo", 0, 0) };
|
Item[] items = new Item[] { new Item("Normal Item", 10, 20) };
|
||||||
GildedRose app = new GildedRose(items);
|
GildedRose app = new GildedRose(items);
|
||||||
app.updateQuality();
|
app.updateQuality();
|
||||||
assertEquals("fixme", app.items[0].name);
|
assertEquals(9, app.items[0].sellIn);
|
||||||
|
assertEquals(19, app.items[0].quality);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void agedBrieIncreasesQuality() {
|
||||||
|
Item[] items = new Item[] { new Item("Aged Brie", 10, 20) };
|
||||||
|
GildedRose app = new GildedRose(items);
|
||||||
|
app.updateQuality();
|
||||||
|
assertEquals(9, app.items[0].sellIn);
|
||||||
|
assertEquals(21, app.items[0].quality);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void sulfurasNeverChanges() {
|
||||||
|
Item[] items = new Item[] { new Item("Sulfuras, Hand of Ragnaros", 10, 80) };
|
||||||
|
GildedRose app = new GildedRose(items);
|
||||||
|
app.updateQuality();
|
||||||
|
assertEquals(10, app.items[0].sellIn);
|
||||||
|
assertEquals(80, app.items[0].quality);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void backstagePassIncreasesQualityNearConcert() {
|
||||||
|
Item[] items = new Item[] { new Item("Backstage passes to a TAFKAL80ETC concert", 5, 20) };
|
||||||
|
GildedRose app = new GildedRose(items);
|
||||||
|
app.updateQuality();
|
||||||
|
assertEquals(4, app.items[0].sellIn);
|
||||||
|
assertEquals(23, app.items[0].quality); // +3 when 5 days or less
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void conjuredItemDegradesTwiceAsFast() {
|
||||||
|
Item[] items = new Item[] { new Item("Conjured Mana Cake", 10, 20) };
|
||||||
|
GildedRose app = new GildedRose(items);
|
||||||
|
app.updateQuality();
|
||||||
|
assertEquals(9, app.items[0].sellIn);
|
||||||
|
assertEquals(18, app.items[0].quality); // -2 instead of -1
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,10 +1,9 @@
|
|||||||
package com.gildedrose;
|
package com.gildedrose;
|
||||||
|
|
||||||
public class TexttestFixture {
|
public class TexttestFixture {
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
System.out.println("OMGHAI!");
|
System.out.println("OMGHAI!");
|
||||||
|
|
||||||
Item[] items = new Item[] {
|
Item [] items = new Item[] {
|
||||||
new Item("+5 Dexterity Vest", 10, 20), //
|
new Item("+5 Dexterity Vest", 10, 20), //
|
||||||
new Item("Aged Brie", 2, 0), //
|
new Item("Aged Brie", 2, 0), //
|
||||||
new Item("Elixir of the Mongoose", 5, 7), //
|
new Item("Elixir of the Mongoose", 5, 7), //
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user