Extract item types and quality into their own classes to allow reuse

This commit is contained in:
Sarah Ashri 2024-03-15 11:18:11 +10:00
parent 9293c86c66
commit 5e5d6e9fa7
4 changed files with 41 additions and 29 deletions

View File

@ -4,9 +4,6 @@ namespace GildedRoseKata;
public abstract class DailyUpdater public abstract class DailyUpdater
{ {
private const int MinQuality = 0;
private const int MaxQuality = 50;
public void DailyUpdate(Item item) public void DailyUpdate(Item item)
{ {
UpdateSellIn(item); UpdateSellIn(item);
@ -24,12 +21,12 @@ public abstract class DailyUpdater
protected static void IncreaseQuality(Item item, int byValue = 1) protected static void IncreaseQuality(Item item, int byValue = 1)
{ {
item.Quality = int.Min(item.Quality + byValue, MaxQuality); item.Quality = int.Min(item.Quality + byValue, ItemQuality.MaxQuality);
} }
protected static void DecreaseQuality(Item item, int byValue = 1) protected static void DecreaseQuality(Item item, int byValue = 1)
{ {
item.Quality = int.Max(item.Quality - byValue, MinQuality); item.Quality = int.Max(item.Quality - byValue, ItemQuality.MinQuality);
} }
} }

View File

@ -5,37 +5,30 @@ namespace GildedRoseKata;
public class DailyUpdaterFactory public class DailyUpdaterFactory
{ {
private enum ItemType
{ private readonly Dictionary<ItemType.ItemKey, DailyUpdater> _dailyUpdaters = new();
Regular,
Legendary,
BetterWithAge,
BackstagePasses
}
private readonly Dictionary<ItemType, DailyUpdater> _dailyUpdaters = new();
public DailyUpdater GetDailyUpdater(Item item) public DailyUpdater GetDailyUpdater(Item item)
{ {
if (IsLegendaryItem(item)) if (ItemType.IsLegendaryItem(item))
{ {
return GetOrCreateDailyUpdater(ItemType.Legendary, () => new DailyUpdaterForLegendaryItems()); return GetOrCreateDailyUpdater(ItemType.ItemKey.Legendary, () => new DailyUpdaterForLegendaryItems());
} }
if (IsBetterWithAgeItem(item)) if (ItemType.IsBetterWithAgeItem(item))
{ {
return GetOrCreateDailyUpdater(ItemType.BetterWithAge, () => new DailyUpdaterForBetterWithAgeItems()); return GetOrCreateDailyUpdater(ItemType.ItemKey.BetterWithAge, () => new DailyUpdaterForBetterWithAgeItems());
} }
if(IsBackstagePassesItem(item)) if(ItemType.IsBackstagePassesItem(item))
{ {
return GetOrCreateDailyUpdater(ItemType.BackstagePasses, () => new DailyUpdaterForBackstagePassesItems()); return GetOrCreateDailyUpdater(ItemType.ItemKey.BackstagePasses, () => new DailyUpdaterForBackstagePassesItems());
} }
return GetOrCreateDailyUpdater(ItemType.Regular, () => new DailyUpdaterForRegularItems()); return GetOrCreateDailyUpdater(ItemType.ItemKey.Regular, () => new DailyUpdaterForRegularItems());
} }
private DailyUpdater GetOrCreateDailyUpdater(ItemType itemType, Func<DailyUpdater> createDailyUpdater) private DailyUpdater GetOrCreateDailyUpdater(ItemType.ItemKey itemType, Func<DailyUpdater> createDailyUpdater)
{ {
if (!_dailyUpdaters.ContainsKey(itemType)) if (!_dailyUpdaters.ContainsKey(itemType))
{ {
@ -44,11 +37,4 @@ public class DailyUpdaterFactory
return _dailyUpdaters[itemType]; return _dailyUpdaters[itemType];
} }
private static bool IsLegendaryItem(Item item) => item.Name.ToLower().Contains("sulfuras");
private static bool IsBackstagePassesItem(Item item) => item.Name.ToLower().Contains("backstage passes");
private static bool IsBetterWithAgeItem(Item item) => item.Name.ToLower().Equals("aged brie");
} }

View File

@ -0,0 +1,9 @@
namespace GildedRoseKata;
public static class ItemQuality
{
public const int MinQuality = 0;
public const int MaxQuality = 50;
public const int LegendaryItemQuality = 80;
}

View File

@ -0,0 +1,20 @@
namespace GildedRoseKata;
public static class ItemType
{
public enum ItemKey
{
Regular,
Legendary,
BetterWithAge,
BackstagePasses
}
public static bool IsLegendaryItem(Item item) => IsLegendaryItem(item.Name);
public static bool IsLegendaryItem(string name) => name.ToLower().Contains("sulfuras");
public static bool IsBackstagePassesItem(Item item) => item.Name.ToLower().Contains("backstage passes");
public static bool IsBetterWithAgeItem(Item item) => item.Name.ToLower().Equals("aged brie");
}