Code refactored to adapt it to Strategy Pattern.

This commit is contained in:
israel 2017-10-20 10:36:32 +01:00
parent 649e42d256
commit 75d8793a82
9 changed files with 238 additions and 12 deletions

View File

@ -12,7 +12,16 @@ namespace csharp
this.Items = Items.Select(i => new ItemWrapperContext(i)).ToList<ItemWrapperContext>();
}
public void UpdateQuality()
{
for (var i = 0; i < Items.Count; i++)
{
Items[i].UpdateQuality();
}
}
public void UpdateQuality_old()
{
for (var i = 0; i < Items.Count; i++)
{

View File

@ -0,0 +1,77 @@
using System;
using System.Collections.Generic;
namespace csharp.Strategy
{
class CategoryStrategiesFactory
{
#region Variables
static private CategoryStrategiesFactory _strategiesFactory = null;
#endregion
#region Constructor
private CategoryStrategiesFactory() { }
#endregion
#region Methods
public static CategoryStrategiesFactory GetInstance()
{
if (_strategiesFactory == null)
{
_strategiesFactory = new CategoryStrategiesFactory();
}
return _strategiesFactory;
}
#endregion
public List<ICategoryStrategy> GetCategoryStrategies(Item item)
{
List<ICategoryStrategy> listCategoryStrategies = new List<ICategoryStrategy>();
if (item.Name == "Aged Brie")
{
listCategoryStrategies = new List<ICategoryStrategy>()
{
new OlderIsBetterStrategy()
};
}
else if (item.Name == "Backstage passes to a TAFKAL80ETC concert")
{
listCategoryStrategies = new List<ICategoryStrategy>()
{
new NextExpiredImproveQualityStrategy()
};
}
else if (item.Name == "Sulfuras, Hand of Ragnaros")
{
listCategoryStrategies = new List<ICategoryStrategy>()
{
};
}
else if (item.Name == "Conjured Mana Cake")
{
listCategoryStrategies = new List<ICategoryStrategy>()
{
new TwiceFastDegradeQualityStrategy()
};
}
else
{
listCategoryStrategies = new List<ICategoryStrategy>()
{
new NormalDegradeStrategy()
};
}
return listCategoryStrategies;
}
}
}

View File

@ -0,0 +1,9 @@
using System;
namespace csharp.Strategy
{
interface ICategoryStrategy
{
void Update(Item item);
}
}

View File

@ -1,10 +1,18 @@
using System;
using System.Collections.Generic;
namespace csharp.Strategy
{
public class ItemWrapperContext
{
#region Variables
private Item _item;
private List<ICategoryStrategy> listCategoryStrategies;
#endregion
#region Properties
public string Name
{
@ -24,9 +32,6 @@ namespace csharp.Strategy
set { this._item.SellIn = value; }
}
//private List<ICategoryStrategy> listCategoryStrategies;
private Item _item;
#endregion
#region Constructor
@ -35,22 +40,21 @@ namespace csharp.Strategy
{
this._item = item;
//listCategoryStrategies = StrategiesFactory.GetInstance().GetCategoryStrategies(item);
listCategoryStrategies = CategoryStrategiesFactory.GetInstance().GetCategoryStrategies(item);
}
#endregion
#region Methods
//public void UpdateQuality()
//{
// foreach (ICategoryStrategy categoryStrategyItem in this.listCategoryStrategies)
// {
// categoryStrategyItem.UpdateQuality(this);
// }
//}
public void UpdateQuality()
{
foreach (ICategoryStrategy categoryStrategyItem in this.listCategoryStrategies)
{
categoryStrategyItem.Update(this._item);
}
}
#endregion
}
}

View File

@ -0,0 +1,37 @@
using System;
namespace csharp.Strategy
{
class NextExpiredImproveQualityStrategy : ICategoryStrategy
{
public void Update(Item item)
{
item.SellIn--;
if (item.SellIn < 0)
{
item.Quality = 0;
}
else
{
int inc = 1;
if (item.SellIn < 5)
{
inc = 3;
}
else if (item.SellIn < 10)
{
inc = 2;
}
item.Quality += inc;
if (item.Quality > 50)
{
item.Quality = 50;
}
}
}
}
}

View File

@ -0,0 +1,22 @@
using System;
namespace csharp.Strategy
{
class NormalDegradeStrategy : ICategoryStrategy
{
public void Update(Item item)
{
if (item.Quality > 0)
{
item.Quality--;
}
item.SellIn--;
if (item.SellIn < 0 && item.Quality > 0)
{
item.Quality--;
}
}
}
}

View File

@ -0,0 +1,26 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace csharp.Strategy
{
class OlderIsBetterStrategy : ICategoryStrategy
{
public void Update(Item item)
{
if (item.Quality < 50)
{
item.Quality++;
}
item.SellIn--;
if (item.SellIn < 0 && item.Quality < 50)
{
item.Quality++;
}
}
}
}

View File

@ -0,0 +1,29 @@
using System;
namespace csharp.Strategy
{
class TwiceFastDegradeQualityStrategy : ICategoryStrategy
{
public void Update(Item item)
{
int degrade = 1;
item.SellIn--;
if (item.SellIn < 0)
{
degrade = 2;
}
if (item.Quality > 0)
{
item.Quality -= degrade;
}
if (item.Quality < 0)
{
item.Quality = 0;
}
}
}
}

View File

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="packages\NUnit3TestAdapter.3.8.0\build\net35\NUnit3TestAdapter.props" Condition="Exists('packages\NUnit3TestAdapter.3.8.0\build\net35\NUnit3TestAdapter.props')" />
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
@ -65,9 +66,15 @@
<Compile Include="GildedRose.cs" />
<Compile Include="GildedRoseTest.cs" />
<Compile Include="Item.cs" />
<Compile Include="Strategy\CategoryStrategiesFactory.cs" />
<Compile Include="Strategy\ICategoryStrategy.cs" />
<Compile Include="Strategy\ItemWrapperContext.cs" />
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Strategy\NextExpiredImproveQualityStrategy.cs" />
<Compile Include="Strategy\NormalDegradeStrategy.cs" />
<Compile Include="Strategy\OlderIsBetterStrategy.cs" />
<Compile Include="Strategy\TwiceFastDegradeQualityStrategy.cs" />
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
@ -77,6 +84,12 @@
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>Este proyecto hace referencia a los paquetes NuGet que faltan en este equipo. Use la restauración de paquetes NuGet para descargarlos. Para obtener más información, consulte http://go.microsoft.com/fwlink/?LinkID=322105. El archivo que falta es {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('packages\NUnit3TestAdapter.3.8.0\build\net35\NUnit3TestAdapter.props')" Text="$([System.String]::Format('$(ErrorText)', 'packages\NUnit3TestAdapter.3.8.0\build\net35\NUnit3TestAdapter.props'))" />
</Target>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">