我的ChangeCalculator做对了吗?

时间:2018-08-25 20:17:20

标签: c# .net solid-principles

我正在OOP中进行一些练习,我刚刚创建了一个程序,用于计算商店零钱的面额。因此,假设某件商品的成本为10,我给出25.30(出于某种原因),那么我应该得到一个变化:一10,一5,一0.20,一0.10。

我的程序包括:

  • IChangeCalculator-表示变更计算器
  • ChangeCalculatorPLN-返回MoneyAmountPLN(以PLN货币表示的货币面额金额)的实现
  • IMoneyAmount-表示有关面额的数据
  • MoneyAmountPLN-表示波兰兹罗提的货币面额金额
  • IMoneyToCoinsConverter-表示将给定货币转换为实现IMoneyAmount的东西的转换器
  • MoneyToCoinsConverterPLN-将给定的金额转换为MoneyAmountPLN

这是源代码:

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是否是解决此类问题的好地方,如果是,我是在向比我更有经验的开发人员寻求建议。

0 个答案:

没有答案