GildedRose Refactoring

This commit is contained in:
Dmytro_Prokhorchuk 2025-09-19 12:43:46 +03:00
parent c6f842ef29
commit dd1894e489
14 changed files with 193 additions and 55 deletions

View File

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

View File

@ -0,0 +1,7 @@
package com.gildedrose.calculator.quality;
import com.gildedrose.Item;
public interface QualityCalculator {
int calculate(Item item, int updatedSellIn);
}

View File

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

View File

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

View File

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

View File

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

View File

@ -0,0 +1,7 @@
package com.gildedrose.calculator.sellIn;
import com.gildedrose.Item;
public interface SellInCalculator {
int calculate(Item item);
}

View File

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

View File

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

View File

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

View File

@ -0,0 +1,7 @@
package com.gildedrose.strategy;
import com.gildedrose.Item;
public interface UpdateStrategy {
void update(Item item);
}

View File

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

View File

@ -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 "$@"

View File

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