Não tenha medo de valores indefinidos

Tradução automática de Deepl

Com 4D v16 R4, introduzimos a Notação de Objectos que é uma grande melhoria na linguagem 4D: o seu código é rápido, flexível, eficiente e elegante! Esta funcionalidade criou muito interesse nos fóruns 4D e recebemos muito feedback dos nossos clientes destacando situações em que havia valores indefinidos, tornando o código desafiante para escrever.

Com 4D v16 R5, levámos em conta o seu feedback e simplificámos a utilização de propriedades e valores indefinidos com a Notação de Objectos.

Esta realização consiste em duas partes: primeiro, a linguagem 4D está agora a aceitar valores indefinidos em qualquer parte de uma expressão utilizando a notação de objecto. Em segundo lugar, sempre que atribui um valor indefinido a uma variável, a variável é agora definida para um valor por defeito de acordo com o seu tipo (0 para numérico, “” para string, etc.).

Ler uma propriedade ou valor indefinido

Nas versões anteriores, a leitura da propriedade de um objecto inexistente gerou um erro e parou a execução do código. Agora em 4D v16 R5, produz um valor indefinido.

Vejamos um exemplo onde pretende verificar a existência da propriedade do objecto p2 em $o.p1.p2 e não tem a certeza de que o objecto $o.p1 está definido:

Em 4D v16 R4, deve primeiro verificar se a propriedade p1 está definida e depois fazer o mesmo para p2:

C_OBJECT($o)
$o :=InitObject
If ($o.p1#Null) // Verifique se p1 está definido
If ($o.p1.p2#Null) // Verifique se p2 está definido
$o .p1.p2.p3:="algum texto"

Em 4D v16 R5, pode simplesmente escrever o código abaixo … mesmo que o p1 não esteja definido.

C_OBJECT($o)
$o :=InitObject
If ($o.p1.p2#Null) // Check immediately if p1 and p2 are defined
$o .p1.p2.p3:="algum texto"
.

Converter valores indefinidosS

Os comandos de conversão de TIPOS AGORA aceitam valores indefinidos

O … String, Num, Datee Time aceitam agora valores indefinidos e devolvem um valor por defeito de acordo com o tipo. Para completar este conjunto de comandos, criámos um novo Bool que regressa False quando se passa um valor indefinido. Esta actualização é especialmente útil quando se chama comandos 4D.

Por exemplo, se um comando 4D espera uma expressão de texto como parâmetro, não se pode passar um valor indefinido. Assim, tem de escrever este tipo de código em 4D v16 R4 e verificar se a propriedade existe antes de utilizar o comando 4D:

C_OBJECT($o)
$o :=InitObject
If ($o.p1#Null) // Check if p1 is defined
If ($o.p1.p2#Null) // If p1 is defined, you can now check if p2 is defined

READ PICTURE FILE ($o.p1.p2;$i)
else
READ PICTURE FILE ("";$i)
End if
End if

Em 4D v16 R5, pode simplesmente escrever o código abaixo. O String verifica e converte o valor indefinido para si. Agora, só precisa de uma única linha de código em vez de quatro!

C_OBJECT($o)
$o :=InitObject
// If $0.p1.p2 is undefined, String return "" and READ PICTURE FILE command opens standard Open file dialog box.
READ PICTURE FILE (String($o.p1.p2);$i)

Atribuição de um valor indefinido

A partir de agora, se atribuir um valor indefinido a uma variável, a variável é definida para o seu valor de tipo padrão (0 para um numérico, “” para uma string, etc.).

C_LONGINT($l)
$l :=10
$l :=$o.indefinido
// In 4D v16 R4, $l does not change, $l=10
// In 4D v16 R5, $l is reinitialized, $l=0

De facto, agora também se pode passar um valor indefinido como parâmetro para um método de projecto. Funciona exactamente da mesma forma. O valor é imediatamente convertido de acordo com o tipo de parâmetro declarado e definido para o seu tipo de valor por defeito.

Finalmente, também pode passar valores indefinidos para Case of e If declarações. Neste caso, 4D considera um valor indefinido como False:

If ($o.b)
// if $o.b is undefined this code is not executed
..
.
End if

Para mais detalhes, pode consultar o artigo Using object notation article.

Fabrice Mainguené
- Proprietário do produto ->p>Fabrice Mainguené juntou-se à equipa do Programa 4D em Novembro, 2016. Como Proprietário do Produto, está encarregado de escrever as histórias dos utilizadores, traduzindo-as depois para especificações funcionais. O seu papel é também o de assegurar que a implementação da funcionalidade entregue vai ao encontro das necessidades do cliente.Após a obtenção da licenciatura em Informática no CNAM, Fabrice juntou-se a uma pequena empresa editora de software como programador Windev. Depois trabalhou para diferentes empresas nas áreas da indústria e comércio como programador Windev e web developer, bem como como consultor técnico sobre novas funcionalidades.