c# - 我的 ChangeCalculator 做得对吗?
问题描述
我在 OOP 中做一些练习,我刚刚创建了一个程序来计算商店找零时的面额数量。所以,假设某样东西的价格是 10,我给了 25.30(出于某种原因),所以我应该得到一个零钱:一个 10,一个 5,一个 0.20,一个 0.10。
我的程序包括:
- IChangeCalculator - 表示变化计算器
- ChangeCalculatorPLN - 返回 MoneyAmountPLN(以 PLN 货币表示的货币面额金额)的实现
- IMoneyAmount - 表示有关面额数量的数据
- MoneyAmountPLN - 以 PLN 表示货币面额的金额
- 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 是否是解决此类问题的好地方,如果是,我正在向比我更有经验的开发人员寻求建议。
解决方案
推荐阅读
- c++ - c++ 命名参数习语 - 未设置字符串属性
- c++ - 将 URL 转换为 cpp 字符串
- .net - 如何在 Windows 服务中使用 FileSystemWatcher
- angular - 使用单一属性为其他人设置 *ngif = false
- android - 即使在使用 LENGTH_INDEFINITE 后 Snackbar 也会关闭
- php - 如何在wordpress中为每个页面制作选项
- excel - Excel:比较 2 列并将缺失的数据拉入第 3 列
- javascript - 无法向api发送数据
- python - 在 Atom 上运行 flake 8 时出错
- flask - Python Flask App - 向客户端发送/推送实时传感器数据的工具