More Related Content Similar to オブジェクト指向入門1 (10) More from Kenta Hattori (20) オブジェクト指向入門13. 2011/2/9 オブジェクト指向プログラミング入門 1 3
オブジェクト指向の重要な特徴
カプセル化( Encapsulation )
情報 / 実装の隠蔽( Information/implementation
hiding )
状態保持( State retention )
オブジェクトの固有性( Object identity )
メッセージ( Messages )
クラス( Classes )
継承( Inheritance )
多態性( Polymorphism )
総称性( Genericity )
4. 2011/2/9 オブジェクト指向プログラミング入門 1 4
カプセル化( Encapsulation )
カプセル化の概念はソフトウェアと同じくらい古い
1940 年くらいには,プログラマ達は同じような命
令のパターンが同じプログラムに何度も現れること
に気づいた
人々は,そのような繰返しパターンはプログラムの
隅っこの箱の中に閉じ込めておき,メインプログラ
ムの異なる場所から単一の名前単一の名前で呼び出し得ること
を理解した
⇒ こうしてサブルーチン( subroutine )が発明されたカプセル化とは,関連する概念を一つのユ
ニットにグループ化し,それ以後,単一の名
前で参照できるようにすることである
5. 2011/2/9 オブジェクト指向プログラミング入門 1 5
サブルーチン( Subroutine )
サブルーチンは当時の貴重なメモリを節約する良い
手段だった
後に人々は,人間の記憶も節約できることに気づい
た
人が単一の観念として捉え,操作できる概念の塊として表
される
月々のローン
返済額の計算
元金
ローン期間
利率
返済額
ローンの許可
入力変数
出力変数サブルーチン
コードはサブルーチン
の中にカプセル化され
る
6. 2011/2/9 オブジェクト指向プログラミング入門 1 6
オブジェクト指向におけるカプセル
化
オブジェクト指向におけるカプセル化の目的もサブ
ルーチンのそれと同じ
ただし,構造的にはより洗練されている
オブジェクト指向におけるカプセル化とは,
データを取り巻く手続きをグループ化したも
のである
direction
location
set-in-grid
turn-left
turn-right
advance location
facing-wall
display
メソッ
ド
変数
7. 2011/2/9 オブジェクト指向プログラミング入門 1 7
オブジェクト指向におけるオブジェ
クト
複数のメソッドと複数の変数から構成される
変数はオブジェクトのメソッドからアクセス
され更新される
それぞれの変数は非公開であり,他のオブ
ジェクトは変数に直接アクセスすることはで
きない
他のオブジェクトがそのオブジェクトの変数の情
報が必要なら,そのオブジェクトのメソッドにお
願いしてアクセスする
8. 2011/2/9 オブジェクト指向プログラミング入門 1 8
情報 / 実装の隠蔽
( Information/Implementation
Hiding ) カプセル化されたユニットは外( public view )と
内( private view )から眺めることができる
良いカプセル化に対する報酬はプライベートビュー
に見られる無数のこまごまとしたことを,パブリッ
クビューでは伏せておけることである
情報の隠蔽と実装の隠蔽
情報 / 実装の隠蔽とは,カプセル化された構
造の内側にある特定の情報や実装上の決定に
ついて,外部への見せ方を制限することであ
る
9. 2011/2/9 オブジェクト指向プログラミング入門 1 9
情報 / 実装隠蔽によるオブジェクト
のブラックボックス化
外部の観察者は,オブジェクトが何( what )がで
きるかについては知っている
オブジェクトがどのように( how )するのか,中
がどうなってるのか,についてはまったく知らない
情報 / 実装隠蔽の2つの利点
設計上の決定を局所化する
情報の内容を表現の形式と分離する
set-in-grid
turn-left
turn-right
advance location
facing-wall
display
10. 2011/2/9 オブジェクト指向プログラミング入門 1 10
状態の保持( State Retention )
オブジェクトは状態を保つことができる
伝統的な手続きモジュール(関数,副プログラム
,手続き,など)では,呼び出し元に戻ってその
モジュールが終了すると,結果だけが残る
同じモジュールが再び呼ばれても,あたかも最初
に呼び出されたかのように生み出される
オブジェクトは情報をそれ自身の中に無期限
に保持する
11. 2011/2/9 オブジェクト指向プログラミング入門 1 11
抽象データ型( ADT )
カプセル化,情報 / 実装隠蔽,状態の保持は
,オブジェクト指向の核ではあるが,新しい
アイディアではない
計算機科学者たちは,それらを抽象データ型の分
野として何年もの間,研究してきた
オブジェクト指向は ADT よりさらに進んで
,以降に示すような特徴を持つ
12. 2011/2/9 オブジェクト指向プログラミング入門 1 12
オブジェクトの固有性( Object
Identity )
オブジェクト指向の決定的な特徴は,それぞれのオ
ブジェクトが固有のアイデンティティを持つことに
ある
仲間のオブジェクトと区別するための何かユニーク
なものがある
オブジェクトハンドル機構によって提供される
オブジェクトの固有性とは,各オブジェクト
が異なるソフトウェア実体として識別され,
扱われるという特性である
13. 2011/2/9 オブジェクト指向プログラミング入門 1 13
142857
102237
オブジェクトハンドル
そのオブジェクトに何が起ころうとも,オブジェクトが生きて
いる限りハンドルは同じものであり続ける
2つのオブジェクトが同じハンドルを持つことはない
システムがオブジェクトを生成するときは常にそれぞれ異なる
(過去,現在,未来を通じて)ようなハンドルを割当てる
2つのオブジェクトが,たとえ同じ構造と情報を持っていたと
しても,それらは区別される
direction
location
set-in-grid
turn-left
turn-right
advance location
facing-wall
display
direction
location
set-in-grid
turn-left
turn-right
advance location
facing-wall
display
14. 2011/2/9 オブジェクト指向プログラミング入門 1 14
オブジェクトハンドル(2)
プログラマやユーザが実際に新しいオブジェクトのハンドル
( 102237 )をみることは出来ない
代わりに変数 hom1 を通じてオブジェクトにアクセスする
オブジェクトのメモリ番地をハンドルとして使用するオブジェ
クト指向環境もある
シンプルではあるがオブジェクトがメモリ中を移動したらいや
な感じになる
102237
direction
location
set-in-grid
turn-left
turn-right
advance location
facing-wall
display
142857
direction
location
set-in-grid
turn-left
turn-right
advance location
facing-wall
display
102237 142857
hom1 hom2
var hom1 := HOMINOID.new; var hom2 := HOMINOID.new;
15. 2011/2/9 オブジェクト指向プログラミング入門 1 15
オブジェクトハンドル(3)
hom2 := hom1 したら...
オブジェクト 142857 にはもはやアクセス不可能となる
多くのオブジェクト指向環境ではガーベッジコレクタによって
メモリから回収される
102237
direction
location
set-in-grid
turn-left
turn-right
advance location
facing-wall
display
142857
direction
location
set-in-grid
turn-left
turn-right
advance location
facing-wall
display
102237 102237
hom1 hom2
16. 2011/2/9 オブジェクト指向プログラミング入門 1 16
メッセージ( Messages )
オブジェクトは別のオブジェクトに対して,
メッセージによってアクティビティを遂行す
る
典型的なメッセージでは,一つのオブジェク
トから別のオブジェクトに対して何らかの情
報を運ぶメッセージは送信者オブジェクト ob1 があて
先オブジェクト ob2 に対して, ob2 がそのメ
ソッドの一つに適用するための要求物を運ぶ
手段である
17. 2011/2/9 オブジェクト指向プログラミング入門 1 17
メッセージの構造
Ob1 が ob2 にメッセージを送るには, ob1 は以下の3つを知っ
てる必要がある
Ob2 のハンドル
Ob2 のメソッド名
Ob2 がメソッド実行に必要とする追加的な情報(引数)
メッセージ送信の例:
hom1.turn-left;
オブジェクトにお願いする
伝統的な手続き(関数)呼び出しと逆になってる
call turn-left(hom1);
手続きユニットにお願いする
多態,オーバロード,動的束縛を議論するとき,この逆転は実
際上重要な違いをもたらす
18. 2011/2/9 オブジェクト指向プログラミング入門 1 18
メッセージ引数
hom1.advance(no-of-squares; advance-ok)
純粋なオブジェクト指向環境では,メッセージの引
数はオブジェクトのハンドルである
あて先オブジェクト
メソッド名
入力引数 出力引数
シグネチャ
メッセージ
20. 2011/2/9 オブジェクト指向プログラミング入門 1 20
メッセージの種類
情報メッセージ(過去指向)
オブジェクトに情報を提供し,更新させる
例: hom1.set-in-grid
質問メッセージ(現在指向)
オブジェクトの情報を明かすように要求する
例: hom1.location
命令メッセージ(未来指向)
オブジェクトにあるアクションをするように要求
する
例: hom1.advance
21. 2011/2/9 オブジェクト指向プログラミング入門 1 21
クラス( Classes )
クラスとオブジェクトの違い
クラスはあなたが設計しプログラムするもの
オブジェクトとはあなたが実行時に(クラスか
ら)生成しようとするもの
クラスとは,そこからオブジェクトが生成
(具体化)される雛形である.各オブジェク
トはそれの生成元であるクラスと同じ構造と
振る舞いを持つ
オブジェクト ob がクラス C に属するとき,
「 ob は C のインスタンスである」と言う
22. 2011/2/9 オブジェクト指向プログラミング入門 1 22
オブジェクトに必要なメモリ
概念図
実際の実装
object1
method-a
method-b
var-v
handle
method-c
method-d
var-w
var-x
var-y
var-z
400
bytes
10 bytes
6 bytes
object2
method-a
method-b
var-v
handle
method-c
method-d
var-w
var-x
var-y
var-z
400
bytes
10 bytes
6 bytes
object3
method-a
method-b
var-v
handle
method-c
method-d
var-w
var-x
var-y
var-z
400
bytes
10 bytes
6 bytes
object
1
method-a
method-b
var-v
handle
method-c
method-d
var-w
var-x
var-y
var-z
400
bytes
16 bytes
object
2
var-v
handle
var-w
var-x
var-y
var-z
16 bytes
object
3
var-v
handle
var-w
var-x
var-y
var-z
16 bytes
object
4
var-v
handle
var-w
var-x
var-y
var-z
16 bytes
object
5
var-v
handle
var-w
var-x
var-y
var-z
16 bytes
object
6
var-v
handle
var-w
var-x
var-y
var-z
16 bytes
・・・
23. 2011/2/9 オブジェクト指向プログラミング入門 1 23
クラスメソッド,クラス変数
どれだけ多くオブジェクトがインスタンス化されよ
うとも,ちょうど一セットだけのクラスメソッドと
クラス変数がある
クラスメソッドとクラス変数は個々のオブジェクト
の責務でまかないきれない状況を扱うのに必要
例: new メソッド, no-of-hominoids-created 変数 , etc.object
1
method-a
method-b
var-v
handle
method-c
method-d
var-w
var-x
var-y
var-z
400
bytes
16 bytes
object
2
var-v
handle
var-w
var-x
var-y
var-z
16 bytes
object
3
var-v
handle
var-w
var-x
var-y
var-z
16 bytes
object
4
var-v
handle
var-w
var-x
var-y
var-z
16 bytes
object
5
var-v
handle
var-w
var-x
var-y
var-z
16 bytes
object
6
var-v
handle
var-w
var-x
var-y
var-z
16 bytes
・・・
method-c
method-f
var-p
var-q
var-r
クラス変
数
クラス
メソッ
ド
インスタン
ス
メソッド
インス
タンス
変数
24. 2011/2/9 オブジェクト指向プログラミング入門 1 24
継承( Inheritance )
クラス C を書いた後で,いくつかのメソッドを除い
てほとんど同じようなクラス D が必要だとわかった
らどうする?
コピペコードはメンテナンス上よろしくない
( D による C からの)継承とは,クラス D
のオブジェクトがクラス C のオブジェクトに
利用可能なメソッドと変数を,あたかも D で
定義されたメソッドや変数のように使えるよ
うにする機能のことである.
C は D のスーパークラスと呼ばれる. D は C
のサブクラスである.
25. 2011/2/9 オブジェクト指向プログラミング入門 1 25
継承の例
var ac := AIRCRAFT.new;
var gl := GLIDER.new;
…
ac.turn(new-course;turn-ok); // OK
gl.release-towline; // OK
gl.turn(new-course;turn-ok); // OK
ac.release-towline; // NG
…
AIRCRAFT
course
turn()
GLIDER
whether-attached
release-towline()
26. 2011/2/9 オブジェクト指向プログラミング入門 1 26
is-a 関係
継承関係が適切かチェックする
「 D は C である」と言えるなら, D はほぼ
確実に C のサブクラスである
グライダーは航空機である (A glider is an aircraft)
27. 2011/2/9 オブジェクト指向プログラミング入門 1 27
単一継承と多重継承
多重継承では,単一継承における継承木が継
承格子( lattice )となる
多重継承は設計上の困難な問題をもたらす
AIRCRAFT PASSENGER
-VEHICLE
PASSENGER
-AIRCRAFT
28. 2011/2/9 オブジェクト指向プログラミング入門 1 28
多態性( Polymorphism )
ありがちな例
(a) 多態性とは,単一のメソッド名が複数の
クラス上で定義され,それらのクラスにおい
て異なる実装を取りうる機能である
(b) 多態性とは,一つの変数が異なる時点の
異なるクラスを指すことによる特徴である.
POLYGON
area()
TRIANGLE
area()
RECTANGLE
area()
HEXAGON
29. 2011/2/9 オブジェクト指向プログラミング入門 1 29
動的束縛( dynamic binding )
var p : POLYGON;
var t := TRIANGLE.new;
var h := HEXAGON.new;
…
If user says OK
then p:= t;
else p:= h;
…
p.area(); // p は TRAIANGLE か HEXAGON のどちらか
動的束縛(実行時束縛や遅延束縛ともいう)
とは,実際に実行されるべきコードを(コン
パイル時ではなく)実行時に決める技術であ
る
30. オーバーライドとオーバーロード
オーバーライド( overriding )
クラス C で定義されたメソッドを C のサブクラスの
中で再定義すること
オーバーロード( overloading )
同一のクラス上に定義されたいくつかのメソッド(や
演算子)が同じ名前やシンボルを持つとき,名前やシ
ンボルがオーバーロードされたという
多態性と関連した概念だが,オーバーライドとごっ
ちゃにしないこと
メソッドのどのコードが実行されるかはシグネチャに
よって決まる
product1.mark-down()
product1.mark-down(huge-percentage)
2011/2/9 オブジェクト指向プログラミング入門 1 30
31. 総称性( Genericity )
コードをコピペしなくても済む技術
2011/2/9 オブジェクト指向プログラミング入門 1 31
総称性とは,あるクラス C を,1つかそれ以
上のクラスとして実行時(クラス C のオブ
ジェクトがインスタンス化されたとき)に供
給されるように構築することである.
32. 総称的な TREE クラスの例
class TREE [NODE-ITEM];
…
var current-node := NODE-ITEM.new;
…
current-node.print();
2011/2/9 オブジェクト指向プログラミング入門 1 32
26
17 42
14 22 44
10 15 29 34
31
Mike
Dave Ted
Bob Fred Zack
Alice Carol Norb Rud
Pat
var prod-tree := TREE.new[PRODID]; var cust-tree := TREE.new[CUSTOMER];