mirror of
https://github.com/emilybache/GildedRose-Refactoring-Kata.git
synced 2026-02-06 10:12:34 +00:00
GildedRose Refactoring
This commit is contained in:
parent
c6f842ef29
commit
dd1894e489
@ -1,62 +1,26 @@
|
||||
package com.gildedrose;
|
||||
|
||||
import com.gildedrose.strategy.StrategyProvider;
|
||||
import com.gildedrose.strategy.UpdateStrategy;
|
||||
|
||||
class GildedRose {
|
||||
Item[] items;
|
||||
private final StrategyProvider strategyProvider;
|
||||
|
||||
public GildedRose(Item[] items) {
|
||||
this.items = items;
|
||||
this.strategyProvider = new StrategyProvider();
|
||||
}
|
||||
|
||||
public GildedRose(Item[] items, StrategyProvider strategyProvider) {
|
||||
this.items = items;
|
||||
this.strategyProvider = strategyProvider;
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
for (Item item : items) {
|
||||
UpdateStrategy strategy = this.strategyProvider.getStrategyForItem(item);
|
||||
strategy.update(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
if [ ! -d "venv" ]; then
|
||||
python -m venv venv
|
||||
python3 -m venv venv
|
||||
fi
|
||||
venv/bin/pip install texttest
|
||||
venv/bin/texttest -d . -con "$@"
|
||||
|
||||
@ -22,7 +22,7 @@ diff_program:meld
|
||||
|
||||
# Settings for the Java version using Gradle wrapped in a python script
|
||||
#executable:${TEXTTEST_HOME}/Java/texttest_rig.py
|
||||
#interpreter:python
|
||||
#interpreter:python3
|
||||
|
||||
# Settings for the Java version using the classpath
|
||||
#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
|
||||
|
||||
# Settings for the Kotlin version using Gradle wrapped in a python script
|
||||
#executable:${TEXTTEST_HOME}/Kotlin/texttest_rig.py
|
||||
#interpreter:python
|
||||
executable:${TEXTTEST_HOME}/Kotlin/texttest_rig.py
|
||||
interpreter:python3
|
||||
|
||||
# Settings for the Ruby version
|
||||
executable:${TEXTTEST_HOME}/ruby/texttest_fixture.rb
|
||||
interpreter:ruby
|
||||
#executable:${TEXTTEST_HOME}/ruby/texttest_fixture.rb
|
||||
#interpreter:ruby
|
||||
|
||||
# Settings for the C# Core version
|
||||
#executable:${TEXTTEST_HOME}/csharpcore/GildedRoseTests/bin/Debug/net8.0/GildedRoseTests
|
||||
|
||||
Loading…
Reference in New Issue
Block a user