Fórmula: Mais poder por detrás da simplicidade

Tradução automática de Deepl

O comando Formula está disponível desde 4D v17 R3. Até agora, pode ter pensado em atribuir uma fórmula como método a um objecto ou construir objectos inteligentes que possam calcular valores ou fazer tudo o que precisar. Isso é realmente fantástico, e há mais do que se pode imaginar!

Tive uma grande demonstração de Vincent de Lachaux – Desenvolvedor e perito 4D – sobre como ele usa este comando. Para este post no blog, compilei diferentes cenários a partir dessa demonstração para vos dar uma visão sobre uma dimensão diferente deste comando.

Exemplo 1 – Para simplificar um comando existente

Alguns comandos 4D são utilizados centenas de milhares de vezes no código.Passamosfrequentemente os mesmos parâmetros, excepto um.

Tomemos o exemplo simples do comando OBJECT get pointer. Quero inicializar os valores das minhas caixas de verificação, por isso escrevo:

(OBJECT get pointer(Object named; "checkbox"))->:=0

Ou, escrevo uma fórmula que toma o nome do meu objecto como parâmetro:

interface.ponteiro:=Formula(OBJECT Get pointer(Object named;$1))

Quando quero atribuir ou recuperar o valor da minha caixa de verificação, escrevo simplesmente:

(interface.pointer("checkbox"))->:=0
(interface.pointer("checkbox2"))->:=0

Ou, se precisar de definir milhares de caixas de verificação, posso criar uma fórmula para tornar as coisas simples:

interface.setCheckbox:=Formula((OBJECT Get pointer(Object named;$1))->:=$2)

Para definir uma série de caixas de verificação, posso simplesmente escrever:

interface.setCheckbox("checkbox1";0)
interface .setCheckbox("checkbox2";1)
interface .setCheckbox("checkbox3";0)
interface .setCheckbox("checkbox4";1)

Mais fácil de ler – e muito mais fácil de escrever, uma vez que não preciso de contar parênteses…

Exemplo 2 – Com um parâmetro de base de dados

No seu código, defina o mesmo parâmetro de base de dados várias vezes com valores diferentes. Tomemos um exemplo concreto com dicas de controlo de atrasos. Pode querer exibir as dicas sem demora em algumas partes dos seus formulários, e esperar 1s em outras partes. Cada vez que utilizar o parâmetro da base de dados, deve lembrar-se do valor ou procurá-lo noutra peça de código.

Porque não criar uma fórmula?

interface.tipsNoDelay:=Formula(SET DATABASE PARAMETER(Tips delay;1)))
interface .tips1sDelay.Formula:= (SET DATABASE PARAMETER(Tips delay;60)))

Depois, quando se quer alterar o valor, basta chamar a fórmula:

interface.tips1sDelay()
// or

interface .tipsNoDelay()

Exemplo 3 – Utilizar fórmula como variante

Pode criar uma fórmula que utiliza os valores passados como parâmetros de um método(isto é, $1, $2) mas, no método em que cria a sua fórmula, não precisa de escrever $1 e $2. As variáveis são digitadas quando a fórmula é executada. Pode escrever métodos genéricos ou fórmulas.

Aqui está um exemplo simples que mostra que o tipo é definido na execução.

$obj:=New object("adição";Formula($1+$2))

$number :=$obj.addition(1;2) // devolve 3
$text :=$obj.addition("olá"; "mundo") // devolve olá mundo

Exemplo 4 – Testar uma série de condições

Se fizer uma sequência de condições, tais como If (() & ()), 4D avalia sempre todas as condições. Não pára e continua a avaliar as condições seguintes. Se algumas condições só podem ser avaliadas se a mais esquerda for verdadeira, é forçado a fazer uma lista profunda de se condições, para verificar se o objecto é válido antes de testar o atributo. É assim que funciona:

If (Not(Undefined($o))
If ($o.value. #Null)
If ($o.value<5)
// to do
End if
End if
End if

Neste exemplo, tínhamos “apenas” 3 condições, mas pode facilmente reparar que se torna cada vez mais complexo. E que tal escrever tudo numa única condição? Porque não escrever um método que execute as suas fórmulas uma após a outra? Se o resultado for Verdadeiro, avalia a seguinte fórmula, se o resultado for falso, pára e devolve Falso.

If (_AND (\
Formula (Not(Undefined($o))));\
Formula ($o.value#Null);\
Formula ($o.value<5)\
))
// to do
End if

Para o método _AND, código muito usual e simples:

$0:=True
For ($i;1;Count parameters;1)
$0 :=${$i}.call()
If (Not($0))
$i :=MAXLONG-1 // Stop if the condition fails
End if
End for

Espero que estes exemplos lhe dêem uma visão sobre outras formas de utilizar este comando. Sinta-se à vontade para partilhar as suas fórmulas no fórum 4D… Tenho a certeza de que têm muitas ideias!

Vanessa Talbot
• Proprietário do produto - Vanessa Talbot entrou ao time 4D Program em Junho de 2014 como Proprietária do Produto e está a cargo de escrever as histórias dos usuários e depois traduzi-las em especificações funcionais. Seu papel também é garantir que a implementação da funcionalidade entregue cumpra com as necessidades do cliente. Desde sua chegada, trabalhou na definição de funcionalidades chaves em 4D. Trabalhou na maioria das novas funcionalidades multithread preemptivo e também em um tema muito complexo: a nova arquitetura para a aplicação engined. Vanessa é formada pela Telecom Saint-Etienne. Começou sua carreira no Instituto de Investigação Criminal como desenvolvedora do departamento audiovisual. Também trabalhou em meios de comunicação e no âmbito médico como especialista em assistência técnica, produção e documentação de novas funcionalidades.