首页 > 解决方案 > 我的 ChangeCalculator 做得对吗?

问题描述

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

标签: c#.netsolid-principles

解决方案


推荐阅读