mirror of
https://github.com/emilybache/GildedRose-Refactoring-Kata.git
synced 2026-02-16 06:51:27 +00:00
Use map for string and handler class
This commit is contained in:
parent
3614b55d3e
commit
6a2c95d1a8
14
Java/pom.xml
14
Java/pom.xml
@ -40,6 +40,20 @@
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
<version>${maven.maven-surefire-plugin.version}</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<configuration>
|
||||
<source>9</source>
|
||||
<target>9</target>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>com.hubspot.maven.plugins</groupId>
|
||||
<artifactId>prettier-maven-plugin</artifactId>
|
||||
<!-- Find the latest version at https://github.com/jhipster/prettier-java/releases -->
|
||||
<version>0.8</version>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
|
||||
@ -1,10 +0,0 @@
|
||||
package com.gildedrose;
|
||||
|
||||
public class AgedBrieItem {
|
||||
public static void handleDay(Item item) {
|
||||
if (item.quality != 50) {
|
||||
item.quality += 1;
|
||||
}
|
||||
item.sellIn -= 1;
|
||||
}
|
||||
}
|
||||
14
Java/src/main/java/com/gildedrose/AgedBrieItemHandler.java
Normal file
14
Java/src/main/java/com/gildedrose/AgedBrieItemHandler.java
Normal file
@ -0,0 +1,14 @@
|
||||
package com.gildedrose;
|
||||
|
||||
public class AgedBrieItemHandler extends ItemHandler {
|
||||
|
||||
public AgedBrieItemHandler() {}
|
||||
|
||||
@Override
|
||||
public void handleDay(Item item) {
|
||||
if (item.quality != 50) {
|
||||
item.quality += 1;
|
||||
}
|
||||
item.sellIn -= 1;
|
||||
}
|
||||
}
|
||||
@ -1,18 +0,0 @@
|
||||
package com.gildedrose;
|
||||
|
||||
public class BackstagePassesItem {
|
||||
public static void handleDay(Item item) {
|
||||
// todo: make it so these items can't be initialized with over 50
|
||||
if (item.quality == 50) {
|
||||
return;
|
||||
}
|
||||
if (item.sellIn == 0) {
|
||||
item.quality = 0;
|
||||
} else if (item.sellIn <= 5) {
|
||||
item.quality += 3;
|
||||
} else if (item.sellIn <= 10) {
|
||||
item.quality += 2;
|
||||
}
|
||||
item.sellIn -= 1;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,20 @@
|
||||
package com.gildedrose;
|
||||
|
||||
public class BackstagePassesItemHandler extends ItemHandler {
|
||||
|
||||
@Override
|
||||
public void handleDay(Item item) {
|
||||
// todo: make it so these items can't be initialized with over 50
|
||||
if (item.quality == 50) {
|
||||
return;
|
||||
}
|
||||
if (item.sellIn == 0) {
|
||||
item.quality = 0;
|
||||
} else if (item.sellIn <= 5) {
|
||||
item.quality += 3;
|
||||
} else if (item.sellIn <= 10) {
|
||||
item.quality += 2;
|
||||
}
|
||||
item.sellIn -= 1;
|
||||
}
|
||||
}
|
||||
@ -1,7 +1,9 @@
|
||||
package com.gildedrose;
|
||||
|
||||
public class GenericItem {
|
||||
public static void handleDay(Item item) {
|
||||
public class GenericItemHandler extends ItemHandler {
|
||||
|
||||
@Override
|
||||
public void handleDay(Item item) {
|
||||
item.sellIn -= 1;
|
||||
if (item.quality == 0) {
|
||||
return;
|
||||
@ -1,35 +1,45 @@
|
||||
package com.gildedrose;
|
||||
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
class GildedRose {
|
||||
public static final String AGED_BRIE = "Aged Brie";
|
||||
public static final String SULFURAS = "Sulfuras, Hand of Ragnaros";
|
||||
public static final String BACKSTAGE_PASSES = "Backstage passes to a TAFKAL80ETC concert";
|
||||
|
||||
final List<Item> items;
|
||||
public static final String BACKSTAGE_PASSES =
|
||||
"Backstage passes to a TAFKAL80ETC concert";
|
||||
private static Map<String, Class<? extends ItemHandler>> itemHandlerMap = Map.of(
|
||||
AGED_BRIE,
|
||||
AgedBrieItemHandler.class,
|
||||
SULFURAS,
|
||||
SulfurasItemHandler.class,
|
||||
BACKSTAGE_PASSES,
|
||||
BackstagePassesItemHandler.class
|
||||
);
|
||||
// make package-private
|
||||
public final List<Item> items;
|
||||
|
||||
public GildedRose(Item[] items) {
|
||||
this.items = Arrays.asList(items);
|
||||
}
|
||||
|
||||
// todo: refactor this to use Guice
|
||||
private static void handleDay(Item item) {
|
||||
// todo: refactor to use enum
|
||||
try {
|
||||
ItemHandler itemHandler = itemHandlerMap
|
||||
.getOrDefault(item.name, GenericItemHandler.class)
|
||||
.getDeclaredConstructor()
|
||||
.newInstance();
|
||||
itemHandler.handleDay(item);
|
||||
} catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public void updateQuality() {
|
||||
items.forEach(GildedRose::handleDay);
|
||||
}
|
||||
|
||||
private static void handleDay(Item item) {
|
||||
switch (item.name) {
|
||||
case AGED_BRIE:
|
||||
AgedBrieItem.handleDay(item);
|
||||
return;
|
||||
case SULFURAS:
|
||||
return;
|
||||
case BACKSTAGE_PASSES:
|
||||
BackstagePassesItem.handleDay(item);
|
||||
return;
|
||||
default:
|
||||
GenericItem.handleDay(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,21 +1,20 @@
|
||||
package com.gildedrose;
|
||||
|
||||
public class Item {
|
||||
public String name;
|
||||
|
||||
public String name;
|
||||
public int sellIn;
|
||||
|
||||
public int sellIn;
|
||||
public int quality;
|
||||
|
||||
public int quality;
|
||||
public Item(String name, int sellIn, int quality) {
|
||||
this.name = name;
|
||||
this.sellIn = sellIn;
|
||||
this.quality = quality;
|
||||
}
|
||||
|
||||
public Item(String name, int sellIn, int quality) {
|
||||
this.name = name;
|
||||
this.sellIn = sellIn;
|
||||
this.quality = quality;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return this.name + ", " + this.sellIn + ", " + this.quality;
|
||||
}
|
||||
@Override
|
||||
public String toString() {
|
||||
return this.name + ", " + this.sellIn + ", " + this.quality;
|
||||
}
|
||||
}
|
||||
|
||||
6
Java/src/main/java/com/gildedrose/ItemHandler.java
Normal file
6
Java/src/main/java/com/gildedrose/ItemHandler.java
Normal file
@ -0,0 +1,6 @@
|
||||
package com.gildedrose;
|
||||
|
||||
public abstract class ItemHandler {
|
||||
|
||||
public void handleDay(Item item) {}
|
||||
}
|
||||
3
Java/src/main/java/com/gildedrose/ItemType.java
Normal file
3
Java/src/main/java/com/gildedrose/ItemType.java
Normal file
@ -0,0 +1,3 @@
|
||||
package com.gildedrose;
|
||||
|
||||
public enum ItemType {}
|
||||
@ -1,4 +0,0 @@
|
||||
package com.gildedrose;
|
||||
|
||||
public class SulfurasItem {
|
||||
}
|
||||
@ -0,0 +1,3 @@
|
||||
package com.gildedrose;
|
||||
|
||||
public class SulfurasItemHandler extends ItemHandler {}
|
||||
@ -1,15 +1,15 @@
|
||||
package com.gildedrose;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
class GildedRoseTest {
|
||||
private static final int SULFURAS_QUALITY = 80;
|
||||
|
||||
@Test
|
||||
public void agedBrieIncreasesInQualityByOneEachDay() {
|
||||
Item[] items = new Item[]{new Item(GildedRose.AGED_BRIE, 2, 0)};
|
||||
Item[] items = new Item[] { new Item(GildedRose.AGED_BRIE, 2, 0) };
|
||||
GildedRose app = new GildedRose(items);
|
||||
app.updateQuality();
|
||||
assertEquals(app.items.get(0).quality, 1);
|
||||
@ -20,7 +20,9 @@ class GildedRoseTest {
|
||||
@Test
|
||||
public void sulfurasSellInDateNeverChanges() {
|
||||
int sellIn = 10;
|
||||
Item[] items = new Item[]{new Item(GildedRose.SULFURAS, sellIn, SULFURAS_QUALITY)};
|
||||
Item[] items = new Item[] {
|
||||
new Item(GildedRose.SULFURAS, sellIn, SULFURAS_QUALITY)
|
||||
};
|
||||
GildedRose app = new GildedRose(items);
|
||||
app.updateQuality();
|
||||
assertEquals(app.items.get(0).sellIn, sellIn);
|
||||
@ -30,7 +32,9 @@ class GildedRoseTest {
|
||||
|
||||
@Test
|
||||
public void sulfurasValueNeverChanges() {
|
||||
Item[] items = new Item[]{new Item(GildedRose.SULFURAS, 10, SULFURAS_QUALITY)};
|
||||
Item[] items = new Item[] {
|
||||
new Item(GildedRose.SULFURAS, 10, SULFURAS_QUALITY)
|
||||
};
|
||||
GildedRose app = new GildedRose(items);
|
||||
app.updateQuality();
|
||||
assertEquals(app.items.get(0).quality, SULFURAS_QUALITY);
|
||||
@ -40,7 +44,9 @@ class GildedRoseTest {
|
||||
|
||||
@Test
|
||||
public void sulfurasValueIsAlways80() {
|
||||
Item[] items = new Item[]{new Item(GildedRose.SULFURAS, 10, SULFURAS_QUALITY)};
|
||||
Item[] items = new Item[] {
|
||||
new Item(GildedRose.SULFURAS, 10, SULFURAS_QUALITY)
|
||||
};
|
||||
GildedRose app = new GildedRose(items);
|
||||
app.updateQuality();
|
||||
assertEquals(app.items.get(0).quality, SULFURAS_QUALITY);
|
||||
@ -49,7 +55,9 @@ class GildedRoseTest {
|
||||
@Test
|
||||
public void backstagePassesQualityIncreasesByTwoWhenThereAreTenDaysOrLessBeforeTheConcert() {
|
||||
int quality = 0;
|
||||
Item[] items = new Item[]{new Item(GildedRose.BACKSTAGE_PASSES, 10, quality)};
|
||||
Item[] items = new Item[] {
|
||||
new Item(GildedRose.BACKSTAGE_PASSES, 10, quality)
|
||||
};
|
||||
GildedRose app = new GildedRose(items);
|
||||
app.updateQuality();
|
||||
assertEquals(app.items.get(0).quality, 2);
|
||||
@ -60,7 +68,9 @@ class GildedRoseTest {
|
||||
@Test
|
||||
public void backstagePassesQualityIncreasesByThreeWhenThereAreFiveDaysOrLessBeforeTheConcert() {
|
||||
int quality = 0;
|
||||
Item[] items = new Item[]{new Item(GildedRose.BACKSTAGE_PASSES, 5, quality)};
|
||||
Item[] items = new Item[] {
|
||||
new Item(GildedRose.BACKSTAGE_PASSES, 5, quality)
|
||||
};
|
||||
GildedRose app = new GildedRose(items);
|
||||
app.updateQuality();
|
||||
assertEquals(app.items.get(0).quality, 3);
|
||||
@ -73,7 +83,9 @@ class GildedRoseTest {
|
||||
@Test
|
||||
public void backstagePassesQualityDropsToZeroAfterTheConcert() {
|
||||
int quality = 10;
|
||||
Item[] items = new Item[]{new Item(GildedRose.BACKSTAGE_PASSES, 1, quality)};
|
||||
Item[] items = new Item[] {
|
||||
new Item(GildedRose.BACKSTAGE_PASSES, 1, quality)
|
||||
};
|
||||
GildedRose app = new GildedRose(items);
|
||||
app.updateQuality();
|
||||
assertEquals(app.items.get(0).quality, 13);
|
||||
@ -85,7 +97,7 @@ class GildedRoseTest {
|
||||
public void qualityIsNeverNegativeForGenericItems() {
|
||||
// todo: should add a similar case for conjured
|
||||
int quality = 1;
|
||||
Item[] items = new Item[]{new Item("generic item", 5, quality)};
|
||||
Item[] items = new Item[] { new Item("generic item", 5, quality) };
|
||||
GildedRose app = new GildedRose(items);
|
||||
app.updateQuality();
|
||||
assertEquals(app.items.get(0).quality, 0);
|
||||
@ -97,7 +109,7 @@ class GildedRoseTest {
|
||||
|
||||
@Test
|
||||
public void qualityIsNeverOverFiftyForAgedBrie() {
|
||||
Item[] items = new Item[]{new Item(GildedRose.AGED_BRIE, 5, 50)};
|
||||
Item[] items = new Item[] { new Item(GildedRose.AGED_BRIE, 5, 50) };
|
||||
GildedRose app = new GildedRose(items);
|
||||
app.updateQuality();
|
||||
assertEquals(app.items.get(0).quality, 50);
|
||||
@ -109,7 +121,7 @@ class GildedRoseTest {
|
||||
|
||||
@Test
|
||||
public void qualityIsNeverOverFiftyForBackstagePasses() {
|
||||
Item[] items = new Item[]{new Item(GildedRose.BACKSTAGE_PASSES, 5, 50)};
|
||||
Item[] items = new Item[] { new Item(GildedRose.BACKSTAGE_PASSES, 5, 50) };
|
||||
GildedRose app = new GildedRose(items);
|
||||
app.updateQuality();
|
||||
assertEquals(app.items.get(0).quality, 50);
|
||||
@ -121,7 +133,7 @@ class GildedRoseTest {
|
||||
|
||||
@Test
|
||||
public void qualityDecreasesByOneEachDayForGenericItems() {
|
||||
Item[] items = new Item[]{new Item("generic item", 5, 5)};
|
||||
Item[] items = new Item[] { new Item("generic item", 5, 5) };
|
||||
GildedRose app = new GildedRose(items);
|
||||
app.updateQuality();
|
||||
assertEquals(app.items.get(0).quality, 4);
|
||||
@ -133,7 +145,7 @@ class GildedRoseTest {
|
||||
|
||||
@Test
|
||||
public void qualityDecreasesByTwoEachDayForGenericItemsAfterSellInDate() {
|
||||
Item[] items = new Item[]{new Item("generic item", 1, 6)};
|
||||
Item[] items = new Item[] { new Item("generic item", 1, 6) };
|
||||
GildedRose app = new GildedRose(items);
|
||||
app.updateQuality();
|
||||
assertEquals(app.items.get(0).quality, 5);
|
||||
@ -145,7 +157,7 @@ class GildedRoseTest {
|
||||
|
||||
@Test
|
||||
public void sellInDateDecreasesByOneEachDayForAgedBrie() {
|
||||
Item[] items = new Item[]{new Item(GildedRose.AGED_BRIE, 5, 1)};
|
||||
Item[] items = new Item[] { new Item(GildedRose.AGED_BRIE, 5, 1) };
|
||||
GildedRose app = new GildedRose(items);
|
||||
app.updateQuality();
|
||||
assertEquals(app.items.get(0).sellIn, 4);
|
||||
@ -157,7 +169,7 @@ class GildedRoseTest {
|
||||
|
||||
@Test
|
||||
public void sellInDateDecreasesByOneEachDayForBackstagePasses() {
|
||||
Item[] items = new Item[]{new Item(GildedRose.BACKSTAGE_PASSES, 5, 1)};
|
||||
Item[] items = new Item[] { new Item(GildedRose.BACKSTAGE_PASSES, 5, 1) };
|
||||
GildedRose app = new GildedRose(items);
|
||||
app.updateQuality();
|
||||
assertEquals(app.items.get(0).sellIn, 4);
|
||||
@ -169,7 +181,7 @@ class GildedRoseTest {
|
||||
|
||||
@Test
|
||||
public void sellInDateDecreasesByOneEachDayForGenericItems() {
|
||||
Item[] items = new Item[]{new Item("generic item", 5, 1)};
|
||||
Item[] items = new Item[] { new Item("generic item", 5, 1) };
|
||||
GildedRose app = new GildedRose(items);
|
||||
app.updateQuality();
|
||||
assertEquals(app.items.get(0).sellIn, 4);
|
||||
@ -181,7 +193,7 @@ class GildedRoseTest {
|
||||
|
||||
@Test
|
||||
public void sellInDateCanBeNegativeForGenericItems() {
|
||||
Item[] items = new Item[]{new Item("generic item", 1, 1)};
|
||||
Item[] items = new Item[] { new Item("generic item", 1, 1) };
|
||||
GildedRose app = new GildedRose(items);
|
||||
app.updateQuality();
|
||||
assertEquals(app.items.get(0).sellIn, 0);
|
||||
@ -193,7 +205,7 @@ class GildedRoseTest {
|
||||
|
||||
@Test
|
||||
public void sellInDateCanBeNegativeForAgedBrie() {
|
||||
Item[] items = new Item[]{new Item(GildedRose.AGED_BRIE, 1, 1)};
|
||||
Item[] items = new Item[] { new Item(GildedRose.AGED_BRIE, 1, 1) };
|
||||
GildedRose app = new GildedRose(items);
|
||||
app.updateQuality();
|
||||
assertEquals(app.items.get(0).sellIn, 0);
|
||||
@ -205,7 +217,7 @@ class GildedRoseTest {
|
||||
|
||||
@Test
|
||||
public void sellInDateCanBeNegativeForBackStagePasses() {
|
||||
Item[] items = new Item[]{new Item(GildedRose.BACKSTAGE_PASSES, 1, 1)};
|
||||
Item[] items = new Item[] { new Item(GildedRose.BACKSTAGE_PASSES, 1, 1) };
|
||||
GildedRose app = new GildedRose(items);
|
||||
app.updateQuality();
|
||||
assertEquals(app.items.get(0).sellIn, 0);
|
||||
@ -217,7 +229,7 @@ class GildedRoseTest {
|
||||
|
||||
@Test
|
||||
public void itUpdatesAllItemsPassedIn() {
|
||||
Item[] items = new Item[]{
|
||||
Item[] items = new Item[] {
|
||||
new Item("generic item 1", 5, 5),
|
||||
new Item("generic item 2", 5, 10)
|
||||
};
|
||||
|
||||
@ -1,35 +1,36 @@
|
||||
package com.gildedrose;
|
||||
|
||||
public class TexttestFixture {
|
||||
public static void main(String[] args) {
|
||||
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), //
|
||||
new Item("Sulfuras, Hand of Ragnaros", 0, 80), //
|
||||
new Item("Sulfuras, Hand of Ragnaros", -1, 80),
|
||||
new Item("Backstage passes to a TAFKAL80ETC concert", 15, 20),
|
||||
new Item("Backstage passes to a TAFKAL80ETC concert", 10, 49),
|
||||
new Item("Backstage passes to a TAFKAL80ETC concert", 5, 49),
|
||||
// this conjured item does not work properly yet
|
||||
new Item("Conjured Mana Cake", 3, 6) };
|
||||
|
||||
GildedRose app = new GildedRose(items);
|
||||
public static void main(String[] args) {
|
||||
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), //
|
||||
new Item("Sulfuras, Hand of Ragnaros", 0, 80), //
|
||||
new Item("Sulfuras, Hand of Ragnaros", -1, 80),
|
||||
new Item("Backstage passes to a TAFKAL80ETC concert", 15, 20),
|
||||
new Item("Backstage passes to a TAFKAL80ETC concert", 10, 49),
|
||||
new Item("Backstage passes to a TAFKAL80ETC concert", 5, 49),
|
||||
// this conjured item does not work properly yet
|
||||
new Item("Conjured Mana Cake", 3, 6)
|
||||
};
|
||||
|
||||
int days = 2;
|
||||
if (args.length > 0) {
|
||||
days = Integer.parseInt(args[0]) + 1;
|
||||
}
|
||||
GildedRose app = new GildedRose(items);
|
||||
|
||||
for (int i = 0; i < days; i++) {
|
||||
System.out.println("-------- day " + i + " --------");
|
||||
System.out.println("name, sellIn, quality");
|
||||
for (Item item : items) {
|
||||
System.out.println(item);
|
||||
}
|
||||
System.out.println();
|
||||
app.updateQuality();
|
||||
}
|
||||
int days = 2;
|
||||
if (args.length > 0) {
|
||||
days = Integer.parseInt(args[0]) + 1;
|
||||
}
|
||||
|
||||
for (int i = 0; i < days; i++) {
|
||||
System.out.println("-------- day " + i + " --------");
|
||||
System.out.println("name, sellIn, quality");
|
||||
for (Item item : items) {
|
||||
System.out.println(item);
|
||||
}
|
||||
System.out.println();
|
||||
app.updateQuality();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user