Патрик и Ответы Аллена абсолютно правильны.
Однако, поскольку ваш вопрос говорит об улучшенном дизайне ОО, я чувствую определенное изменение в вашем дизайне, котороетакже улучшит производительность, уместно обсудить.
Ваш код для установки тега "очень контролирующий".Под этим я подразумеваю то, что вы тратите много времени, "ковыряясь в другом объекте" (через интерфейс), чтобы вычислить значение вашего тега.Именно это и выявило «проблему производительности с интерфейсами».
Да, вы можете просто привязать интерфейс один раз к локальной переменной и получить значительное улучшение производительности, но вы все равно будете копаться внутридругой объект.Одной из важных целей в ОО-дизайне является , а не поиск того, где вы не принадлежите.Это на самом деле нарушает Закон Деметры .
Рассмотрим следующее изменение, которое позволяет интерфейсу выполнять больше работы.
IMyInterface = interface
['{C0070757-2376-4A5B-AA4D-CA7EB058501A}']
function GetArray: TArrayOfRecord;
function GetTagValue: Integer; //<-- Add and implement this
property Arr: TArrayOfRecord read GetArray;
end;
function TMyObject.GetTagValue: Integer;
var
I: Integer;
begin
for i := 0 to High(FArr) do
if (FArr[i].Val1 < FArr[i].Val2) or
(FArr[i].Val3 < FArr[i].Val4) then
begin
Result := FArr[i].Val1 + FArr[i].Val2 -
FArr[i].Val3 + FArr[i].Val4;
end;
end;
Затем внутри TForm3.FormCreate
, //Подход 3 становится следующим:
Tag := MyInterface.GetTagValue;
Это будет так же быстро, как и предложение Аллена, и будет лучшим дизайном.
Да, я полностью осознаю, что вы просто взяли быстрый примерпроиллюстрируйте производительность при многократном поиске чего-либо через интерфейс.Но дело в том, что если у вас код работает неоптимально из-за чрезмерного доступа через интерфейсы - тогда у вас есть запах кода, который предлагает вам подумать о переносе ответственности за определенную работу в другой класс.В вашем примере TForm3
было крайне неуместно, учитывая, что все , необходимое для расчета, принадлежало TMyObject
.