Post: [Generics] Regras de validação

Alessandro Medeiros

Fala ai Radizeiros e Radizeiras, tudo bem com vocês?

Nesse post, vamos para a segunda parte da nossa série de generics, onde você vai entender mais sobre a compatibilidade de tipos nos generics.

Vamos sair um pouco dos recursos e vamos um pouquinho para a linguagem, assim você vai entender como é feito toda essa validação, toda essa regra de tipos, o que é feito em tempo de compilação e em tempo de execução, quando estamos trabalhando com generics.

É muito importante compreender essas validações, ao estruturar seus projetos, e também para o seu crescimento a nível de conhecimento da linguagem Delphi.

Vamos lá?

Estamos um projeto simples em VCL, adicionamos um botão e vamos criar uma estrutura genérica para que possamos compreender melhor como é esse funcionamento de generics a nível de compilação, como o compilador trata isso.

É muito importante sabermos que tudo é feito por trás da linguagem, sair um pouco da casca e entrar mais afundo para que consiga entender e sanar alguns problemas, quando ele aparecer.  Uma dúvida e você já vai saber onde está a correção.

Vamos lá então?

Dentro do nosso projeto, logo depois da declaração Type, vamos criar, por exemplo, um novo tipo.

type
    TMeuGenerico = array [0..9] of string;
...

Se você observar que acabei de criar um tipo, onde quando ele for declarado ela vai estar sendo referenciado a um array de 10 posições do tipo string.

Agora dentro do botão que adicionamos dentro do nosso formulário, vamos fazer algumas pequenas implementações.

procedure TForm1.Button1Click(Sender: TObject);
var
    aux1 : TMeuGenerico;
    aux2 : TMeuGenerico;
    aux3 : array [0..9] of string;
    aux4 : array [0..9] of string;
begin

end;

No código acima foi disponibilizado 4 variáveis, se você observar 2 do tipo de TMeuGenerico, e os outros dois tipos do tipo de array.

Repare uma coisa nos códigos anteriores, onde o tipo que criamos e as variáveis, são praticamente as mesmas coisas.

Mas você pode estar se perguntando, como assim a mesma coisa?

Sim, o meu TMenuGenerico é um array de 10 posições do tipo string, as variaveis aux3 e aux4, também é um array de string de 10 posições.

procedure TForm1.Button1Click(Sender: TObject);
var
    aux1 : TMeuGenerico;
    aux2 : TMeuGenerico;
    aux3 : array [0..9] of string;
    aux4 : array [0..9] of string;
begin
   aux1 := aux2;
   aux1 := aux3;
end;

Se compilar o nosso projeto iremos nos deparar com um erro de incompatibilidade de tipo.

O erro que está ocorrendo é na linha marcada na imagem abaixo.

Esse erro de incompatibilidade de tipos é porque o Delphi trabalha exclusivamente, na hora de fazer as validações, trabalha com o nome dos tipos, não importa o que está dentro da estrutura, a estrutura pode ser idêntica, você pode ter duas classes idênticas, mas se os nomes dessas classes, as chamadas dessas classes forem diferentes, o compilador vai entender isso ai e vai mostrar um erro, dizendo que o tipo não é compatível, porém existem exceções.

Vamos conhecer essas exceções.

Vamos criar um nova classe, e iremos dar o nome a ela de TMeuArrayGenerico<T> que está recebendo um parâmetro genérico, iremos criar uma variável de array do tipo genérico.

TMeuArrayGenerico<T> = class
    FArray : array [0..9] of T;
end;

Agora iremos colocar um outro botão para trabalharmos com essa nova classe.

Vamos criar um novo tipo que irá receber essa minha nova classe, e passando para o tipo genérico uma string.

...
TMeuGenericoA = TMeuArrayGenerico<String>;
...

Agora já tenho um novo tipo que está utilizando a nossa classe que acabamos de criar.

Vamos executar nosso projetinho onde implementamos um exemplo igual ao anterior, sendo que fizemos algumas alterações, vejo o código abaixo.

procedure TForm1.Button2Click(Sender: TObject);
var
    aux1 : TMeuArrayGenerico<String>;
    aux2 : TMeuArrayGenerico<String>;
    aux3 : TMeuGenericoA;
    aux4 : TMeuGenericoA;
begin
    aux1 := aux3;
end;

Ao compilar esse projeto, teoricamente é para dar um erro para nós, pois como no exemplo anterior resultou em erro de tipo.

