logotipo Blog Giovani Da Cruz
Delphi

Como Utilizar Atributos (Attributes) em Delphi: Um Guia Completo

6 min de leitura 109 visualizações
Delphi Attributes Validator
Em Delphi, os atributos permitem associar metadados aos elementos do código-fonte

 

Atributos (ou Attributes) são um recurso poderoso que permite adicionar metadados a classes, propriedades, métodos e campos em Delphi. Eles são usados para decorar ou anotar elementos do código com informações extras que podem ser acessadas em tempo de execução através do RTTI.

Neste post, vamos explorar como criar atributos personalizados, como aplicá-los em propriedades e como utilizar RTTI para validar e manipular esses atributos em tempo de execução.

 

O que são Atributos em Delphi?

Em Delphi, os atributos permitem associar metadados aos elementos do código-fonte, como classes e propriedades. Eles são utilizados para fornecer informações adicionais que podem ser acessadas em tempo de execução por meio do RTTI.

Por exemplo, você pode usar atributos para:

  • Validar entradas de dados.
  • Realizar mapeamento entre objetos e banco de dados.
  • Implementar controle de acesso.
  • Adicionar informações de configuração ou comportamento a propriedades ou métodos.

 

Criando Atributos Personalizados

Em Delphi, você pode criar seus próprios atributos ao herdar da classe TCustomAttribute. Vamos criar um exemplo de atributo que pode ser utilizado para validar se um campo de texto está preenchido.

 

Exemplo de Atributo de Validação

type
  // Atributo de validação personalizada
  ValidacaoAttribute = class(TCustomAttribute)
  private
    FMensagem: string;
  public
    constructor Create(const Mensagem: string);
    property Mensagem: string read FMensagem;
  end;

constructor ValidacaoAttribute.Create(const Mensagem: string);
begin
  FMensagem := Mensagem;
end;

Neste exemplo, criamos a classe ValidacaoAttribute que herda de TCustomAttribute e possui uma propriedade Mensagem, que armazena a mensagem de erro que será exibida quando a validação falhar. Você pode criar units específicas para salvar estas validações.

 

Aplicando o Atributo nas Propriedades

Agora que temos nosso atributo de validação, podemos aplicá-lo em uma propriedade da classe. Vamos aplicar esse atributo à propriedade Nome de uma classe TMinhaClasse.

Exemplo de Aplicação do Atributo

type
  TMinhaClasse = class
  private
    FNome: string;
  public
    // Aplicando o atributo de validação
    [Validacao('O campo Nome é obrigatório.')]
    property Nome: string read FNome write FNome;
  end;

Aqui, estamos utilizando o atributo Validacao para marcar a propriedade Nome como obrigatória. Se o nome não for preenchido corretamente, o atributo irá fornecer a mensagem “O campo Nome é obrigatório.”

 

Lendo os Atributos em Tempo de Execução (RTTI)

Agora que aplicamos o atributo à propriedade, precisamos de uma forma de acessar esse atributo em tempo de execução e realizar a validação. Para isso, utilizamos RTTI (Run-Time Type Information).

Exemplo de Validação Usando RTTI

uses
  RTTI, SysUtils;

procedure ValidarPropriedades(Objeto: TObject);
var
  Contexto: TRttiContext;
  TipoRtti: TRttiType;
  Propriedade: TRttiProperty;
  Atributo: TCustomAttribute;
begin
  Contexto := TRttiContext.Create;
  try
    TipoRtti := Contexto.GetType(Objeto.ClassType);

    // Itera sobre as propriedades da classe
    for Propriedade in TipoRtti.GetProperties do
    begin
      // Verifica se a propriedade tem o atributo de validação
      for Atributo in Propriedade.GetAttributes do
      begin
        if Atributo is ValidacaoAttribute then
        begin
          // Se o valor da propriedade estiver vazio, lança uma exceção com a mensagem do atributo
          if Propriedade.GetValue(Objeto).ToString = '' then
            raise Exception.Create(ValidacaoAttribute(Atributo).Mensagem);
        end;
      end;
    end;
  finally
    Contexto.Free;
  end;
end;

Neste exemplo, a função ValidarPropriedades recebe um objeto e percorre suas propriedades usando o RTTI. Se uma propriedade estiver decorada com o atributo Validacao, a função verifica se o valor dessa propriedade está vazio e lança uma exceção com a mensagem de validação caso necessário.

 

Exemplo Completo de Uso

Agora, vamos ver um exemplo completo de uso, onde a propriedade Nome é validada antes de ser salva.

var
  Obj: TMinhaClasse;
begin
  Obj := TMinhaClasse.Create;
  try
    Obj.Nome := ''; // Propriedade sem valor

    try
      ValidarPropriedades(Obj); // Chama a validação
    except
      on E: Exception do
        Writeln(E.Message); // Exibe a mensagem de erro: "O campo Nome é obrigatório."
    end;
  finally
    Obj.Free;
  end;
end;

Neste exemplo, estamos criando uma instância de TMinhaClasse, deixando a propriedade Nome vazia e chamando a função ValidarPropriedades. Como a propriedade Nome não foi preenchida, a exceção será disparada com a mensagem “O campo Nome é obrigatório.”

 

Para facilitar, criei um repositório com este exemplo no GitHub:

https://github.com/giovani7cruz/Delphi-Attributes-Validator/

 

Benefícios dos Atributos em Delphi

O uso de atributos em Delphi traz uma série de vantagens:

  • Encapsulamento de lógica: A lógica de validação ou configuração fica separada do código principal, tornando-o mais limpo e modular.
  • Reusabilidade: Atributos podem ser reutilizados em várias classes e propriedades.
  • Facilidade de manutenção: Alterações na lógica de validação ou comportamento podem ser feitas diretamente no atributo, sem precisar modificar cada instância onde ele é utilizado.
  • Integração com frameworks: É possível criar frameworks que interpretam atributos, como no caso de ORMs, validação de dados, etc.

 

Conclusão

O uso de atributos em Delphi é uma poderosa ferramenta para criar código mais limpo, organizado e flexível. A combinação de atributos personalizados com RTTI permite uma série de aplicações práticas, desde validação de dados até mapeamento de objetos para banco de dados.

Com o exemplo mostrado neste post, você já pode começar a usar atributos para melhorar a estrutura do seu código e aplicar regras de negócios de forma mais elegante e reutilizável.

 

 

💬 Gostou do conteúdo?

Ficou com dúvidas ou tem algo a acrescentar?

Adoramos ouvir você! 💡

Compartilhe suas ideias ou experiências nos comentários abaixo.

Vamos aprender juntos! 🚀✨

 

 

💻 Compartilhe o post com outras pessoas se ele te ajudou! 😊

 

 

 

📚 Obrigado por acompanhar até aqui! Explore outros posts relacionados no blog e continue evoluindo suas habilidades. Tem mais conteúdos sobre diversos assuntos te esperando! 👩‍💻 🔍✨

Até o próximo post. Valeu! 👋📖

 

 

 

#Delphi #Programação #RTTI #Atributos #Desenvolvimento

#Coding #TechTips #DevLife #SoftwareDevelopment #Validacao

#GiovaniDaCruz

 

 

Deixe um comentário

Seu e-mail não será publicado.