mirror of
https://github.com/emilybache/GildedRose-Refactoring-Kata.git
synced 2026-02-16 06:51:27 +00:00
Refactored quality update using strategy and factory patterns
This commit is contained in:
parent
2a60407d6b
commit
5f8918b3f0
@ -11,6 +11,7 @@ dependencies {
|
|||||||
testImplementation 'org.junit.jupiter:junit-jupiter-params:5.7.0'
|
testImplementation 'org.junit.jupiter:junit-jupiter-params:5.7.0'
|
||||||
testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.7.0'
|
testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.7.0'
|
||||||
testImplementation 'com.approvaltests:approvaltests:9.3.0'
|
testImplementation 'com.approvaltests:approvaltests:9.3.0'
|
||||||
|
testCompile group: 'org.assertj', name: 'assertj-core', version: '3.17.2'
|
||||||
}
|
}
|
||||||
|
|
||||||
group = 'com.gildedrose'
|
group = 'com.gildedrose'
|
||||||
|
|||||||
@ -0,0 +1,26 @@
|
|||||||
|
package com.gildedrose;
|
||||||
|
|
||||||
|
public class AgedBrieQualityUpdater implements ItemQualityUpdater {
|
||||||
|
|
||||||
|
private final Item item;
|
||||||
|
|
||||||
|
public AgedBrieQualityUpdater(Item item) {
|
||||||
|
this.item = item;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateQuality() {
|
||||||
|
if (item.quality < 50) {
|
||||||
|
item.quality = item.quality + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
item.sellIn = item.sellIn - 1;
|
||||||
|
|
||||||
|
if (item.sellIn < 0) {
|
||||||
|
if (item.quality < 50) {
|
||||||
|
item.quality = item.quality + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,36 @@
|
|||||||
|
package com.gildedrose;
|
||||||
|
|
||||||
|
public class BackstageBrieQualityUpdater implements ItemQualityUpdater {
|
||||||
|
|
||||||
|
private final Item item;
|
||||||
|
|
||||||
|
public BackstageBrieQualityUpdater(Item item) {
|
||||||
|
this.item = item;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateQuality() {
|
||||||
|
if (item.quality < 50) {
|
||||||
|
item.quality = item.quality + 1;
|
||||||
|
|
||||||
|
if (item.sellIn < 11) {
|
||||||
|
if (item.quality < 50) {
|
||||||
|
item.quality = item.quality + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (item.sellIn < 6) {
|
||||||
|
if (item.quality < 50) {
|
||||||
|
item.quality = item.quality + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
item.sellIn = item.sellIn - 1;
|
||||||
|
|
||||||
|
if (item.sellIn < 0) {
|
||||||
|
item.quality = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
25
Java/src/main/java/com/gildedrose/DefaultQualityUpdater.java
Normal file
25
Java/src/main/java/com/gildedrose/DefaultQualityUpdater.java
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
package com.gildedrose;
|
||||||
|
|
||||||
|
public class DefaultQualityUpdater implements ItemQualityUpdater {
|
||||||
|
|
||||||
|
private final Item item;
|
||||||
|
|
||||||
|
public DefaultQualityUpdater(Item item) {
|
||||||
|
this.item = item;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateQuality() {
|
||||||
|
if (item.quality > 0) {
|
||||||
|
item.quality = item.quality - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
item.sellIn = item.sellIn - 1;
|
||||||
|
|
||||||
|
if (item.sellIn < 0) {
|
||||||
|
if (item.quality > 0) {
|
||||||
|
item.quality = item.quality - 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,62 +1,23 @@
|
|||||||
package com.gildedrose;
|
package com.gildedrose;
|
||||||
|
|
||||||
|
import static com.gildedrose.ItemQualityUpdateStrategyFactory.itemQualityUpdaterFor;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
class GildedRose {
|
class GildedRose {
|
||||||
Item[] items;
|
|
||||||
|
|
||||||
public GildedRose(Item[] items) {
|
Item[] items;
|
||||||
this.items = items;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void updateQuality() {
|
public GildedRose(Item[] items) {
|
||||||
for (int i = 0; i < items.length; i++) {
|
this.items = items;
|
||||||
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")) {
|
public void updateQuality() {
|
||||||
if (items[i].sellIn < 11) {
|
Arrays.stream(items).forEach(this::updateQuality);
|
||||||
if (items[i].quality < 50) {
|
}
|
||||||
items[i].quality = items[i].quality + 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (items[i].sellIn < 6) {
|
private void updateQuality(Item item) {
|
||||||
if (items[i].quality < 50) {
|
itemQualityUpdaterFor(item).updateQuality();
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@ -0,0 +1,12 @@
|
|||||||
|
package com.gildedrose;
|
||||||
|
|
||||||
|
public class ItemQualityUpdateStrategyFactory {
|
||||||
|
public static ItemQualityUpdater itemQualityUpdaterFor(Item item) {
|
||||||
|
switch (item.name) {
|
||||||
|
case "Sulfuras, Hand of Ragnaros": return new SulfrasQualityUpdater(item);
|
||||||
|
case "Aged Brie": return new AgedBrieQualityUpdater(item);
|
||||||
|
case "Backstage passes to a TAFKAL80ETC concert": return new BackstageBrieQualityUpdater(item);
|
||||||
|
default: return new DefaultQualityUpdater(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,5 @@
|
|||||||
|
package com.gildedrose;
|
||||||
|
|
||||||
|
public interface ItemQualityUpdater {
|
||||||
|
void updateQuality();
|
||||||
|
}
|
||||||
13
Java/src/main/java/com/gildedrose/SulfrasQualityUpdater.java
Normal file
13
Java/src/main/java/com/gildedrose/SulfrasQualityUpdater.java
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
package com.gildedrose;
|
||||||
|
|
||||||
|
public class SulfrasQualityUpdater implements ItemQualityUpdater {
|
||||||
|
|
||||||
|
private final Item item;
|
||||||
|
|
||||||
|
public SulfrasQualityUpdater(Item item) {
|
||||||
|
this.item = item;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateQuality() {
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,23 @@
|
|||||||
|
package com.gildedrose;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
class ItemQualityUpdateStrategyFactoryTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void itemQualityUpdaterFor() {
|
||||||
|
testFactoryFor("Sulfuras, Hand of Ragnaros", SulfrasQualityUpdater.class);
|
||||||
|
testFactoryFor("Aged Brie", AgedBrieQualityUpdater.class);
|
||||||
|
testFactoryFor("Backstage passes to a TAFKAL80ETC concert", BackstageBrieQualityUpdater.class);
|
||||||
|
testFactoryFor("xyz", DefaultQualityUpdater.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
void testFactoryFor(String name, Class<? extends ItemQualityUpdater> clazz) {
|
||||||
|
ItemQualityUpdater qualityUpdater = ItemQualityUpdateStrategyFactory
|
||||||
|
.itemQualityUpdaterFor(new Item(name, 0, 0));
|
||||||
|
assertThat(qualityUpdater).isInstanceOf(clazz);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user