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.