Post: [Recursos do Delphi] Conhecendo as Records Variants

Alessandro Medeiros

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

Muito legal essa nossa série de recursos avançados no Delphi não é?

Eu tenho curtido cada post que tenho escrito com todo carinho para vocês.

E claro, podendo levar para vocês diversos conteúdos semanalmente.

Você já ouviu falar, ou já utilizou Records Variants?

Se não, vem que irei lhe mostrar como podemos trabalhar com elas, e claro, a praticidade e simplicidade da utilização.

Então vamos lá?

Eu tenho aqui o meu exemplo, com já é de costume…rsrs

Temos um exemplo aqui bem simples, e o que são essas Records Variants e qual é o objetivo delas?

Antes de explicar a fundo sobre elas, vale a pena saber que são recursos disponíveis na linguagem.

Antigamente nós tínhamos dois problemas muito grande que era armazenamento e processamento.

E antigamente tínhamos pouquíssimos recursos de memórias, e gerenciar memória da forma mais produtiva possível era um diferencial para a linguagem.

As Records Variantes estão aí para isso, só para contextualizar vocês nisso.

Então vamos ver o que é Records Variants.

TForma = record
    Nome : String;
    case isQuadrado : Booleana of
        True : (X1, Y1, X2, Y2 : Integer);
        False : (X, Y : Integer);
end;

Observe que temos um record no código acima chamado TForma, e o que tenho nesse meu record, é o seguinte, o Nome que é uma string, e tenho um case of dentro do record.

Dentro da estrutura do record colocamos um case, onde verifico se o isQuadrado é verdadeiro ou falso.

Se minha forma for verdadeira, eu irei ter os parâmetros X1, X2, Y1, Y2,  ou seja, os quatros cantos do quadrado, e se não for, irei ter apenas os valores X e Y.

Já podemos perceber que essa minha record é uma variante, ou seja, uma record mutável.

Então se a forma for um quadrado, eu irei acessar X1,X2, Y2, Y2, e se eu tentar acessar X, o que irá acontecer?

Dá Erro? Não da erro.

Se eu tentar acessar Y mesmo ela sendo um quadrado da erro?

Também não dá erro.

Então para que serve esse esse case aí nos records?

Para contextualizar, isso está ligado ao gerenciamento de memória.

O que acontece, quando você coloca uma estrutura condicional dentro do record, o compilador interpreta o seguinte, se for um quadrado, vai ter X1, Y1, X2, Y2, porem X e Y, que seriam as opções de não ser um quadrado, elas ocupam o mesmo lugar na memória de X1 e Y1.

Antigamente o gerenciamento de memória era vital, quando tínhamos, por exemplo,  em um PC XT com 640KB de ram.

Mas hoje em dia, uma máquina  simples já possui uns 6GB de ram, e isso não é perceptível, quando programamos de qualquer forma, pois temos memória ram de sobra.

Mas em máquinas antigas isso era primordial.

Deixa só uns vazamentos de memórias para ver o que acontece, ou não gerencie da melhor forma para ver o que aconteceria.

O que acontece é um aproveitamento, vamos dizer assim, de espaço na memória.

Quando colocamos esse case dentro do record, tanto o X1, quando o X, seja ele verdadeiro ou falso, estão ocupando o mesmo endereço de memória.

Um exemplo que temos, na documentação do Delphi.

Temos uma classe TFuncionario que é um record, onde temos as propriedades Nome, que é uma string, e vamos dizer que o funcionário irá ter dois tipos de salário, onde tem funcionários que são remunerados por hora,  ou remunerado mensalmente.

TFuncionario = record
    Nome: String;
    SalarioHora : Currency;
    SalarioMensal : Currency;
end;

Percebe que ao fazer esse procedimento estamos alocando dois espaços de memória, um para salário por hora, e um para salário por mês.

Mas porem um funcionário nunca vai ter os dois tipos de salário ao mesmo tempo.

Esse funcionário, ou recebe por hora, ou por mês.

Então para aproveitar a memória, colocamos um case.

TFuncionario = record
    Nome: String;
    case Contrato : Boolean of
        True : (SalarioMensal : Currency);
        False : (SalarioHora : Currency);
end;

Verificamos se o funcionário é contratado ele tem o salarioMensal, se não for, SalarioHora.

Como essa condição nunca aconteceria, as duas ao mesmo tempo, acabamos aproveitando esse espaço de memória, onde em um único lugar da memória, estará salvo, seja o salário por hora, ou salário mensal.

Usamos a opção de contrato para recuperar o que quiser.

Um exemplo claro disso, é a implementação que fizemos no evento de click do botão Record 1.

procedure TForm1.ButtonClick(Sender : TObject);
begin
    Quadrado.Nome := 'Meu Quadrado';
    Quadrado.isQuadrado := True;
    Quadrado.X1 := 10;
    Quadrado.X2 := 20;
    Quadrado.Y1 := 30;
    Quadrado.Y2 := 40;
end;

Nesse exemplo eu passo um nome para o quadrado, e digo que é um quadrado, e passo as informações do quadrado.

E no botão X, eu estou recuperando o valor de X, e no botão X1, eu recupero o valor do X1.

Observe que tanto o X quando X1 tem o mesmo valor, porque os dois estão no mesmo lugar da memória, ou seja, estamos otimizando o consumo de memória, para que o nosso software não aloque recursos da memória desnecessariamente. 

Esse é o conceito das Records Variante.

Você pode criar atributos condicionais para ter diversos campos alocados no mesmo lugar da memória, porém, como esses campos são únicos, individuais, ou seja, depende, da condicional que estiver tratando.

Como na classe de funcionários, ou ele é contratado ou não, ele não tem como ser os dois, então você utilizar de um mesmo campo para buscar essa informação e utilizá do atributo condicional booleano para saber que tipo de salario ele irá receber.

Muito legal não é pessoal?

É muito simples, e fácil, mas é uma funcionalidade que fica aqui para seu conhecimento.

Como já falei, nem tudo que vemos, iremos colocar em produção em nossos softwares, mas é um conhecimento que irá contribuir para você na sua caminha na programação.

Esse é mais post que foi retirado do CLUBE DOS PROGRAMADORES EM DELPHI, onde você encontra diversos conteúdos para colaborar com seu conhecimento, e claro, ajudar no seu dia a dia como programador.

E caso você tenha interesse de conhecer mais sobre generics acessa o nosso portal do CLUBE DE PROGRAMADORES EM DELPHI, onde você não só terá conteúdos relacionados aos generics, mas uma quantidade enorme de conteúdos que poderá lhe ajudar muito no seu dia a dia, é uma verdadeira NETFLIX para os programadores Delphi.

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 [Recursos do Delphi] Conhecendo as Records Variants, acesse o nosso portal do CLUBE DE PROGRAMADORES EM DELPHI
Você não terá só conteúdos relacionados ao [Recursos do Delphi] Conhecendo as Records Variants, 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.

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 © 2024 – Todos os direitos reservados