No tengas miedo de los valores indefinidos

Traducido automáticamente de Deepl

Con 4D v16 R4, introdujimos la Notación Objeto que es una gran mejora para el lenguaje 4D: su código es rápido, flexible, eficiente y elegante. Esta característica creó mucho interés en los foros de 4D y recibimos muchos comentarios de nuestros clientes destacando situaciones en las que había valores indefinidos que hacían que el código fuera difícil de escribir.

Con 4D v16 R5, hemos tenido en cuenta sus comentarios y hemos simplificado el uso de propiedades y valores indefinidos con la Notación Objeto.

Este logro consta de dos partes: en primer lugar, el lenguaje 4D acepta ahora valores indefinidos en cualquier parte de una expresión utilizando la notación de objetos. En segundo lugar, cada vez que se asigna un valor indefinido a una variable, la variable se establece ahora con un valor por defecto según su tipo (0 para numérico, «» para cadena, etc.).

Leer una propiedad o un valor indefinido

En versiones anteriores, la lectura de la propiedad de un objeto inexistente generaba un error y detenía la ejecución del código. Ahora en 4D v16 R5, produce un valor indefinido.

Veamos un ejemplo en el que se quiere comprobar la existencia de la propiedad del objeto p2 en $o.p1.p2 y no se está seguro de que el objeto $o.p1 esté definido:

En 4D v16 R4, primero debe comprobar si la propiedad p1 está definida y luego hacer lo mismo con p2:

C_OBJECT($o)
$o :=InitObject
If ($o.p1#Null) // Comprueba si p1 está definido
If ($o.p1.p2#Null) // Comprueba si p2 está definido
$o .p1.p2.p3:="algún texto"

En 4D v16 R5, puede simplemente escribir el código siguiente … incluso si p1 no está definido.

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

Convertir valores indefinidos

Los comandos de conversión TYPE aceptan AHORA valores indefinidos

El String, Num, Datey Time aceptan ahora valores indefinidos y devuelven un valor por defecto según el tipo. Para completar este conjunto de comandos hemos creado un nuevo comando Bool que devuelve False cuando se pasa un valor indefinido. Esta actualización es especialmente útil cuando se llama a los comandos de 4D.

Por ejemplo, si un comando 4D espera una expresión de texto como parámetro, no puede pasar un valor indefinido. Por lo tanto, tiene que escribir este tipo de código en 4D v16 R4 y verificar si la propiedad existe antes de utilizar el 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

En 4D v16 R5, basta con escribir el código siguiente. El comando String comprueba y convierte el valor indefinido por usted. Ahora, sólo necesita una línea de código en lugar de cuatro.

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)

Asignación de un valor indefinido

A partir de ahora, si se asigna un valor indefinido a una variable, ésta se establece en su valor de tipo por defecto (0 para una numérica, «» para una cadena, etc.).

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

De hecho, ahora también puede pasar un valor indefinido como parámetro a un método del proyecto. Funciona exactamente igual. El valor se convierte inmediatamente según el tipo de parámetro declarado y se establece su valor de tipo por defecto.

Por último, también puede pasar valores indefinidos a las sentencias Case of y If. En este caso, 4D considera un valor indefinido como False:

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

Para más detalles, puedes echar un vistazo al artículo Uso de la notación de objetos.

Fabrice Mainguené
- Product Owner -Fabrice Mainguené se unió al equipo de 4D Program en noviembre de 2016. Como Product Owner, está a cargo de escribir las historias de usuario y luego traducirlas a especificaciones funcionales. Su papel es también asegurarse de que la implementación de la característica entregada cumple con las necesidades del cliente. Después de obtener una licenciatura en Ciencias de la Computación en el CNAM, Fabrice se unió a una pequeña empresa de publicación de software como desarrollador Windev. A continuación, trabajó para diferentes empresas del sector industrial y comercial como desarrollador de Windev y de la web, así como asesor técnico de nuevas funcionalidades.