私たちが取り組んでいる Delphi アプリケーションには、関連するオブジェクトの大きな構造があります。これらのオブジェクトのプロパティの一部には、実行時に計算される値があり、より集中的な計算のために結果をキャッシュする方法を探しています。私が使用するアプローチは、最初に計算されたときにプライベートメンバーに値を保存することです。以下に短い例を示します。
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.
計算に使用されるオブジェクトが変更され、キャッシュされた値をリセットして再計算する必要があることは珍しくありません。これまでのところ、オブザーバー パターンを使用してこの問題に対処しました。オブジェクトは OnChange イベントを実装して、他のユーザーがサブスクライブし、変更時に通知を受け、キャッシュされた値をリセットできるようにします。このアプローチは機能しますが、いくつかの欠点があります。
- サブスクリプションを管理するには大量のメモリが必要です。
- キャッシュされた値が多くのオブジェクト (リストなど) に依存している場合、うまくスケーリングされません。
- 依存関係はあまり明確ではありません (キャッシュ値が 1 つのプロパティのみに依存している場合でも、他のプロパティが変更されるとリセットされます)。
- サブスクリプションの管理は、全体的なパフォーマンスに影響を与え、維持するのが困難です (オブジェクトが削除、移動されるなど)。
- 他の計算値に依存する計算をどのように処理するかが明確ではありません。
最後に質問です。キャッシュされた計算値を実装するための他のアプローチを提案できますか?