定義と計算
手品のよう!
ここに 2つの簡単な例があります。どちらの場合も、すべてのプロパティを入力することができます。
width や height を変更すると、perimeter と surface が再計算されます。逆に、surface や perimeter を変更すると、width と height がそれに応じて変化します:
タネと仕掛けはどこに…?
どちらの場合も、舞台裏にスクリプトはありません! 計算は、Rectangle クラス内で一回きり定義されているだけです。もし、これらのプロパティを使ったフォームが複数必要になっても、追加のコードを書く必要はありません。
では、どのような仕組みになっているのか、見てみましょう。
計算プロパティへのアクセス
GET
get surface 関数は Rectangleクラス内で定義します:
Function get surface() -> $surface: Real
$surface:= This.width * this.height
上の関数が書けたら、surface プロパティを普通のプロパティと同様に扱うことができるようになります。
$rect:=cs.Rectangle.new(60; 20)
$surface:=$rect.surface // surface プロパティを取得します
ALERT("この長方形の面積: "+String($surface))
SET
// この関数は、surfaceプロパティが変更されたときに呼び出されます
Function set surface($surface)
// 縦横比を維持します
$ratio:=This.width/This.height
This.height:=Square root($surface/$ratio)
This.width:=Square root($surface*$ratio)
上記の関数を書くと、surface プロパティは普通のプロパティと同様に変更することができます。width と height の属性は、それに応じて調整されます。
// 幅60 x 高さ20 の長方形を作成します
$rect:=cs.Rectangle.new(60; 20)
$surface:=$rect.surface // surface プロパティを取得します
ALERT("この長方形の面積: "+String($surface)) // 120 を返します
// 面積を変更してみましょう
$rect.surface:=1000
// 更新された幅と高さを表示します
$width:=$rect.width
$height:=$rect.height
ALERT("この長方形の寸法: "+String($width)+" x "+String($height)) // 54.77 x 18.25 を返します
クエリとソート
Rectangleクラスのオブジェクトを複数格納するコレクションは、計算プロパティを使った クエリ や ソート もおこなうことができます!
クエリの例です:
myRectangles:=myRectangles.query("perimeter < 200")
ソートの例です:
myRectangles:=myRectangles.orderBy("perimeter desc")
…そしてJSON
オブジェクトが計算プロパティを持つ場合、これらのプロパティは “stringify” (文字列化) の際に考慮されます。
$rect:=cs.Rectangle.new(30; 40)
ALERT(JSON Stringify($rect;*))