In un'applicazione Delphi su cui stiamo lavorando abbiamo una grande struttura di oggetti correlati. Alcune delle proprietà di questi oggetti hanno valori calcolati in fase di esecuzione e sto cercando un modo per memorizzare nella cache i risultati per i calcoli più intensivi. Un approccio che utilizzo è il salvataggio del valore in un membro privato la prima volta che viene calcolato. Ecco un breve esempio:Approcci per i valori calcolati nella cache
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.
Non è raro che gli oggetti utilizzati per il calcolo cambiamento ed il valore memorizzato nella cache dovrebbe essere azzerato e ricalcolato. Finora abbiamo affrontato questo problema utilizzando il pattern observer: gli oggetti implementano un evento OnChange in modo che altri possano iscriversi, ricevere notifiche quando cambiano e ripristinano i valori memorizzati nella cache. Questo approccio funziona ma presenta alcuni aspetti negativi:
- La gestione delle sottoscrizioni richiede molta memoria.
- Non si adatta bene quando un valore memorizzato nella cache dipende da molti oggetti (ad esempio un elenco).
- La dipendenza non è molto specifica (anche se un valore di cache dipende solo da una proprietà, verrà ripristinato anche quando cambiano altre proprietà).
- La gestione degli abbonamenti influisce sulle prestazioni generali ed è difficile da mantenere (gli oggetti vengono cancellati, spostati, ...).
- Non è chiaro come gestire i calcoli in base ad altri valori calcolati.
Infine, la domanda: puoi suggerire altri approcci per l'implementazione dei valori calcolati nella cache?
Anche se taggato "delphi", sono molto interessato a sapere se un particolare modello è stato sviluppato. –
Ho aggiunto il tag Delphi in modo che limiti i suggerimenti ai linguaggi staticamente digitati, non a quelli raccolti. – Tihauan