Какой паттерн подойдет для решении задачи.
Есть абстрактный класс с методом Compute( ) к примеру;
Появилась задача сделать этот метод клиентским динамически встраиваемым. Клиент может написать свою реализацию. Тут же скомпилировать.
При инициализации объекта, клиент добавляет набор ресурсов с тегами(ключами) в словарь. и работает с ними в методе.
Словарь неизменяемый, и заполняется при инициализации. Отсюда видно, что поиск по ключу может быть заменен поиску по индексу. после инициализации. (выигрыш в скорости 20 раз для задачи).
Задача
заменить поиск по string ключу, прямым доступом по индексу
Задача была реализована сразу в приложении, (одно из решений ниже), но сейчас потребовалось что бы пользователь то же мог написать свою реализацию.
// к примеру такой код у пользователя
add("input_1",new Res());
add("input_2",new Res());
////.....
public override void Compute( ){
// пример
int i1=inputs["input_1"].GetVal();
// тут сразу видно, что возвращается одно и то же значение
int i2=inputs["input_2"].GetVal();
this._data= i1+i2;
}
// данный выше код должен быть таким при выполнение. или быть по смыслу таким
public override void Compute( ){
int i1=inputs[ 3 ].GetVal(); // прямой массив по индексу
int i2=inputs[ 4 ].GetVal(); // каждый уникальный тег имеет свой индекс, нужно только связать, и все.
this._data= i1+i2;
}
Решение одно из, пользователь должен определить метод/свойство замены или поле кеширования (но это усложняет код)
public override void Compute( ){
int i1= Res_1.GetVal();
int i2= Res_2.GetVal();
this._data= i1+i2;
}
private Res _res1;
public void Res_1 => {
if(_res1==null) _res1=build("input_1"); return _res1;
}
// вот последние 2 поля/свойства можно ли как-то сделать так, что бы клиент не
//реализовывал их. Так как это однотипное действие.
Задача оптимизировать, но не усложнить код клиента. Код клиента должен быть максимально простым. Получить ресурс, произвести операцию. все. А уже при встраивании, нужно оптимизировать.
И не знаю как, кроме как ковыряния в байткоде и заменой поиска по ключу вычисленным 1 раз значением(хотя не знаю).
Но есть какое простое решение, паттерн. Изначальная архитектура.
е