我正在面临一个编程问题,不知道如何以面向对象和灵活的方式解决。我想到了一些糟糕的解决方案,但我正在寻找好的解决方案。我使用Java进行开发,所以我更喜欢Java的思路,但任何面向对象的想法都受欢迎。
我一直在寻找想法、设计模式或一些算法来帮助我,但我不知道该给我的问题起什么术语或名称,因此我找不到任何线索。
问题:
概述:
我需要跟踪对实体集合进行不同更改的过程的部分结果。我需要将这些结果报告给用户,在表格报告中详细说明每个计算“步骤”。同时,我还需要将这个集合持久化到数据库中。
细节:
我维护的软件有一个类似于这个实体:
public class Salary {
private Date date;
private BigDecimal amount;
}
那被归为一个集合,就像这样:
List<Salary> thisYearSalaries;
根据一些规则,这组实体可以通过一组“任务”进行修改:
- 应用一定的税收(来自不同税种的集合)
- 计算资金金额的未来价值(更多信息)
- 减少一定金额以保持在最大限额以下
- 等等...
例如:
public void processSalaries(List<Salary> theSalaries) {
applyTax(theSalaries, Taxes.TAX_TYPE_1);
(...)
getFutureValue(theSalaries, someFutureDate);
(...)
restrictToAMaximum(theSalaries, Maximum.MARRIED_MAXIMUM);
(...)
applyTax(theSalaries, TAXES.TAX_TYPE_3);
(...)
}
public void applyTax(List<Salary> theSalaries, Tax taxToApply) {
for(Salary aSalary : theSalaries) {
aSalary.setAmount(calculateAmountWithTax(aSalary.getAmount(), taxToApply);
}
}
(...)
我需要做的是处理这个工资集合,改变金额但保留所有中间的“状态”,以表格的形式向用户展示。表格应该有以下列:
示例报告: (问题仅涉及前4行数据,不要关注其余部分)
我的想法:
为每个“部分结果”添加属性到Salary类中。
public class Salary {
(...)
private BigDecimal originalAmount;
private BigDecimal amountAfterFirstTax;
private BigDecimal amountAfterMaximumRestriction;
(...)
}
问题:
- “步骤”不是固定的,也许明天会有一个“步骤”改变,出现一个新的“步骤”,或者某些步骤的“意义”改变。在这种情况下,我将需要重构太多的代码。
- 有些“步骤”可以重复,那么我怎么告诉“方法”在哪个属性中“设置”计算结果呢?
向薪资类添加一个HashMap,可以在其中放置部分结果,并将“key”传递给“step”方法,指示它放置部分结果的位置
public class Salary {
(...)
HashMap<String, BigDecimal> partialResults;
(...)
}
问题:
- 在某些地方,我需要将HashMap填充到JPA实体中以便将其保存到数据库中
- 如果其他开发人员更改键的名称(出于任何原因),则可能会破坏属性的“填充”
最终说明:我的应用程序中有其他类似情况的“相似”实体,因此如果我们可以找到一般解决方案,那将是很棒的:D
编辑:关于如何建模要持久化的数据的新疑问
所有这些想法都非常相似且非常有用。它们都与命令模式有关,我认为这些都是不错的解决方案。但是现在我有一些新的疑问:
通过更高的抽象级别,我的应用程序做了类似这样的事情:
- 用户输入薪水列表
- 应用程序通过不同的“步骤”处理这些薪水
- 使用最后几个工资额计算平均值并继续进行其他计算
- 经过一些屏幕和一些处理后,向用户显示带有最终薪资金额和所有中间步骤的报告。然后我保存此中间信息以进行审核
所以,第二步几乎已经解决了。我会使用类似命令模式的东西。我的问题现在是如何建模数据以在关系型数据库中持久化它。因为除了每个操作的部分“结果”之外,还有更多的信息,我不需要向用户显示,但我需要将其存储在数据库中。
我的想法是这样的:
薪资 表:
id
date // The date of the Salary
finalAmount // The final amount after all the calculations ends
partialResults 表格:
id
salaryId // The id of the salary which this element represent a partial result
amount // Partial amount
operationCode // Type of operation
operationDescription
问题在于,我的“未来价值”操作输出以下信息:
- 未来价值的日期
- 用于更新价值的系数
- 部分金额
但是,“应用税”操作具有不同的信息:
- 应用的百分比税率
- 部分金额
那么,我如何为不同的操作保存不同的“输出”信息呢?