Class/Record Helpers

Olá galera. Meu Nome é Alan Victor Bariani, e serei o mais novo colaborador do blog do Rodrigo Mourão. Nos meus posts falarei, na maioria das vezes, sobre programação Win32(64) com VCL. O bom e velho Delphi, sem frescura, sem modinha, sem viadagem: Delphi Bruto! Então, se quiserem, podem me chamar de “O Bruto do Delphi”.

Hoje vamos falar de uma coisa que é relativamente nova no Delphi, algumas pessoas ainda não conhecem, mas é do caralho: Class Helpers. Na verdade, além dos Class Helpers, existem também os Record Helpers. Eles foram introduzidos no Delphi 2009, se não me engano. Foi naquela bagunça com o .NET. Pelo menos isso ele trouxe de bom para o delphi. Mas você deve estar se perguntando: “Bruto, afinal, o que é isso?”. São classes ou registros criados para “ajudar” outras classes ou registros. Vamos usar um exemplo simples. Consideremos a classe a seguir:

TCliente = class
private
  fNome,fSobrenome: String
public
  property Nome: String read fNome write fNome
  property Sobrenome: string read fSobrenome write fSobrenome;
end;

Agora vamos supor que mudou algum requisito ou necessidade do cliente, no meio do desenvolvimento (e sim, não importa que metodologia você use, se tiver um cliente sequer no meio, isso vai acontecer) e agora você vai ter que apresentar o nome completo ao invés do primeiro nome, em vários lugares. Sempre que você precisar, vamos ter que digitar:

cli.Nome+' '+cli.Sobrenome;

Vai chegar uma hora que vai encher o saco ficar digitando isso o tempo todo. E então, o que fazer? Vamos criar uma classe de ajuda para sua classe:

Interface
type
 TClienteAjuda = Class helper for TCliente
 private
  function getNomeCompleto: string;
 public
  property NomeCompleto: string read getNomeCompleto;
 end;
Implementation

function TClienteAjuda.getNomeCompleto: string;
begin
  Result := Self.Nome+' '+Self.Sobrenome;
end;

Então, sempre que você precisar, vai poder usar:

cli.NomeCompleto;

OK, você pode pensar: “Tá, lindo… mas até agora inútil… eu poderia muito bem ter alterado a classe TCliente.” Isso mesmo…. Você está absolutamente certo. Na verdade, essa é até a recomendação oficial da Embarcadero. Tendo acesso ao fonte original da classe, não se deve criar class helpers. Mas, e se você não tiver acesso ao código fonte da classe TCliente para altera-lo? Muitos vão responder: “Ué fácil… crio uma classe filha da classe TCliente, e problema resolvido.” Bem, o caminho não é bem por aí. Porque, segundo os puristas de OO, essa prática não está correta, pois não se deve criar um filho por causa disso, e que fere o princípio de bla bla bla… pura viadagem, mas que vai ter alguém pra falar, ahn vai.

Mas vamos ao motivo real, que importa para nós, programadores de verdade: Praticidade ! Pense que você já tem essa classe TCliente espalhada pelo seu código todo. Vai ter que alterar o tipo de variável de TCliente pra TClienteFilho e/ou os creates. Com a classe de ajuda você permanece com seu código intocado, só usando a nova funcionalidade, sendo necessário apenas incluir a unit onde está a sua classe de ajuda no uses. Mas a maravilha não para por ai. É possível usar class e record helpers (a partir do XE3) para expandir tipos nativos (string, integer, boolean) e adicionar funcionalidades a componentes de terceiros sem fontes, ou que a alteração dos fontes possa ser trabalhosa ou perigosa.

Nos próximos posts, vou apresentar as classes de ajuda que já vem com o Delphi, dar algumas dicas de uso delas, e presenteá-los com algumas classes de ajuda que eu criei e me ajudam muito no dia a dia.

E aí? Curtiu o artigo? Então deixe seu comentário!

This site uses Akismet to reduce spam. Learn how your comment data is processed.