O que é mais enfadonho do que escrever código de limpeza repetitivo em todos os pontos de saída possíveis de um método complexo?
Quer esteja a gerir o encerramento de documentos, a reiniciar sinalizadores entre processos ou a libertar recursos, garantir que as suas tarefas de manutenção sejam executadas na perfeição — independentemente de como ou onde a sua função termine — sempre exigiu um planeamento estrutural cuidadoso. Se um método for abortado inesperadamente ou chegar a um Return antecipado, esquecer uma única linha de limpeza pode levar a fugas de memória ou recursos bloqueados.
A partir do 4D 21 R4, essas preocupações são coisa do passado. Dê as boas-vindas ao novo comando defer: um comando de fluxo de controlo poderoso e moderno, concebido para tornar o seu código 4D mais limpo, mais seguro e muito mais elegante.
Vamos ver como funciona e como vai transformar a forma como escreve código 4D!
O que é o comando defer?
O conceito é maravilhosamente simples: o comando defer permite-lhe empilhar uma expressão que será executada automaticamente apenas quando o método ou função atual terminar de ser executado.
Quando o fluxo de execução encontra uma instrução defer, não executa a expressão imediatamente. Em vez disso, empurra-a de forma segura para uma «pilha diferida» interna dedicada.
A magia acontece quando o seu método ou função termina. Independentemente de como for concluído, o 4D irá automaticamente retirar todas as expressões da pilha diferida e executá-las na ordem LIFO (Last In, First Out).
Esta execução garantida é acionada em todos os cenários de saída:
- Conclusão Normal: Quando o fluxo de execução termina naturalmente.
- Saídas antecipadas: Quando uma instrução Return é encontrada e processada.
- Interrupções inesperadas: mesmo que ocorra um erro fatal e o utilizador confirme a interrupção, o 4D garante que as suas expressões diferidas são executadas para limpar o ambiente em segurança.
Casos de uso práticos
Para ver o poder do defer, vamos analisar dois exemplos clássicos em que este comando simplifica radicalmente o seu desenvolvimento.
Gestão de recursos à prova de falhas
Ao lidar com recursos externos, como árvores XML, transações de bases de dados ou outros, deve garantir que são fechados corretamente para evitar fugas de memória. Com o defer, pode colocar o seu código de alocação e de limpeza lado a lado:
var $root:
:= ("rootName")
( ( ))
Text
$rootDOM Create XML Ref
// Ensure the XML tree will be closed and memory freed, no matter what happens next!
deferDOM CLOSE XML$root
// Do something with the $root tree...
Restaurar os estados do ambiente e da base de dados
Por vezes, o seu código precisa de alterar temporariamente um parâmetro global da base de dados ou uma configuração do ambiente (como ativar o registo de diagnóstico detalhado para uma operação complexa específica) e garantir que este é restaurado para o seu valor original posteriormente. O comando defer lida com esta restauração de estado de forma excelente:
// Get the current state of diagnostic log recording
$logRecording:=Get database parameter(Diagnostic log recording)
// Temporarily enable it for this specific process/method
SET DATABASE PARAMETER(Diagnostic log recording; 1)
// Guarantee the original state is restored as soon as the method/function exits!
defer(SET DATABASE PARAMETER(Diagnostic log recording; $logRecording))
// Execute your complex or heavy operations here...
Execução segura por design
Concebemos esta funcionalidade tendo em mente a segurança e a robustez. Não terá de se preocupar com uma tarefa de limpeza com falha que interrompa o fluxo de saída da sua aplicação.
Se uma expressão executada a partir da pilha diferida lançar um erro, o 4D capta-o automaticamente em segundo plano, sem qualquer interrupção. Continua a executar o resto da pilha de forma contínua, comportando-se exatamente como se a expressão fosse executada dentro de um bloco try implícito.
Para manter o seu código simples e evitar loops infinitos ou comportamentos imprevisíveis, também implementámos algumas regras de proteção:
- Sem Aninhamento: Se uma expressão diferida vier a conter outras instruções defer, essas expressões aninhadas são simplesmente ignoradas.
- Sem retornos internos: se uma instrução Return for acidentalmente chamada dentro de uma expressão diferida, ela não será executada.
Uma Avaliação Inteligente do Contexto
Quando as suas expressões diferidas são executadas no final de um método/função, o 4D lida com o contexto das variáveis de forma transparente: as variáveis locais padrão mantêm os valores que tinham no momento exato em que foram diferidas, enquanto as variáveis de processo, as variáveis de objeto locais e os registos clássicos refletem o seu estado final na conclusão do método/função.
Conclusão
Disponível a partir do 4D 21 R4, o comando defer é mais do que apenas uma conveniência; é uma atualização estrutural para o seu fluxo de trabalho de desenvolvimento. Ao agrupar a inicialização e a limpeza no início da sua lógica, o seu código torna-se mais legível, mais fácil de manter e mais resistente a interrupções inesperadas em tempo de execução.
Está pronto para escrever aplicações 4D mais limpas e seguras? Diga-nos o que pensa no Fórum 4D!
De momento, não é possível deixar comentários nesta publicação.