Post: Introduzindo Variáveis ​​Inline na Linguagem Delphi

Alessandro Medeiros

Este artigo foi traduzido do artigo http://blog.marcocantu.com/blog/2018-october-inline-variables-delphi.html

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

A próxima versão 10.3 do Delphi apresenta um recurso muito útil para a linguagem, variáveis ​​inline locais com escopo local e inferência de tipos.

A linguagem Delphi em 10.3 tem uma mudança bastante central na maneira como permite muito mais flexibilidade na declaração de variáveis ​​locais, seu escopo e tempo de vida. Esta é uma mudança que quebra um princípio fundamental da linguagem Pascal original, mas oferece um número significativo de vantagens, reduzindo o código desnecessário em vários casos.

Estilo antigo do bloco var.

Desde o Turbo Pascal 1 e até agora, seguindo as regras clássicas da linguagem Pascal, todas as declarações de variáveis ​​locais tinham que ser feitas em um bloco var escrito antes do início dos métodos:


procedure Teste;
var
    I: integer;
begin
    I:= 22;
    ShowMessage(I.ToString);
end;

Declarações variáveis Inline

A nova sintaxe de declaração de variável inline permite que você declare a variável diretamente em um bloco de código (permitindo também vários símbolos como de costume):


procedure Test;
begin
    var I, J: Integer;
    I := 22;
    j := I + 20;
    ShowMessage (J.ToString);
end;

Embora isso possa parecer uma diferença limitada, há vários efeitos colaterais dessa alteração. São esses efeitos adicionais que tornam o recurso valioso.

Inicializando Variáveis ​​Inline

Uma mudança significativa em comparação com o modelo antigo é que a declaração e inicialização inline de uma variável podem ser feitas em uma única instrução. Isso torna as coisas mais legíveis e mais suaves em comparação com a inicialização de várias variáveis ​​no início de uma função.


procedure Test;
begin
    var I: Integer := 22;
    ShowMessage (I.ToString);
end;

Mais ainda, se o valor de uma variável estiver disponível apenas mais tarde no bloco de código, em vez de definir um valor inicial (como 0 ou nil) e posteriormente atribuir o valor real, você pode atrasar a declaração de variável ao ponto em que você pode calcular bom valor inicial:


procedure Test1;
begin
    var I: Integer := 22;
    var J: Integer := 22 + I;
    var K: Integer := I + J;
    ShowMessage (K.ToString);
end;

Em outras palavras, enquanto no passado todas as variáveis ​​locais eram visíveis em todo o bloco de código, agora uma variável inline é visível apenas da posição de sua declaração e até o final do bloco de código.

Escopo e tempo de vida de variáveis ​​inline declaradas em blocos aninhados

A limitação de escopo também é mais relevante, pois não se aplica a todo o método, mas somente ao bloco de código de begin-end a variável inline é exibida. Em outras palavras, o escopo de uma variável inline é limitado ao bloco de declaração e a variável não pode ser usada fora do bloco. Não apenas, mas a vida útil variável também é limitada ao bloco. Um tipo de dados gerenciado (como uma interface, uma string ou um registro gerenciado) será descartado no final do sub-bloco, em vez de invariavelmente no final do procedimento ou método.



procedure Test2;
begin
    var I: Integer := 22;
    if I > 10 then
    begin
        var J: Integer := 3;
        ShowMessage (J.ToString);
    end
    else
    begin
        var K: Integer := 3;
        ShowMessage (J.ToString);// COMPILER ERROR: "Identificador não declarado: J"
    end;
   // J e K não acessíveis aqui no
end;

Como você pode ver no último snippet de código acima, uma variável declarada dentro de um bloco begin-end é visível apenas no bloco específico, e não depois que o bloco foi finalizado. No final das instruções if, J e K não serão mais visíveis.
Como mencionei, o efeito não se limita apenas à visibilidade. Uma variável gerenciada, como uma referência de interface ou um registro, será limpa adequadamente no final do bloco, em vez de no final do procedimento ou método:


procedure Test99;
begin
    if (something) then
    begin
        var Intf: IInterface = GetInterface;
        var MRec: TManagedRecord = GetMRecValue;
        UseIntf(Intf);
        UseMRec(MRec);
    end;
end;

Inferência de tipo para variáveis ​​inline

Outro grande benefício de variáveis ​​inline é que o compilador agora pode, em várias circunstâncias, inferir o tipo de uma variável inline observando o tipo da expressão ou valor atribuído a ela:


