Я борюсь с дизайном, который отвечает всем моим требованиям
У меня есть набор алгоритмов, которые можно выполнять индивидуально или комбинировать в различных конфигурациях для получения дополнительных выходных данных.
Эти алгоритмы могут быть дорогостоящими, и если они запускаются один раз, результат должен быть обналичен для последующего использования.
Алгоритмы могут использоваться в различных контекстах.
Алгоритмы должны быть открыты для расширения, чтобы они могли не отставать от ежегодных пересмотров стандартов.
Проект должен быть ремонтопригодным
Моей первой попыткой удовлетворить их было использование шаблона стратегии со следующим дизайном…

Вывод из расчеты поведений кэшируются в самих поведениях.
Это удовлетворяет требованиям 1,2,3, но не 4.
Для вызова CalculateOutput () требуется 30 различных параметров, своих и их Необходимо позволить ему вызывать другие конкретные поведения. Изменение параметров для одной функции будет иметь эффект детонации и часто приводит к тому, что все поведения будут вынуждены обновлять свой список параметров.
Кроме того, система кэширования работала некорректно, поскольку не всегда Соотношение 1: 1 между поведением. Например, чтобы создать вывод из EnergyBehaviour, ему нужно выполнить несколько вызовов NHSolarPosition. Как «NHSolarPosition» может кэшировать несколько «angleOfIncidence_» только для одного кэшированного «outPut _»?
Я попытался решить вышеуказанную проблему, инкапсулировав все параметры в их собственный тип «PVPanel» и передав его поведения. Это было проблематично c по двум причинам. Во-первых, при обращении к простому поведению возникали значительные накладные расходы, поскольку могла потребоваться только пара параметров, однако было много других параметров, которые не использовались или не относились к делу. Во-вторых, передача типа «PVPanel» в поведение привела к сбою требования 2. Я не смог использовать поведение в контексте, отличном от PVPanels.
Я изо всех сил стараюсь согласовать все свои требования с единый элегантный дизайн.