11. 2011/3/7
抽象データ型としての POINT 型
TYPES
● POINT
FUNCTIONS
● x: POINT → REAL
● y: POINT → REAL
● rho: POINT → REAL
● theta: POINT → REAL
● translate: POINT×REAL×REAL → POINT
● rotate: POINT×REAL → POINT
● scale: POINT×REAL → POINT
AXIOMS
任意の x,y,a,b: REAL, x: POINT について以下が成り立つ
● x(translate(p1,a,b))=x(p1)+a
● y(translate(p1,a,b))=y(p1)+b
・・・
PRECONDITIONS
・・・
11オブジェクト指向プログラミング入門 5
14. 2011/3/7
POINT クラスの例
indexing
description: “2 ”次元の点
class POINT feature
x, y: REAL
-- 横座標と縦座標
rho: REAL is
-- 原点 (0,0) までの距離
do Result := sqrt(x^2+y^2) end
theta: REAL is
-- 横軸に対する角度
…
distance(p: POINT): REAL is
--p までの距離
do Result := sqrt((x-p.x)^2)+(y-p.y)^2) end
…
end
14オブジェクト指向プログラミング入門 5
15. 2011/3/7
関数の結果の表記
予約語 Result を使う
Result はデフォルト値で初期化される
non_negative_value(x: REAL): REAL is
-- 正ならば x の値,それ以外ならゼロ
do
if x > 0.0 then
Result := x
end
end
15オブジェクト指向プログラミング入門 5
16. 2011/3/7
現在のインスタンス
どの点の x と y に a と b を足すのか?
現在のインスタンスの明示的な参照には予約語
Current を使う
distance(p: POINT): REAL is
-- p までの距離
do
if p /= Current then
Result := sqrt((x-p.x)^2 + (y-p.y)^2)
end
end
translate(a,b: REAL) is
-- 水平方向に a, 垂直方向に b 移動する
do
x := x+a; y:= y+b
end
16オブジェクト指向プログラミング入門 5
17. 2011/3/7
顧客と供給者
クラスを使う 2 通りの方法
そのクラスから継承する
そのクラスの顧客( client )になる
この定義では, a は C の属性かファンクションか
もしれないし, C のルーチンのローカルなエン
ティティか引数かもしれない
さきの例では,クラス POINT は REAL の顧客で
ある
S はクラスとする. a: S という形式の宣言を含むクラス C は S の顧客
( client )であるという.また, S は C の供給者( supplier )であるという
.
定義:顧客と供給者
17オブジェクト指向プログラミング入門 5
18. 2011/3/7
特性呼び出し
オブジェクト指向の基本的メカニズム
クラス POINT の特性 translate を p1 に適用せよ
特性呼び出しの基本形式
x.f
x.f(u, v, …)
x は呼び出しのターゲットと呼ばれる
2 つ目の形式では f は引数のあるルーチンであり,実引数 u,v な
どは, C の中の f の宣言の仮引数と,型と個数が一致する必要が
ある
p1.translate(4.0, -1.5)
(あれば)個々の仮引数を対応する実引数の値に初期化した後, x にアタッ
チされているオブジェクトに対して特性 f を適用する
ターゲット x に対して特性 f を呼び出した効果
18オブジェクト指向プログラミング入門 5
21. 2011/3/7
Current の役割
あるルーチンに対するすべての呼び出しは,特定の
ターゲットに対するものである
ルーチンのテキスト上に現れるすべての特性名をその特定
のターゲットに対して適用されるものとして扱う
p1.translate(4.0,-1.5) という呼び出しにおける, translate
の本体の中のすべての x の記述は「 p1 の x 」を意味する
Current とは「現在の呼び出しのターゲット」であ
る
F1 ● ルーチン呼び出しの一部として実行する以外の方法で実行される呼び
出し
要素は絶対にない.
F2 ● すべての呼び出しにはターゲットが 1 つある.
特性呼び出しの原則
21オブジェクト指向プログラミング入門 5
22. 2011/3/7
修飾された呼び出しと修飾されない
呼び出し
修飾された呼び出し
呼び出しのターゲットが明示的に指定されているもの
x.f
x.f(u, v, …)
修飾されない呼び出し
transform(a, b, factor: REAL) is
-- (a,b) だけ移動し, factor を率として拡大/縮小する
do
translate(a,b); scale(factor)
end
修飾されないすべての呼び出しはターゲットを Current と
する修飾された呼び出しとして書き直すことができる
do
Current.translate(a,b); Current.scale(factor)
ドット記法
22オブジェクト指向プログラミング入門 5
23. 2011/3/7
演算子特性
演算子を特性呼び出しと考える
x + a は x.plus(a) の糖衣構文
indexing
description: “ ”実数
class REAL feature
infix “+”(other:REAL): REAL is
-- 現在の値と other の合計
do … end
infix “-”(other:REAL): REAL is
-- 現在の値と other の差
do … end
prefix “-”: REAL is
-- 符号を逆にした現在の値
end
伝統的な表記法とオブ
ジェクト指向の法則を
調和させることが可能
23オブジェクト指向プログラミング入門 5
30. クラスの見つけ方
要求仕様書の記述にある名詞に注目する
The elevator will close its door before it moves to another
floor
ELEVATOR, DOOR, FLOOR がクラスになる
残念ながら,この方法はほとんど役に立たない
明らかなクラスしか見いだせないばかりか余計なクラスも含む
無駄なクラスを避ける
DOOR というクラスは本当に必要だろうか?
ELEVATOR の中にドアを開け閉めするコマンドを用意すれば済
むかもしれない
新しいクラスが必要か?
何階かという概念を表すのには整数でも十分?
整数の属性には含まれない重要な操作がある場合や利用で
きる操作を制限したい場合, FLOOR クラスは妥当かもし
れない
2011/3/7 30オブジェクト指向プログラミング入門 5