¿Necesita una varita mágica? ¡Aquí están las propiedades de la clase computarizada!

Traducido automáticamente de Deepl
La aparición de las clases en el entorno de desarrollo de 4D ha hecho que la programación sea más moderna y más fácil de escalar. Las clases permiten la definición de propiedades, funciones y también soportan la herencia.
En su aplicación, probablemente tenga una clase para gestionar datos científicos o financieros. Tomemos el ejemplo de los datos financieros. Digamos que ha creado funciones para calcular los impuestos. Si además gestionas varios países, es posible que hayas utilizado la herencia para gestionar las diferentes reglas. Luego, usted muestra estos resultados en un cuadro de lista, pero si el usuario cambia uno de los atributos utilizados en la fórmula, tiene que gestionar este evento para actualizar el resultado.
Con 4D v19 R3, 4D le permite simplificar este proceso gracias a las propiedades computadas: Puede definir una función get y set para su propiedad computada, y cuando añade su propiedad a un cuadro de lista, todo es manejado automáticamente por 4D. No más lógica de negocio en su UI.

Propiedades computadas de HDI

Definición y cálculos

Para explicar el poder de este concepto, hagámoslo lo más simple posible, y empecemos con un ejemplo concreto:
Una clase «Rectángulo» contiene dos atributos, width and height, y puede incluir funciones como getSurface() y getPerimeter(), que podrían ser utilizadas.
Sin embargo, ¿no sería mejor que las surface y perimeter se vieran como propiedades normales, al igual que las demás? ¿Propiedades que pueden ser leídas y posiblemente modificadas? Y las otras propiedades de las que dependen también podrían modificarse automáticamente. Pues bien, ahora es posible gracias a las propiedades computadas.

¡Mágico!

He aquí dos ejemplos sencillos. En ambos casos, se pueden introducir todos los atributos.

Cuando se modifica width o height, se recalculan perimeters y surfaces. Lo mismo ocurre a la inversa: si se modifica surface o perimeter,, los atributos widths y heights variarán en consecuencia.

blank

Esto también funciona en los cuadros de lista. ¡Que todavía pueden ser ordenados en cualquier columna!
blank

¿Dónde está la magia?

En ambos casos, ¡no hay ningún script entre bastidores! Todos los cálculos se definen de una vez por todas dentro de la clase Rectángulo. Así que aquí hay un gran beneficio: si necesitas más formularios que usen estos atributos, no necesitarás escribir ningún código (igual que arriba).

¡Veamos cómo se hace esto!

Acceso a las propiedades COMPUTED

GET

La primera función, «get», permite definir cómo se computa la propiedad. Para ello, debe devolver el resultado del cálculo.
Esta función es la única obligatoria y determina por su mera presencia la existencia de la propiedad computada y la posibilidad de utilizarla.

The function gets surface está definida dentro de la clase Rectángulo.

Function get surface() -> $surface: Real
$surface := This.width * this.altura

Una vez escrita la función anterior, ya se puede utilizar la propiedad de la superficie como un real

$rect:=cs.Rectángulo.new(60; 20)
$surface :=$rect.surface // get the surface property
ALERT("The surface of this rectangle is: "+String($surface))

SET

La segunda función, «set «, si existe, gestionará la modificación de una propiedad calculada. La modificación de la superficie permitirá recalcular el valor de la anchura y la altura del rectángulo.

// this function will be called when surface is modified
Function
set surface
($surface)

// mantener la relación ancho-altura
$ratio :=This.width/This.height

This
.height:=Square root($surface/$ratio)
This .width:=Square root($surface*$ratio)

Una vez escritas las funciones anteriores, ¡ya puede modificar la propiedad surface como una propiedad normal! Los atributos width y height se ajustarán en consecuencia.

//Let's create a rectangle who's original width and height are 60x20
$rect:=cs.Rectangle.new(60; 20)
$surface :=$rect.surface // obtener la propiedad superficie

ALERT ("La superficie de este rectángulo es: "+String($surface)) // devuelve 120
// Modifiquemos la superficie
$rect .surface:=1000
// A continuación, muestra la nueva anchura y altura
$width :=$rect.width
$height:=$rect.height
ALERT
El rectángulo es ahora: "+String($width)+" x "+String($height)) // devuelve 54,77 x 18,25

Consultas y ordenaciones…

Las colecciones llenas de objetos de la clase Rectángulo pueden ser consultadas y ordenadas usando propiedades computadas.

Ejemplo de consulta:

myRectangles:=myRectangles.query("perímetro < 200")

Ejemplo de OrderBy:

myRectangles:=myRectangles.orderBy("perímetro desc«)

…y JSON

Cuando se utiliza un objeto con propiedades calculadas, estas propiedades se tendrán en cuenta cuando se «encadena».

$rect:=cs.Rectángulo.new(30; 40)
ALERT (JSON Stringify($rect;*))

blank

Conclusión

Este sencillo ejemplo muestra que es posible realizar operaciones complejas, pero la complejidad permanecerá oculta.
Además, permite controlar mejor la publicación de los datos en función de los contextos, los derechos de los usuarios, etc., ya que se pueden definir reglas dentro de la propia clase.
¡Bienvenido a una forma moderna de programar!
Para más detalles, lea esta documentación.
Roland Lannuzel
- Propietario de Producto y Experto en 4D - Después de estudiar electrónica, Roland se dedicó a la informática industrial como desarrollador y consultor, construyendo soluciones para clientes con una variedad de bases de datos y tecnologías. A finales de los años 80 se enamoró de 4D y lo ha utilizado para escribir aplicaciones de negocio que incluyen sistemas de contabilidad, facturación y correo electrónico.Eventualmente se unió a la compañía en 1997, las valiosas contribuciones de Roland incluyen el diseño de especificaciones, herramientas de prueba, demos, así como la formación y hablar con la comunidad 4D en muchas conferencias. Continúa dando forma activamente al futuro de 4D definiendo nuevas características y herramientas de desarrollo de bases de datos.