Trong một ứng dụng Delphi chúng tôi đang làm việc trên chúng tôi có một cấu trúc lớn của các đối tượng liên quan. Một số thuộc tính của các đối tượng này có các giá trị được tính toán trong thời gian chạy và tôi đang tìm cách lưu trữ kết quả cho các phép tính chuyên sâu hơn. Một cách tiếp cận mà tôi sử dụng là tiết kiệm giá trị trong một thành viên tư nhân lần đầu tiên nó được tính toán. Dưới đây là một ví dụ ngắn:Phương pháp tiếp cận để lưu vào bộ nhớ đệm các giá trị được tính
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.
Nó không phải là hiếm khi các đối tượng được sử dụng để thay đổi tính toán và giá trị lưu trữ nên được đặt lại và tính toán lại. Cho đến nay chúng tôi đã giải quyết vấn đề này bằng cách sử dụng mẫu người quan sát: các đối tượng triển khai sự kiện OnChange để người khác có thể đăng ký, nhận thông báo khi họ thay đổi và đặt lại giá trị được lưu trong bộ nhớ cache. Cách tiếp cận này hoạt động nhưng có một số nhược điểm:
- Phải mất rất nhiều bộ nhớ để quản lý đăng ký.
- Nó không mở rộng tốt khi giá trị được lưu trong bộ nhớ cache phụ thuộc vào nhiều đối tượng (ví dụ: danh sách).
- Sự phụ thuộc không phải là rất cụ thể (ngay cả khi giá trị bộ nhớ cache chỉ phụ thuộc vào một thuộc tính, nó cũng sẽ được đặt lại khi các thuộc tính khác thay đổi).
- Quản lý đăng ký tác động đến hiệu suất tổng thể và khó duy trì (đối tượng bị xóa, di chuyển, ...).
- Không rõ cách xử lý các tính toán tùy thuộc vào các giá trị được tính khác.
Và cuối cùng là câu hỏi: bạn có thể đề xuất các phương pháp tiếp cận khác để triển khai các giá trị được tính toán được lưu trong bộ nhớ cache không?
Ngay cả khi được gắn thẻ 'delphi', tôi rất quan tâm đến việc biết liệu một mẫu cụ thể có được phát triển hay không. –
Tôi đã thêm thẻ Delphi để nó giới hạn các đề xuất thành các ngôn ngữ được đánh máy tĩnh, không phải rác. – Tihauan