procedure Test;
begin
    var I := 22;
    ShowMessage (I.ToString);
end;

O tipo da expressão de r-valor (isto é, o que vem depois de :=) é analisado para determinar o tipo da variável. Alguns dos tipos de dados são “expandidos” para um tipo maior, como no caso acima, onde o valor numérico 22 (um ShortInt ) é expandido para Integer . Como regra geral, se o tipo de expressão à direita for um tipo integral e menor que 32 bits, a variável será declarada como um inteiro de 32 bits. Você pode usar um tipo explícito se quiser um tipo numérico específico e menor.

Agora, embora esse recurso possa economizar alguns toques no teclado para um Integer ou uma string, a inferência de tipos de variáveis ​​se torna bastante interessante no caso de tipos complexos, como instâncias de tipos genéricos. No trecho de código abaixo, os tipos inferidos são TDictionary  para a variável MyDictionary e TPair  para a variável apair.


procedure NewTest;
begin
    var MyDictionary := TDictionary (string, Integer).Create
    MyDictionary.Add ('one', 1);
    var APair := MyDictionary.ExtractPair('one');
    ShowMessage (APair.Value.ToString)
end;

Constantes Inline

Além das variáveis, agora você também pode inserir uma declaração de valor constante. Isso pode ser aplicado a constantes de tipos ou constantes não tipadas, caso em que o tipo é inferido (um recurso que está disponível para constantes há muito tempo). Um exemplo simples está abaixo:


const M: Integer = (L + H) div 2;
const M = (L + H) div 2;

Loops for para declaração de variável de loop in-line

Outra circunstância específica na qual você pode tirar proveito das declarações de variáveis ​​inline é com as instruções loop for, incluindo os loops for-to clássicos e os loops for-in modernos:


for var I: Integer := 1 to 10 do ...
for var Item: TItemType in Collection do...

Você pode simplificar ainda mais o código aproveitando a inferência de tipos:


for var I := 1 to 10 do ...
for var Item in Collection do ...

Este é um caso em que ter a variável inline com escopo limitado é particularmente benéfico, como no exemplo de código abaixo:

Usar a  variável I fora do loop causará um erro do compilador (enquanto era apenas um aviso na maioria dos casos no passado):


procedure ForTest;
begin
var total := 0;
for var I: Integer := 1 to 10 do
Inc (Total, I);
ShowMessage (total.ToString);
ShowMessage (I.ToString);
end;

Resumo Inline

Declarações de variáveis ​​inline, com inferência de tipos e escopo local, trazem ar fresco para a linguagem Delphi. Embora a legibilidade do código-fonte do Pascal continue sendo um princípio fundamental a ser preservado, é importante modernizar a linguagem no nível principal, removendo um pouco da ferrugem (real ou percebida). No caso de variáveis ​​inline, há muitas vantagens de sair do estilo tradicional de codificação, que o valor é claro.

Ainda assim, você pode manter seu código como está e pedir a seus colegas desenvolvedores que sigam a declaração tradicional: nada no código ou estilo existente está errado, mas as declarações inline oferecem uma nova oportunidade. Eu já tenho problemas para voltar para versões mais antigas do Delphi … apenas dizendo.

 

No nosso treinamento POO Avançado e Programação Funcional você aprenderá não só a gerenciar memórias, irá aprender de forma prática, técnicas que irão te ajudar a ter um código bem estruturado, organizado e preparado para as mudanças repentinas, afinal sabemos que a todo o momento seja por força do governo ou por solicitações de clientes, precisamos realizar alterações em nossos projetos, então porque não ter um código já preparado para essas mudanças? No treinamento, eu desenvolvi um método que alinha exemplos reais de aplicação das técnicas para resolver problemas do dia a dia, Como:

* Reutilização de código

* Fácil adaptação a novas tecnologias / componentes

* Fácil implementação de novas features

* Até 70% de redução no tempo de manutenção do código

* Redução de Bugs na entrega de novas implementações

SAIBA MAIS SOBRE O CURSO POO  AVANÇADO E PROGRAMAÇÃO FUNCIONAL CLICANDO AQUI

 

 

Faça sua busca

CATEGORIAS

POSTS RECENTES

E caso você tem interesse de conhecer mais sobre Introduzindo Variáveis ​​Inline na Linguagem Delphi, acesse o nosso portal do CLUBE DE PROGRAMADORES EM DELPHI
Você não terá só conteúdos relacionados ao Introduzindo Variáveis ​​Inline na Linguagem Delphi, 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