mirror of
https://github.com/emilybache/GildedRose-Refactoring-Kata.git
synced 2026-02-04 09:11:39 +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;
|
||||
|
||||
class GildedRose {
|
||||
Item[] items;
|
||||
|
||||
public class GildedRose {
|
||||
public Item[] items;
|
||||
public GildedRose(Item[] items) {
|
||||
this.items = items;
|
||||
}
|
||||
|
||||
public void updateQuality() {
|
||||
for (int i = 0; i < items.length; i++) {
|
||||
if (!items[i].name.equals("Aged Brie")
|
||||
&& !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 {
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
for (Item item : items) {
|
||||
ItemUpdater updater = ItemUpdaterFactory.getItemUpdater(item);
|
||||
updater.update(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
class GildedRoseTest {
|
||||
|
||||
@Test
|
||||
void foo() {
|
||||
Item[] items = new Item[] { new Item("foo", 0, 0) };
|
||||
void normalItemDegrades() {
|
||||
Item[] items = new Item[] { new Item("Normal Item", 10, 20) };
|
||||
GildedRose app = new GildedRose(items);
|
||||
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;
|
||||
|
||||
public class TexttestFixture {
|
||||
public static void main(String[] args) {
|
||||
System.out.println("OMGHAI!");
|
||||
|
||||
Item[] items = new Item[] {
|
||||
Item [] items = new Item[] {
|
||||
new Item("+5 Dexterity Vest", 10, 20), //
|
||||
new Item("Aged Brie", 2, 0), //
|
||||
new Item("Elixir of the Mongoose", 5, 7), //
|
||||
|
||||
Loading…
Reference in New Issue
Block a user