У меня есть класс, представляющий сущность домена, которая содержит много вычисляемых свойств. Большинство расчетов зависит от других свойств, которые также рассчитываются. В простейшей форме пример класса может выглядеть примерно так:
public class AnalysisEntity
{
public decimal InputA { get; set; }
public decimal InputB { get; set; }
public decimal InputC { get; set; }
public decimal CalculatedValueA
{
get { return InputA * InputC; }
}
public decimal CalculatedValueB
{
get
{
decimal factor = FactorGenerator.ExpensiveOperation();
return CalculatedValueA / factor;
}
}
public decimal CalculatedValueC
{
get { return InputA * InputB; }
}
public decimal CalculatedValueD
{
get { return (CalculatedValueA * InputB) / CalculatedValueB; }
}
public decimal CalculatedValueE
{
get { return CalculatedValueD / aConstant; }
}
}
Однако из-за этого решения у меня возникают следующие проблемы:
- Неэффективно, потому что некоторые вычисления (некоторые из которых являются длительными) вызывают многократно.
- Сложно провести единичное тестирование отдельных вычислений без предоставления всех необходимых входных данных для всех зависимых вычислений, чтобы они работали первыми.
- Трудно эффективно извлечь из постоянства (я использую NHibernate), потому что, хотя вычисленные данные могут быть сохранены в базе данных, они не извлекаются и вместо этого пересчитываются всякий раз, когда объект читается.
- Трудно добавлять вычисления, поскольку модульные тесты становятся все больше и больше с необходимыми входными данными.
Я экспериментировал с использованием объекта калькулятора и паттерна стратегии для установки внутренних полей для свойств, но в итоге я получаю слишком длинную управляющую функцию для выполнения вычислений. Кроме того, перемещение всех вычислений на другой объект превращает исходную сущность в объект анемичной области, который я продолжаю читать, следует избегать.
Какие шаблоны проектирования и структуру классов я должен использовать для решения вышеуказанных проблем?
Спасибо