Refactored quality update using strategy and factory patterns

This commit is contained in:
Xavier Levaux 2020-09-25 09:15:45 +02:00
parent 2a60407d6b
commit 5f8918b3f0
9 changed files with 155 additions and 53 deletions

View File

@ -11,6 +11,7 @@ dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-params:5.7.0'
testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.7.0'
testImplementation 'com.approvaltests:approvaltests:9.3.0'
testCompile group: 'org.assertj', name: 'assertj-core', version: '3.17.2'
}
group = 'com.gildedrose'

View File

@ -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;
}
}
}
}

View File

@ -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;
}
}
}

View 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;
}
}
}
}

View File

@ -1,62 +1,23 @@
package com.gildedrose;
import static com.gildedrose.ItemQualityUpdateStrategyFactory.itemQualityUpdaterFor;
import java.util.Arrays;
class GildedRose {
Item[] items;
public GildedRose(Item[] items) {
this.items = items;
}
Item[] 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;
public GildedRose(Item[] items) {
this.items = items;
}
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;
}
}
public void updateQuality() {
Arrays.stream(items).forEach(this::updateQuality);
}
if (items[i].sellIn < 6) {
if (items[i].quality < 50) {
items[i].quality = items[i].quality + 1;
}
}
}
}
}
private void updateQuality(Item item) {
itemQualityUpdaterFor(item).updateQuality();
}
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;
}
}
}
}
}
}

View File

@ -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);
}
}
}

View File

@ -0,0 +1,5 @@
package com.gildedrose;
public interface ItemQualityUpdater {
void updateQuality();
}

View 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() {
}
}

View File

@ -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);
}
}