QualityRule interface, initial backstage pass rule

This commit is contained in:
Konstantin Pavlov 2019-06-30 06:42:06 +02:00
parent f60b800cd8
commit 4f28924f7e
7 changed files with 70 additions and 36 deletions

View File

@ -1,7 +1,10 @@
package com.gildedrose; package com.gildedrose;
import com.gildedrose.rules.AgedBrieQualityRule; import com.gildedrose.rules.AgedBrieQualityRule;
import com.gildedrose.rules.BackstagePassQualityRule;
import com.gildedrose.rules.DefaultQualityRule;
import com.gildedrose.rules.QualityRule; import com.gildedrose.rules.QualityRule;
import com.gildedrose.rules.Result;
import com.gildedrose.rules.SulfurasQualityRule; import com.gildedrose.rules.SulfurasQualityRule;
import lombok.val; import lombok.val;
@ -13,7 +16,8 @@ class GildedRose {
private final List<QualityRule> rules = List.of( private final List<QualityRule> rules = List.of(
new SulfurasQualityRule(), new SulfurasQualityRule(),
new AgedBrieQualityRule(), new AgedBrieQualityRule(),
new QualityRule() new BackstagePassQualityRule(),
new DefaultQualityRule()
); );
public GildedRose(Item[] items) { public GildedRose(Item[] items) {
@ -29,13 +33,15 @@ class GildedRose {
private void processItem(final Item item) { private void processItem(final Item item) {
val newSellIn = calculateSellIn(item.name, item.sellIn);
var newQuality = rules.stream() var newQuality = rules.stream()
.reduce(new QualityRule.Result(item.quality, false), .reduce(new Result(item.quality, false),
(q, rule) -> { (q, rule) -> {
if (q.isFinalValue() || !rule.shouldApply(item.name)) { if (q.isFinalValue() || !rule.shouldApply(item.name)) {
return q; return q;
} else { } else {
return rule.calculateQuality(q.getQuality()); return rule.calculateQuality(q.getQuality(), newSellIn);
} }
}, },
(a, b) -> b).getQuality(); (a, b) -> b).getQuality();
@ -69,7 +75,7 @@ class GildedRose {
} }
*/ */
val newSellIn = calculateSellIn(item.name, item.sellIn);
/* if (newSellIn < 0) { /* if (newSellIn < 0) {
if (!item.name.equals("Aged Brie")) { if (!item.name.equals("Aged Brie")) {

View File

@ -2,7 +2,7 @@ package com.gildedrose.rules;
import static java.lang.Integer.min; import static java.lang.Integer.min;
public class AgedBrieQualityRule extends QualityRule { public class AgedBrieQualityRule implements QualityRule {
@Override @Override
public boolean shouldApply(String itemName) { public boolean shouldApply(String itemName) {
@ -10,7 +10,7 @@ public class AgedBrieQualityRule extends QualityRule {
} }
@Override @Override
public Result calculateQuality(int oldQuality) { public Result calculateQuality(int oldQuality, int sellIn) {
return new Result(min(oldQuality + 1, 50), true); return new Result(min(oldQuality + 1, 50), true);
} }
} }

View File

@ -0,0 +1,17 @@
package com.gildedrose.rules;
import static java.lang.Integer.min;
public class BackstagePassQualityRule implements QualityRule {
@Override
public boolean shouldApply(String itemName) {
return "Backstage passes to a TAFKAL80ETC concert".equals(itemName);
}
@Override
public Result calculateQuality(int oldQuality, int sellIn) {
final int newQuality = oldQuality + 2;
return new Result(min(newQuality, 50), true);
}
}

View File

@ -0,0 +1,17 @@
package com.gildedrose.rules;
import static java.lang.Integer.max;
public class DefaultQualityRule implements QualityRule {
@Override
public boolean shouldApply(String itemName) {
return true;
}
@Override
public Result calculateQuality(int oldQuality, int sellIn) {
return new Result(max(oldQuality - 1, 0), false);
}
}

View File

@ -1,32 +1,7 @@
package com.gildedrose.rules; package com.gildedrose.rules;
import static java.lang.Integer.max; public interface QualityRule {
boolean shouldApply(String itemName);
public class QualityRule { Result calculateQuality(int oldQuality, int sellIn);
public boolean shouldApply(String itemName) {
return true;
}
public Result calculateQuality(int oldQuality) {
return new Result(max(oldQuality - 1, 0), false);
}
public static class Result {
final int quality;
final boolean isFinalValue;
public Result(int quality, boolean isFinalValue) {
this.quality = quality;
this.isFinalValue = isFinalValue;
}
public int getQuality() {
return quality;
}
public boolean isFinalValue() {
return isFinalValue;
}
}
} }

View File

@ -0,0 +1,19 @@
package com.gildedrose.rules;
public class Result {
final int quality;
final boolean isFinalValue;
public Result(int quality, boolean isFinalValue) {
this.quality = quality;
this.isFinalValue = isFinalValue;
}
public int getQuality() {
return quality;
}
public boolean isFinalValue() {
return isFinalValue;
}
}

View File

@ -1,6 +1,6 @@
package com.gildedrose.rules; package com.gildedrose.rules;
public class SulfurasQualityRule extends QualityRule { public class SulfurasQualityRule implements QualityRule {
@Override @Override
public boolean shouldApply(String itemName) { public boolean shouldApply(String itemName) {
@ -8,7 +8,7 @@ public class SulfurasQualityRule extends QualityRule {
} }
@Override @Override
public Result calculateQuality(int oldQuality) { public Result calculateQuality(int oldQuality, int sellIn) {
return new Result(oldQuality, true); return new Result(oldQuality, true);
} }
} }