Compilou perfeitamente, e sem erros.

Mas pera ai! Vamos com calma para entendermos um pouco.

No nosso primeiro exemplo colocamos, colocamos duas varias com nomes dos seus tipos diferentes e o compilador acusou um erro para nós.

procedure TForm1.Button1Click(Sender: TObject);
var
   aux1 : TMeuGenerico;
   aux2 : TMeuGenerico;
   aux3 : array [0..9] of string;
   aux4 : array [0..9] of string;
begin
   aux1 := aux2;
   aux1 := aux3;
end;

Mas também coloquei no último exemplo, duas variáveis com declarações diferentes e o compilador não acusou erro.

Isso acontece porque quando trabalhamos com tipos genéricos, o compilador não faz isso em tempo de execução, ele faz isso em tempo de compilação, então por isso nós temos que setar o tipo em tempo de desenvolvimento, o compilador na hora de compilar, ele pega esse tipo, que declaramos, e faz todo o seu trabalho dentro do seu processo de compilação.

Esse tipo que ele pega é o que ele usa para fazer a compilação, isso é uma exceção nessa validação de tipos, quando trabalhamos com genéricos é usado o tipo do genérico para fazer a validação.

procedure TForm1.Button2Click(Sender: TObject);
var
    aux1 : TMeuArrayGenerico<String>;
    aux2 : TMeuArrayGenerico<String>;
    aux3 : TMeuGenericoA;
    aux4 : TMeuGenericoA;
begin
    aux1 := aux3;
end;

Como no código acima estou utilizando uma classe e o tipo do meu genérico é string, e nas outras variáveis o tipo também é um genérico do tipo string, ele faz essa validação pelo tipo setado no genérico, e não pelo nome da classe propriamente.

Então se nós viemos nesse meu TMeuGenericoA e trocar o tipo string dele para um inteiro, ele irá resultar em um erro.

...
TMeuGenericoA = TMeuArrayGenerico<Integer>;
...

Erro ao compilar.

Observe que o erro deixa bem claro que é uma incompatibilidade do tipo do TMeuGenerico String para o TMeuArrayGenerico inteiro.

Então a validação é feita internamente pelo tipo do genérico.

Agora você tem uma ciência melhor de todo esse funcionamento, da validação dos tipos.

Você pode criar um tipo utilizando generics, e reutilizar ele dentro do seu código, contanto que a informação do tipo, que a classe genérica vai receber seja idêntica.

Espero que você tenha curtido esse post, e toda semana estaremos aqui no blog postando sobre generics até esgotar tudo que podemos sobre esse tema…rsrs

Nós vamos desde os conceitos mais básicos até os conceitos que nós vimos aqui no blog, de linguagem, de compilação, com funciona, de validação de tipos, até os recursos mais avançados lá dentro de generics.

Se você deseja conhecer mais sobre generics e outros conteúdos acesse o link abaixo pois temos um clube com diversos conteúdos que irão lhe ajudar a alavancar a sua carreira.

Esse treinamento irá lhe ensinar tudo sobre Generics no Delphi, lhe guiando pelos principais conceitos e recursos disponíveis sobre essa feature fantástica do Delphi, aprenda a criar códigos maleáveis, de fácil adaptação e mudanças para ter códigos de alta performance utilizando o que o Delphi tem de melhor

CLIQUE AQUI E SAIBA MAIS SOBRE O CLUBE DOS PROGRAMADORES DELPHI

 




Faça sua busca

CATEGORIAS

POSTS RECENTES

E caso você tem interesse de conhecer mais sobre [Generics] Regras de validação, acesse o nosso portal do CLUBE DE PROGRAMADORES EM DELPHI
Você não terá só conteúdos relacionados ao [Generics] Regras de validação, mas uma quantidade enorme de conteúdos que poderá lhe ajudar muito no seu dia a dia, é uma verdadeira NETFLIX para os programadores Delphi.
Gostou?
Compartilhe:

Embarque no foguete com milhares de devs para aprender desenvolvimento, evoluir de forma contínua e se manter relevante no mercado.

Sobre
Dúvidas
Cadastre-se em nossa lista

Para ter acesso em primeira mão, a tudo que acontece na Academia do Código, basta se cadastrar em nossa lista

Grupo Thulio Bittencourt | Academia do Código

#FaçaPartedaHistória

Copyright © 2022 – Todos os direitos reservados