Definice a výpočty
Kouzlo!
Zde jsou dva přímočaré příklady. V obou případech lze zadat všechny atributy.
Když změníte vlastnosti width nebo height, přepočítají se vlastnosti perimeters a surfaces. Platí to i obráceně: změňte surface nebo perimeter, a widths a heights se podle toho změní.
V čem spočívá kouzlo?
V obou případech není za scénou žádný skript! Všechny výpočty jsou definovány jednou provždy v rámci třídy Rectangle! Zde je tedy velká výhoda: pokud budete potřebovat více formulářů využívajících tyto atributy, nebudete muset psát žádný kód (stejně jako výše).
Podívejme se, jak se to dělá!
Přístup k vlastnostem COMPUTED
GET
The function gets surface je definována uvnitř třídy Rectangle.
Function get surface() -> $surface: Real
$surface := This.width * this.height
Po zapsání výše uvedené funkce můžete nyní vlastnost surface používat jako běžnou!
$rect:=cs.Rectangle.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)
// zachovat poměr šířky a výšky
$ratio :=This.width/This.height
This .height:=Square root($surface/$ratio)
This .
width:=Square root($surface*$ratio)
Po napsání výše uvedených funkcí můžete nyní upravit vlastnost surface jako běžnou! Atributy width a height budou odpovídajícím způsobem upraveny.
//Let's create a rectangle who's original width and height are 60x20
$rect:=cs.Rectangle.new(60; 20)
$surface :=$rect.surface // získáme vlastnost povrchu
ALERT ("Povrch tohoto obdélníku je: "+String($surface)) // vrátí 120
// Upravíme povrch
$rect .surface:=1000
// Pak zobrazíme novou šířku a výšku
$width :=$rect.width
$height:=$rect.height
ALERT ("Obdélník je nyní: "+String($width)+" x "+String($height)) // vrátí 54,77 x 18,25
Dotazy a třídění…
Na kolekce naplněné objekty třídy Rectangle se lze dotazovat a třídit pomocí vypočtených vlastností!
Ukázka dotazu:
myRectangles:=myRectangles.query("perimeter < 200")
Ukázka OrderBy:
myRectangles:=myRectangles.orderBy("perimeter desc")
…a JSON
Pokud použijete objekt s vypočtenými vlastnostmi, budou tyto vlastnosti zohledněny při jeho „řetězení“.
$rect:=cs.Rectangle.new(30; 40)
ALERT (JSON Stringify($rect;*))