Я столкнулся с проблемой программирования, которую не знаю, как решить объектно-ориентированный и гибкий способ. Я имею в виду некоторые плохие решения, но я ищу хорошее. Я занимаюсь разработкой на 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 в класс Salary, в который я могу поместить частичные результаты, и передайте методу "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
частичные результаты Таблица:
id
salaryId // The id of the salary which this element represent a partial result
amount // Partial amount
operationCode // Type of operation
operationDescription
Но проблема в том, что моя операция "будущей стоимости" имеет в качестве вывода следующую информацию:
- Дата будущей стоимости
- Коэффициент, используемый для обновления значения
- Частичная сумма
Но операция "применить налог" имеет другую информацию:
- % Налога
- Частичная сумма
Итак, как я могу сохранить различную "выходную" информацию для разных операций?