Definizione e calcoli
Magia!
Ecco due esempi semplici. In entrambi i casi, tutti gli attributi possono essere inseriti.
Quando si modificano le proprietà width o height, le proprietà perimeters e surfaces vengono ricalcolate. È vero anche il contrario: modificando surface o perimeter,, widths e heights varieranno di conseguenza.
Dov’è la magia?
In entrambi i casi, non c’è alcuno script dietro le quinte! Tutti i calcoli sono definiti una volta per tutte all’interno della classe Rectangle! Ecco quindi un grande vantaggio: se avete bisogno di altri moduli che utilizzano questi attributi, non dovrete scrivere alcun codice (proprio come sopra).
Vediamo come si fa!
Accesso alle proprietà COMPUTED
OTTENERE
The function gets surface è definita all’interno della classe Rectangle.
Function get surface() -> $surface: Reale
$surface := This.width * this.altezza
Una volta scritta la funzione di cui sopra, è ora possibile utilizzare la proprietà surface come una normale proprietà!
$rect:=cs.Rectangle.new(60; 20)
$surface :=$rect.surface // get the surface property
ALERT("The surface of this rectangle is: "+String($surface))
IMPOSTAZIONE
// this function will be called when surface is modified
Function set surface($surface)
// mantenere il rapporto larghezza-altezza
$ratio :=This.width/This.height
This .height:=Square root($surface/$ratio)
This .
width:=Square root($surface*$ratio)
Una volta scritte le funzioni di cui sopra, è ora possibile modificare la proprietà surface come una proprietà regolare! Gli attributi width e height saranno modificati di conseguenza.
//Let's create a rectangle who's original width and height are 60x20
$rect:=cs.Rectangle.new(60; 20)
$surface :=$rect.surface // ottenere la proprietà surface
ALERT ("La superficie di questo rettangolo è: " +String($surface)) // restituisce 120
// Modifichiamo la superficie
$rect .surface:=1000
// Poi visualizziamo le nuove larghezza e altezza
$width :=$rect.width
$height:=$rect.height
ALERT ("Il rettangolo ora è: "+String($width)+" x "+String($height)) // restituisce 54,77 x 18,25
Interrogazioni e ordinamenti…
Le collezioni di oggetti di classe Rectangle possono essere interrogate e ordinate utilizzando le proprietà calcolate!
Esempio di interrogazione:
myRectangles:=myRectangles.query("perimetro < 200")
Esempio di OrderBy:
myRectangles:=myRectangles.orderBy("perimetro desc"
)
…e JSON
Quando si utilizza un oggetto con proprietà calcolate, queste proprietà saranno considerate quando lo si “stringerà”.
$rect:=cs.Rectangle.new(30; 40)
ALERT (JSON Stringify($rect;*))