Definición y cálculos
¡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.
¿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
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
// 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;*))