我正在OOP中进行一些练习,我刚刚创建了一个程序,用于计算商店零钱的面额。因此,假设某件商品的成本为10,我给出25.30(出于某种原因),那么我应该得到一个变化:一10,一5,一0.20,一0.10。
我的程序包括:
这是源代码:
public interface IChangeCalculator<T> where T : IMoneyAmount
{
T Calculate(decimal price, decimal payedAmount);
}
public class ChangeCalculatorPLN : IChangeCalculator<MoneyAmountPLN>
{
IMoneyToCoinsConverter<MoneyAmountPLN> _moneyToCoinsConverter;
public ChangeCalculatorPLN( IMoneyToCoinsConverter<MoneyAmountPLN> moneyToCoinsConverter )
{
_moneyToCoinsConverter = moneyToCoinsConverter;
}
public MoneyAmountPLN Calculate(decimal price, decimal payedAmount)
{
var change = payedAmount - price;
if (change < 0)
throw new Exception("The given amount of money is not enough!");
if (change == 0)
return MoneyAmountPLN.Empty;
var amount = GetAmount(change);
return amount;
}
private MoneyAmountPLN GetAmount(decimal change)
{
return _moneyToCoinsConverter.Convert(change);
}
}
public interface IMoneyAmount
{
IEnumerable<int> GetAmounts( );
}
//MoneyAmountPLN is quite long, because it contains fields for each denomination: 500, 200, 100, 50, 20, 10, 1, 0.5, 0.2, 0.1, 0.05, 0.02, 0.01. I'll not put it here.
public interface IMoneyToCoinsConverter<T> where T : IMoneyAmount
{
T Convert(decimal money);
}
public class MoneyToCoinsConverterPLN : IMoneyToCoinsConverter<MoneyAmountPLN>
{
public MoneyAmountPLN Convert(decimal money)
{
//logic doesn't really matter here. It returns MoneyAmountPLN with corrects amounts of denominations.
}
}
该程序有效,我做了一些单元测试。我的真正问题是,我不确定这种实现是否很好。我做错了吗?可以将某些零件做得更好吗?我个人认为结构可能太复杂了?如果我第一次看到这样的程序,我可能会感到迷失,但是我不是一个很好的程序员,所以我不能说我的感觉是否正确。
我不确定StackOverflow是否是解决此类问题的好地方,如果是,我是在向比我更有经验的开发人员寻求建议。