introduce aging strategies. Parametrize rules

This commit is contained in:
Konstantin Pavlov 2019-06-30 08:19:32 +02:00
parent 6842dec756
commit a7d51ecf85
7 changed files with 87 additions and 34 deletions

View File

@ -1,31 +1,46 @@
package com.gildedrose;
import com.gildedrose.rules.AgedBrieQualityRule;
import com.gildedrose.rules.AgingStrategy;
import com.gildedrose.rules.BackstagePassQualityRule;
import com.gildedrose.rules.ConjuredQualityRule;
import com.gildedrose.rules.ConstantQualityRule;
import com.gildedrose.rules.DefaultAgingStrategy;
import com.gildedrose.rules.DefaultQualityRule;
import com.gildedrose.rules.NoAgingStrategy;
import com.gildedrose.rules.QualityRule;
import com.gildedrose.rules.Result;
import com.gildedrose.rules.SulfurasQualityRule;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
class GildedRose {
Item[] items;
@SuppressWarnings("SpellCheckingInspection")
private static final String SULFURAS_HAND_OF_RAGNAROS = "Sulfuras, Hand of Ragnaros";
final Item[] items;
private final List<QualityRule> rules = List.of(
new SulfurasQualityRule(),
new ConstantQualityRule(SULFURAS_HAND_OF_RAGNAROS),
new AgedBrieQualityRule(),
new BackstagePassQualityRule(),
new ConjuredQualityRule(),
new DefaultQualityRule()
);
private final DefaultAgingStrategy defaultAgingStrategy = new DefaultAgingStrategy();
private final Map<String, AgingStrategy> nameToAgingStrategyMap = Map.of(
SULFURAS_HAND_OF_RAGNAROS, new NoAgingStrategy()
);
@SuppressWarnings("WeakerAccess")
public GildedRose(Item[] items) {
this.items = items;
}
@SuppressWarnings("WeakerAccess")
public void updateQuality() {
Arrays.stream(items)
.parallel()
@ -33,28 +48,27 @@ class GildedRose {
}
private void processItem(final Item item) {
item.sellIn = calculateSellIn(item.name, item.sellIn);
item.quality = rules.stream()
.reduce(new Result(item.quality, false),
(q, rule) -> {
if (q.isFinalValue() || !rule.shouldApply(item.name)) {
return q;
} else {
return rule.calculateQuality(q.getQuality(), item.sellIn);
}
},
(a, b) -> b).getQuality();
item.quality = calculateQuality(item.name, item.quality, item.sellIn);
}
private int calculateSellIn(final String name, final int originalSellIn) {
if ("Sulfuras, Hand of Ragnaros".equals(name)) {
return originalSellIn;
} else {
return originalSellIn - 1;
return nameToAgingStrategyMap
.getOrDefault(name, defaultAgingStrategy)
.calculateSellIn(originalSellIn);
}
private int calculateQuality(String itemName, int quality, int newSellIn) {
return rules.stream()
.reduce(new Result(quality, false),
(q, rule) -> {
if (q.isFinalValue() || !rule.shouldApply(itemName)) {
return q;
} else {
return rule.calculateQuality(q.getQuality(), newSellIn);
}
},
(a, b) -> b).getQuality();
}
}

View File

@ -0,0 +1,6 @@
package com.gildedrose.rules;
public interface AgingStrategy {
int calculateSellIn(int oldSellIn);
}

View File

@ -0,0 +1,22 @@
package com.gildedrose.rules;
import java.util.Objects;
public class ConstantQualityRule implements QualityRule {
private final String expectedName;
public ConstantQualityRule(String itemName) {
this.expectedName = Objects.requireNonNull(itemName, "ItemName is required");
}
@Override
public boolean shouldApply(String itemName) {
return expectedName.equals(itemName);
}
@Override
public Result calculateQuality(int oldQuality, int newSellIn) {
return new Result(oldQuality, true);
}
}

View File

@ -0,0 +1,8 @@
package com.gildedrose.rules;
public class DefaultAgingStrategy implements AgingStrategy {
@Override
public int calculateSellIn(int oldSellIn) {
return oldSellIn - 1;
}
}

View File

@ -0,0 +1,9 @@
package com.gildedrose.rules;
public class NoAgingStrategy implements AgingStrategy {
@Override
public int calculateSellIn(int oldSellIn) {
return oldSellIn;
}
}

View File

@ -0,0 +1,8 @@
package com.gildedrose.rules;
public interface SellInRule {
boolean shouldApply(String itemName);
Result calculateQuality(int oldQuality, int newSellIn);
}

View File

@ -1,14 +0,0 @@
package com.gildedrose.rules;
public class SulfurasQualityRule implements QualityRule {
@Override
public boolean shouldApply(String itemName) {
return "Sulfuras, Hand of Ragnaros".equals(itemName);
}
@Override
public Result calculateQuality(int oldQuality, int newSellIn) {
return new Result(oldQuality, true);
}
}