Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Реализация шаблона Builder в Delphi с использованием записей: избегание ненужных копирований

Delphi , Компоненты и Классы , Коллекции

 

Вопрос разработчика заключается в том, как реализовать шаблон Builder в Delphi, используя записи, с возможностью цепочки вызовов методов, аналогичной той, что используется в Kotlin, Java или Swift, но без ненужных копирований данных. Важно отметить, что записи в Delphi являются типами значений, и при возвращении Self из методов создается копия записи, что может быть неэффективно, особенно если запись содержит много полей или большие данные.

Решение с использованием указателей

Один из подходов — модификация методов так, чтобы они возвращали указатель на запись (PAlertDialogBuilder), вместо Self. Это позволяет избежать копирования, но делает цепочку вызовов менее интуитивно понятной, так как для последующих вызовов необходимо использовать дереференцирование указателя с помощью ^.

Использование директивы {$EXTENDED}

В Delphi существует директива компилятора {$EXTENDED}, которая позволяет опустить использование символа ^ при работе с указателями. Это упрощает цепочку вызовов и делает ее более похожей на обычные вызовы методов.

{$EXTENDED}
type
  PAlertDialogBuilder = ^TAlertDialogBuilder;
  TAlertDialogBuilder = record
  private
    FTitle: string;
    FMessage: string;
  public
    function SetTitle(const ATitle: string): PAlertDialogBuilder;
    function SetMessage(const AMessage: string): PAlertDialogBuilder;
    procedure CreateAndShow;
  end;

function TAlertDialogBuilder.SetTitle(const ATitle: string): PAlertDialogBuilder;
begin
  FTitle := ATitle;
  Result := @Self; // Возвращаем указатель на текущий экземпляр записи
end;

Альтернативное решение с использованием динамически выделенной памяти

Другой подход — выделение памяти для полей записи динамически и хранение указателя на эту память в записи. Это позволяет избежать копирования и обеспечивает эффективность работы с большими объемами данных.

Заключение

Использование директивы {$EXTENDED} позволяет добиться цепочки вызовов методов без необходимости в явном дереференцировании указателей, что делает код более читаемым и удобным в использовании. Этот подход сохраняет преимущества использования записей, такие как их легковесность, и одновременно решает проблему ненужных копирований.

Выбор между использованием указателей и динамически выделенной памяти зависит от конкретных требований проекта и предпочтений разработчика. Оба подхода позволяют реализовать шаблон Builder в Delphi с использованием записей, избегая при этом ненужных копирований данных.

Создано по материалам из источника по ссылке.

**Описание:** Вопрос связан с реализацией шаблона Builder в Delphi с использованием записей и цепочкой вызовов методов, учитывая, что записи в Delphi являются типами значений и при возвращении `Self` из методов создается их копия.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Коллекции ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-22 11:37:18/0.0036420822143555/0