Вольный перевод поста Functional programming style in Delphi.
Парадигма функционального программирования находит свой путь даже в Delphi — императивном языке без сборщика мусора. Рассмотрим следующий пример кода, который меняет заголовок кнопки используя расширенный RTTI (требуется версия Delphi 2010 или выше).
1 2 3 4 5 6 7 8 9 10 |
procedure TForm1.Button1Click(Sender: TObject); var Ctx: TRttiContext; P: TRttiProperty; T: TRttiType; begin T:= Ctx.GetType(TButton); P:= T.GetProperty('Caption'); P.SetValue(Button1, 'RTTI'); end; |
При анализе этого кода обратите внимание на следующее:
- Тип
TRttiContext
- запись (record); вам не нужно создавать и уничтожать переменную с типом запись в том виде как это делается для объектов. TRttiProperty
иTRttiType
- классы; Экземпляры этих классов создаются соответствующими методами классовTRttiType
иTRttiContext
, но вам не нужно уничтожать их самостоятельно — лежащая в основе них расширенная реализация RTTI заботится об этом сама.
В результате код может переписан в функциональном стиле:
1 2 3 4 |
procedure TForm1.Button1Click(Sender: TObject); begin TRttiContext.Create.GetType(TButton).GetProperty('Caption').SetValue(Button1, 'RTTI'); end; |
Все переменные стали не нужны и нет утечек памяти.