En una aplicación Delphi en la que estamos trabajando tenemos una gran estructura de objetos relacionados. Algunas de las propiedades de estos objetos tienen valores que se calculan en tiempo de ejecución y estoy buscando una forma de almacenar en caché los resultados para los cálculos más intensivos. Un enfoque que uso es guardar el valor en un miembro privado la primera vez que se calcula. He aquí un breve ejemplo:Enfoques para almacenar en caché los valores calculados
unit Unit1;
interface
type
TMyObject = class
private
FObject1, FObject2: TMyOtherObject;
FMyCalculatedValue: Integer;
function GetMyCalculatedValue: Integer;
public
property MyCalculatedValue: Integer read GetMyCalculatedValue;
end;
implementation
function TMyObject.GetMyCalculatedValue: Integer;
begin
if FMyCalculatedValue = 0 then
begin
FMyCalculatedValue :=
FObject1.OtherCalculatedValue + // This is also calculated
FObject2.OtherValue;
end;
Result := FMyCalculatedValue;
end;
end.
No es raro que los objetos que se utilizan para el cambio de cálculo y el valor almacenado en caché se deben restablecer y recalculado. Hasta ahora abordamos este problema mediante el uso del patrón de observador: los objetos implementan un evento OnChange para que otros puedan suscribirse, recibir notificaciones cuando cambien y restablecer los valores almacenados en caché. Este enfoque funciona, pero tiene algunas desventajas:
- Se necesita mucha memoria para gestionar las suscripciones.
- No escala bien cuando un valor en caché depende de muchos objetos (una lista, por ejemplo).
- La dependencia no es muy específica (incluso si el valor de caché depende solo de una propiedad, también se restablecerá cuando cambien otras propiedades).
- Administrar las suscripciones afecta el rendimiento general y es difícil de mantener (los objetos se eliminan, se mueven, ...).
- No está claro cómo tratar los cálculos en función de otros valores calculados.
Y finalmente la pregunta: ¿puede sugerir otros enfoques para la implementación de los valores calculados en caché?
Incluso si está etiquetado 'delphi', estoy muy interesado en saber si se ha desarrollado un patrón en particular. –
Agregué la etiqueta Delphi para que limite las sugerencias a los lenguajes estáticos y no a los recogidos. – Tihauan