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