Propriedade (Property)

Nesta seção estudamos a definição, sintaxe, regras e serialização de propriedades (Property)

O que é uma Property

property é um açúcar sintático do Pascal. Externamente se comporta como um campo, mas internamente invoca na verdade um getter para leitura / setter para gravação. Serve para encapsular campos privados, unificar lógica de leitura/gravação e adicionar efeitos colaterais.

  1. Propriedade de leitura e gravação controlável: lógica extra é executada automaticamente na atribuição ou leitura de valores (redesenho de interface, sincronização de componentes, validação de números) ;
  2. Propriedade somente leitura: apenas legível por fora, atribuição direta proibida; dados são alterados internamente por procedimentos específicos.
program Demo;
{$ifdef FPC} {$mode objfpc}{$H+}{$J-} {$endif}
{$ifdef MSWINDOWS} {$apptype CONSOLE} {$endif}
uses
  SysUtils;

type
  TWebPage = class
  private
    FURL: string;
    FColorRGB: Integer;
    procedure SetColorRGB(const Value: Integer);
  public
    property URL: string read FURL;
    property ColorRGB: Integer read FColorRGB write SetColorRGB;

    procedure Load(const AnURL: string);
    procedure PrintStatus;
  end;

procedure TWebPage.Load(const AnURL: string);
begin
  FURL := AnURL;
  Writeln('Load page: ', AnURL);
end;

procedure TWebPage.SetColorRGB(const Value: Integer);
begin
  if FColorRGB <> Value then
  begin
    FColorRGB := Value;
    Writeln('Color updated, value = ', Value);
    Writeln('Sync component color to ', Value);
  end;
end;

procedure TWebPage.PrintStatus;
begin
  Writeln('==== Page Info ====');
  Writeln('URL(read-only): ', URL);
  Writeln('ColorRGB(rw): ', ColorRGB);
  Writeln('==================');
  Writeln;
end;

var
  Page: TWebPage;
begin
  Page := TWebPage.Create;
  try
    Page.Load('https://www.foxdevelop.com/');
    Page.ColorRGB := 255;
    Page.PrintStatus;

    Page.ColorRGB := 255;
    Page.PrintStatus;

    Page.ColorRGB := 65535;
    Page.PrintStatus;

    // Page.URL := 'test'; // Erro de compilação, URL é somente leitura
  finally
    Page.Free;
  end;
  Readln;
end.Code language: HTML, XML (xml)

Dentro da classe TWebPage a propriedade URL é apenas leitura; para modificá-la é necessário usar o procedimento Load.

A propriedade FColorRGB aceita leitura, gravação e alteração dependem do procedimento SetColorRGB.

Além disso PrintStatus é um procedimento comum para exibir as informações internas de TWebPage.

Resultado da execução

Load page: https://www.foxdevelop.com/
Color updated, value = 255
Sync component color to 255
==== Page Info ====
URL(read-only): https://www.foxdevelop.com/
ColorRGB(rw): 255
==================

==== Page Info ====
URL(read-only): https://www.foxdevelop.com/
ColorRGB(rw): 255
==================

Color updated, value = 65535
Sync component color to 65535
==== Page Info ====
URL(read-only): https://www.foxdevelop.com/
ColorRGB(rw): 65535
==================Code language: JavaScript (javascript)

2. Regras de declaração dos três elementos da propriedade

Ao declarar uma propriedade é obrigatório definir a forma de leitura; a forma de gravação é opcional:

read fonte de leitura: escolher uma entre duas opções

  • Ligação direta a um campo privado (mais rápido, sem custo extra de função)
  • Função getter sem parâmetros, cujo tipo de retorno corresponde exatamente ao tipo da propriedade

write fonte de gravação (opcional; omitido = somente leitura): escolher uma entre duas opções

  • Ligação direta a um campo privado
  • Função setter com um único parâmetro, tipo do parâmetro idêntico ao da propriedade

Modificadores extras apenas para serialização: default, stored

O compilador impõe verificação rígida de correspondência de tipos:

  • Propriedade Integer: getter deve retornar Integer sem parâmetros / read ligado a campo privado Integer
  • Propriedade String: setter deve receber parâmetro const string

Propriedades Published e serialização

1. O que é serialização

Gravar todos os dados de um objeto em um fluxo (arquivo/memória/JSON) para reconstruir o objeto a partir desse fluxo depois ;

Arquivos de formulário Lazarus .lfm e Delphi .dfm dependem totalmente desse mecanismo interno.

  • Pré-requisito essencial: propriedades devem estar na seção published para que as informações de tipo em tempo de execução RTTI as reconheçam
  • Unidades utilitárias associadas:
  • LResources: leitura e gravação de arquivos lfm de formulários
  • FpJsonRtti / CastleComponentSerialize: serialização JSON de objetos

2. Modificadores exclusivos para serialização

default <constante>: marca o valor padrão da propriedade

  • Apenas para avaliação da ferramenta de serialização: se o valor da propriedade for igual ao default após criação do objeto, omitimos seu armazenamento para reduzir o tamanho do arquivo
  • Sem inicialização automática: o construtor deve atribuir manualmente o valor correspondente ao default no campo

stored <booleano/método>: controla se a propriedade é salva na serialização

  • stored True: valor padrão, grava a propriedade no arquivo durante serialização
  • stored False: nunca salva essa propriedade
  • stored IsNeedSave: chama um método booleano para decidir dinamicamente se deve armazenar

Exemplo de serialização

type
  TWebPage = class
  private
    FColor: TColor;
    function SetColor(const Value: TColor): TColor;
  published
    // default clBlack significa preto padrão; construtor precisa definir manualmente FColor := clBlack
    property Color: TColor read FColor write SetColor default clBlack;
    // stored False não salva em lfm/json
    property TempCache: string read FTemp write FTemp stored False;
  end;

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *