Дополнительная заметка на
Минусы: Производительность
Я думаю, что многие люди слишком беспечно игнорируют снижение производительности интерфейсов. (Не то чтобы я не люблю и не использую интерфейсы, но вы должны знать, во что вы ввязываетесь). Интерфейсы могут быть дорогими не только из-за попадания _AddRef / _Release (даже если вы просто возвращаете -1), но и из-за того, что свойства ОБЯЗАНЫ иметь метод Get. По моему опыту, большинство свойств в классе имеют прямой доступ для средства чтения (например, свойство Prop1: целочисленное чтение FProp1, запись SetProp1). Если изменить это прямое, то отсутствие штрафного доступа к вызову функции может существенно повлиять на вашу скорость (особенно если вы начинаете добавлять 10 циклов вызовов свойств внутри цикла.
Например, простой цикл с использованием класса
for i := 0 to 99 do
begin
j := (MyClass.Prop1 + MyClass.Prop2 + MyClass.Prop3) / MyClass.Prop4;
MyClass.Update;
// do something with j
end;
переходит от 0 вызовов функций к 400 вызовам функций, когда класс становится интерфейсом. Добавьте больше свойств в этот цикл, и оно быстро ухудшится.
Штраф _AddRef / _Release, который вы можете улучшить с помощью нескольких советов (я уверен, что есть и другие советы. Это не в моей голове):
- Используйте WITH или назначайте временную переменную, чтобы понести штраф только в один _AddRef / _Release за блок кода
- Всегда передавайте интерфейсы, используя ключевое слово const , в функцию (в противном случае вы получаете дополнительный _AddRef / _Release при каждом вызове этой функции.