Другой подход, который используется в большой и ужасной системе электронной коммерции, с которой я работаю, - это иметь параллельную структуру временных объектов, содержащих вычисленную информацию. Таким образом, параллельно с Order, есть OrderPrice. Для каждого Предмета в заказе есть ItemPrice. Если у элемента есть набор параметров, то у ItemPrice будет набор параметров. Опция ShippingOption заказа также имеет ShippingPrice и так далее. Ценообразование затем обрабатывается другой параллельной структурой калькуляторов цен - вы передаете Order для OrderPriceCalculator, и он возвращает вам OrderPrice. При этом он отправит каждый Item в ItemPriceCalculator, который отправит каждый Option в OptionPriceCalculator и т. Д.
Объекты цены могут ссылаться на объекты заказа, но не наоборот. Наша система действительно сохраняет цены, но отдельно от заказов.
Преимущество этого состоит в том, что он разделяет задачи описания содержимого заказа, описания цены заказа и расчета цены заказа.
Недостаток в том, что у вас огромное количество классов, и необходимая информация неизбежно никогда не попадает в объекты, которые вы должны передать.
Недостаток, вероятно, перевешивает преимущество.