mirror of
https://github.com/emilybache/GildedRose-Refactoring-Kata.git
synced 2026-02-11 04:31:21 +00:00
GildedRose Refactoring
This commit is contained in:
parent
c6f842ef29
commit
dd1894e489
@ -1,62 +1,26 @@
|
|||||||
package com.gildedrose;
|
package com.gildedrose;
|
||||||
|
|
||||||
|
import com.gildedrose.strategy.StrategyProvider;
|
||||||
|
import com.gildedrose.strategy.UpdateStrategy;
|
||||||
|
|
||||||
class GildedRose {
|
class GildedRose {
|
||||||
Item[] items;
|
Item[] items;
|
||||||
|
private final StrategyProvider strategyProvider;
|
||||||
|
|
||||||
public GildedRose(Item[] items) {
|
public GildedRose(Item[] items) {
|
||||||
this.items = items;
|
this.items = items;
|
||||||
|
this.strategyProvider = new StrategyProvider();
|
||||||
|
}
|
||||||
|
|
||||||
|
public GildedRose(Item[] items, StrategyProvider strategyProvider) {
|
||||||
|
this.items = items;
|
||||||
|
this.strategyProvider = strategyProvider;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateQuality() {
|
public void updateQuality() {
|
||||||
for (int i = 0; i < items.length; i++) {
|
for (Item item : items) {
|
||||||
if (!items[i].name.equals("Aged Brie")
|
UpdateStrategy strategy = this.strategyProvider.getStrategyForItem(item);
|
||||||
&& !items[i].name.equals("Backstage passes to a TAFKAL80ETC concert")) {
|
strategy.update(item);
|
||||||
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")) {
|
|
||||||
if (items[i].sellIn < 11) {
|
|
||||||
if (items[i].quality < 50) {
|
|
||||||
items[i].quality = items[i].quality + 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (items[i].sellIn < 6) {
|
|
||||||
if (items[i].quality < 50) {
|
|
||||||
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,7 @@
|
|||||||
|
package com.gildedrose.calculator.quality;
|
||||||
|
|
||||||
|
import com.gildedrose.Item;
|
||||||
|
|
||||||
|
public interface QualityCalculator {
|
||||||
|
int calculate(Item item, int updatedSellIn);
|
||||||
|
}
|
||||||
@ -0,0 +1,13 @@
|
|||||||
|
package com.gildedrose.calculator.quality.impl;
|
||||||
|
|
||||||
|
import com.gildedrose.Item;
|
||||||
|
import com.gildedrose.calculator.quality.QualityCalculator;
|
||||||
|
|
||||||
|
public class AgedBrieQualityCalculator implements QualityCalculator {
|
||||||
|
@Override
|
||||||
|
public int calculate(Item item, int updatedSellIn) {
|
||||||
|
int increaseAmount = (updatedSellIn < 0) ? 2 : 1;
|
||||||
|
int newQuality = item.quality + increaseAmount;
|
||||||
|
return Math.min(50, newQuality);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,18 @@
|
|||||||
|
package com.gildedrose.calculator.quality.impl;
|
||||||
|
|
||||||
|
import com.gildedrose.Item;
|
||||||
|
import com.gildedrose.calculator.quality.QualityCalculator;
|
||||||
|
|
||||||
|
public class BackstagePassQualityCalculator implements QualityCalculator {
|
||||||
|
@Override
|
||||||
|
public int calculate(Item item, int updatedSellIn) {
|
||||||
|
if (updatedSellIn < 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int qualityIncrease = 1 + (item.sellIn < 11 ? 1 : 0) + (item.sellIn < 6 ? 1 : 0);
|
||||||
|
int newQuality = item.quality + qualityIncrease;
|
||||||
|
|
||||||
|
return Math.min(50, newQuality);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,13 @@
|
|||||||
|
package com.gildedrose.calculator.quality.impl;
|
||||||
|
|
||||||
|
import com.gildedrose.Item;
|
||||||
|
import com.gildedrose.calculator.quality.QualityCalculator;
|
||||||
|
|
||||||
|
public class DefaultQualityCalculator implements QualityCalculator {
|
||||||
|
@Override
|
||||||
|
public int calculate(Item item, int updatedSellIn) {
|
||||||
|
int decreaseAmount = (updatedSellIn < 0) ? 2 : 1;
|
||||||
|
int newQuality = item.quality - decreaseAmount;
|
||||||
|
return Math.max(0, newQuality);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,11 @@
|
|||||||
|
package com.gildedrose.calculator.quality.impl;
|
||||||
|
|
||||||
|
import com.gildedrose.Item;
|
||||||
|
import com.gildedrose.calculator.quality.QualityCalculator;
|
||||||
|
|
||||||
|
public class SulfurasQualityCalculator implements QualityCalculator {
|
||||||
|
@Override
|
||||||
|
public int calculate(Item item, int updatedSellIn) {
|
||||||
|
return item.quality;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,7 @@
|
|||||||
|
package com.gildedrose.calculator.sellIn;
|
||||||
|
|
||||||
|
import com.gildedrose.Item;
|
||||||
|
|
||||||
|
public interface SellInCalculator {
|
||||||
|
int calculate(Item item);
|
||||||
|
}
|
||||||
@ -0,0 +1,11 @@
|
|||||||
|
package com.gildedrose.calculator.sellIn.impl;
|
||||||
|
|
||||||
|
import com.gildedrose.Item;
|
||||||
|
import com.gildedrose.calculator.sellIn.SellInCalculator;
|
||||||
|
|
||||||
|
public class StandardSellInCalculator implements SellInCalculator {
|
||||||
|
@Override
|
||||||
|
public int calculate(Item item) {
|
||||||
|
return item.sellIn - 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,11 @@
|
|||||||
|
package com.gildedrose.calculator.sellIn.impl;
|
||||||
|
|
||||||
|
import com.gildedrose.Item;
|
||||||
|
import com.gildedrose.calculator.sellIn.SellInCalculator;
|
||||||
|
|
||||||
|
public class SulfurasSellInCalculator implements SellInCalculator {
|
||||||
|
@Override
|
||||||
|
public int calculate(Item item) {
|
||||||
|
return item.sellIn;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,51 @@
|
|||||||
|
package com.gildedrose.strategy;
|
||||||
|
|
||||||
|
import com.gildedrose.Item;
|
||||||
|
import com.gildedrose.calculator.quality.impl.AgedBrieQualityCalculator;
|
||||||
|
import com.gildedrose.calculator.quality.impl.BackstagePassQualityCalculator;
|
||||||
|
import com.gildedrose.calculator.quality.impl.DefaultQualityCalculator;
|
||||||
|
import com.gildedrose.calculator.quality.impl.SulfurasQualityCalculator;
|
||||||
|
import com.gildedrose.calculator.sellIn.impl.StandardSellInCalculator;
|
||||||
|
import com.gildedrose.calculator.sellIn.impl.SulfurasSellInCalculator;
|
||||||
|
import com.gildedrose.strategy.impl.ItemUpdateStrategy;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class StrategyProvider {
|
||||||
|
|
||||||
|
private final Map<String, UpdateStrategy> strategies;
|
||||||
|
private final UpdateStrategy defaultStrategy;
|
||||||
|
|
||||||
|
public static final String AGED_BRIE_NAME = "Aged Brie";
|
||||||
|
public static final String BACKSTAGE_NAME = "Backstage passes to a TAFKAL80ETC concert";
|
||||||
|
public static final String SULFURAS_NAME = "Sulfuras, Hand of Ragnaros";
|
||||||
|
|
||||||
|
public StrategyProvider() {
|
||||||
|
UpdateStrategy normalStrategy = new ItemUpdateStrategy(new DefaultQualityCalculator(), new StandardSellInCalculator());
|
||||||
|
UpdateStrategy agedBrieStrategy = new ItemUpdateStrategy(new AgedBrieQualityCalculator(), new StandardSellInCalculator());
|
||||||
|
Map<String, UpdateStrategy> strategyMap = getUpdateStrategyMap(agedBrieStrategy);
|
||||||
|
this.strategies = strategyMap;
|
||||||
|
this.defaultStrategy = normalStrategy;
|
||||||
|
}
|
||||||
|
|
||||||
|
public StrategyProvider(Map<String, UpdateStrategy> strategyMap, UpdateStrategy defaultStrategy) {
|
||||||
|
this.strategies = strategyMap;
|
||||||
|
this.defaultStrategy = defaultStrategy;
|
||||||
|
}
|
||||||
|
|
||||||
|
public UpdateStrategy getStrategyForItem(Item item) {
|
||||||
|
return strategies.getOrDefault(item.name, defaultStrategy);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Map<String, UpdateStrategy> getUpdateStrategyMap(UpdateStrategy agedBrieStrategy) {
|
||||||
|
UpdateStrategy backstageStrategy = new ItemUpdateStrategy(new BackstagePassQualityCalculator(), new StandardSellInCalculator());
|
||||||
|
UpdateStrategy sulfurasStrategy = new ItemUpdateStrategy(new SulfurasQualityCalculator(), new SulfurasSellInCalculator());
|
||||||
|
|
||||||
|
Map<String, UpdateStrategy> strategyMap = Map.of(
|
||||||
|
AGED_BRIE_NAME, agedBrieStrategy,
|
||||||
|
BACKSTAGE_NAME, backstageStrategy,
|
||||||
|
SULFURAS_NAME, sulfurasStrategy
|
||||||
|
);
|
||||||
|
return strategyMap;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,7 @@
|
|||||||
|
package com.gildedrose.strategy;
|
||||||
|
|
||||||
|
import com.gildedrose.Item;
|
||||||
|
|
||||||
|
public interface UpdateStrategy {
|
||||||
|
void update(Item item);
|
||||||
|
}
|
||||||
@ -0,0 +1,25 @@
|
|||||||
|
package com.gildedrose.strategy.impl;
|
||||||
|
|
||||||
|
import com.gildedrose.Item;
|
||||||
|
import com.gildedrose.calculator.quality.QualityCalculator;
|
||||||
|
import com.gildedrose.calculator.sellIn.SellInCalculator;
|
||||||
|
import com.gildedrose.strategy.UpdateStrategy;
|
||||||
|
|
||||||
|
public class ItemUpdateStrategy implements UpdateStrategy {
|
||||||
|
|
||||||
|
private final QualityCalculator qualityCalculator;
|
||||||
|
private final SellInCalculator sellinCalculator;
|
||||||
|
|
||||||
|
public ItemUpdateStrategy(QualityCalculator qualityCalculator, SellInCalculator sellinCalculator) {
|
||||||
|
this.qualityCalculator = qualityCalculator;
|
||||||
|
this.sellinCalculator = sellinCalculator;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void update(Item item) {
|
||||||
|
int updatedSellIn = this.sellinCalculator.calculate(item);
|
||||||
|
int updatedQuality = this.qualityCalculator.calculate(item, updatedSellIn);
|
||||||
|
item.sellIn = updatedSellIn;
|
||||||
|
item.quality = updatedQuality;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,7 +1,7 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
if [ ! -d "venv" ]; then
|
if [ ! -d "venv" ]; then
|
||||||
python -m venv venv
|
python3 -m venv venv
|
||||||
fi
|
fi
|
||||||
venv/bin/pip install texttest
|
venv/bin/pip install texttest
|
||||||
venv/bin/texttest -d . -con "$@"
|
venv/bin/texttest -d . -con "$@"
|
||||||
|
|||||||
@ -22,7 +22,7 @@ diff_program:meld
|
|||||||
|
|
||||||
# Settings for the Java version using Gradle wrapped in a python script
|
# Settings for the Java version using Gradle wrapped in a python script
|
||||||
#executable:${TEXTTEST_HOME}/Java/texttest_rig.py
|
#executable:${TEXTTEST_HOME}/Java/texttest_rig.py
|
||||||
#interpreter:python
|
#interpreter:python3
|
||||||
|
|
||||||
# Settings for the Java version using the classpath
|
# Settings for the Java version using the classpath
|
||||||
#executable:com.gildedrose.TexttestFixture
|
#executable:com.gildedrose.TexttestFixture
|
||||||
@ -30,12 +30,12 @@ diff_program:meld
|
|||||||
# note you'll also need to update the file environment.gr with your classpath if you keep your classfiles somewhere unusual
|
# note you'll also need to update the file environment.gr with your classpath if you keep your classfiles somewhere unusual
|
||||||
|
|
||||||
# Settings for the Kotlin version using Gradle wrapped in a python script
|
# Settings for the Kotlin version using Gradle wrapped in a python script
|
||||||
#executable:${TEXTTEST_HOME}/Kotlin/texttest_rig.py
|
executable:${TEXTTEST_HOME}/Kotlin/texttest_rig.py
|
||||||
#interpreter:python
|
interpreter:python3
|
||||||
|
|
||||||
# Settings for the Ruby version
|
# Settings for the Ruby version
|
||||||
executable:${TEXTTEST_HOME}/ruby/texttest_fixture.rb
|
#executable:${TEXTTEST_HOME}/ruby/texttest_fixture.rb
|
||||||
interpreter:ruby
|
#interpreter:ruby
|
||||||
|
|
||||||
# Settings for the C# Core version
|
# Settings for the C# Core version
|
||||||
#executable:${TEXTTEST_HOME}/csharpcore/GildedRoseTests/bin/Debug/net8.0/GildedRoseTests
|
#executable:${TEXTTEST_HOME}/csharpcore/GildedRoseTests/bin/Debug/net8.0/GildedRoseTests
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user