SlideShare una empresa de Scribd logo
1 de 46
オブジェクト指向
プログラミング入門
ソフトウェア基礎講座 第6回
2011年3月17日
服部健太
2011/3/17 オブジェクト指向プログラミング入門 6 2
オブジェクトとは何か?
 上の定義以外の見方
 外界のシステムに見られる「オブジェクト」
 例:グラフィックスシステム
 点,線,面,立体, etc
 例:給与計算システム
 従業員,給与小切手,給与体系
 オブジェクト指向によって,外界のシステムを自然にモデル化
できる
 あるクラスは問題領域における外界のオブジェクトの型のモデルを
意味する.
 ただし,すべてのクラスが問題領域のオブジェクト型に対応すると
は限らない.
オブジェクトは何らかのクラスの実行時のインスタンスである.
定義:オブジェクト
2011/3/17 オブジェクト指向プログラミング入門 6 3
基本形式
 O をオブジェクトとする.オブジェクトは何らかのクラス C の
直接インスタンスである.
 C は O の生成クラス,あるいは,単にジェネレータと呼ばれる
.
 C はソフトウェアテキスト, O は実行時のデータ構造である.
 オブジェクトの形式はクラスが持つ属性によって決まる.
 オブジェクトはフィールドフィールド(個々の属性について1つずつ用意
されている要素)の集合に過ぎない.
 例:クラス POINT
class POINT feature
x, y: REAL
… …ルーチンの宣言
end
3.4
-8.09
x
y
P_OBJ
(POINT)
2011/3/17 オブジェクト指向プログラミング入門 6 4
単純なフィールド
 基本型
 BOOLEAN
 それぞれの論理値の真と偽を表すインスタンスを2つだけ持つ
 True および False
 CHARACTER
 インスタンスは文字を表す
 ‘A’ のように一重引用符でその文字を囲む
 STRING (実は参照型)
 インスタンスは有限の長さの文字列を表す
 “A STRING” のように文字の並びを二重引用符で囲む
 INTEGER
 インスタンスは整数を表す
 34, -675, +4 など
 REAL および DOUBLE
 インスタンスは単精度および倍精度の浮動小数を表す
 3.5, -0.05 など. DOUBLE の場合は, -5.e-2 のような表記も可能
 基本型のインスタンスはコンピュータ上で効率的に実装される定義済
み集合から値を取り出す
2011/3/17 オブジェクト指向プログラミング入門 6 5
本の単純な概念
 例:クラス BOOK1
class BOOK1 feature
title: STRING
date, page_count: INTEGER
end
 典型的なインスタンスの例:
 レコードや構造型と違い,以下のようにフィールドに値を割当
てることはできない
b1: BOOK1
…
b1.page_count := 355
“The Red and the Black”
1830
title
date
(BOOK1)
341page_count
2011/3/17 オブジェクト指向プログラミング入門 6 6
著者
 例:クラス WRITER
class WRITER feature
name, real_name: STRING
birth_year, death_year: INTEGER
end
 インスタンスの例: “Stendhal”
“Henri Beyle”
name
real_name
(WRITER)
1842
birth_year
death_year
1783
2011/3/17 オブジェクト指向プログラミング入門 6 7
サブオブジェクト
 本には著者があるという特徴を表現したい
 本のクラス BOOK2 の中にそれ自体がオブジェクトである
フィールド author を設ける
 例:サブオブジェクト「著者」を持つ 2 つの「本」オブジェク
ト
“The Red and the Black”
1830
title
date
341page_count
“Life of Rossini”
1830
title
date
341page_count
(BOOK2) (BOOK3)
“Stendhal”
“Henri Beyle”
name
real_name
(WRITER)
1842
birth_year
death_year
1783
“Stendhal”
“Henri Beyle”
name
real_name
(WRITER)
1842
birth_year
death_year
1783
author author
2011/3/17 オブジェクト指向プログラミング入門 6 8
サブオブジェクトの問題点
 メモリ領域の無駄
 例えば,人を表すオブジェクトを考えたとき,そ
れぞれは市民権を持っている国を表すサブオブ
ジェクトを持っているとする.表現される人の数
は多いが国の数は少ない
 共有共有( sharing )を表現できない
 2つのオブジェクトの author フィールドは
WRITER の同じインスタンスを参照す
る. WRITER オブジェクトが更新されたら,そ
の変更がその著者の関係するすべての本に反映さ
れるようにしたい
2011/3/17 オブジェクト指向プログラミング入門 6 9
参照(1)
 例:同じ「著者」オブジェクトへの参照を含む 2 つ
の「本」オブジェクト
“The Red and the Black”
1830
title
date
(BOOK3)
341page_count
“The Red and the Black”
1830
title
date
(BOOK3)
341page_count
“Stendhal”
“Henri Beyle”
name
real_name
(WRITER)
1842
birth_year
death_year
1783
author author
2011/3/17 オブジェクト指向プログラミング入門 6 10
参照(2)
 void の参照フィールドがあるオブジェクト
参照とは実行時に void (無効)かアタッチ状態( attached )かのいずれか
の値をとる.
アタッチ状態の場合,参照は1つのオブジェクトを示す(その場合,その参
照はその特定のオブジェクトにアタッチされているという).
定義:参照
“Candide, or Optimism”
1759
title
date
(BOOK3)
120
author
page_count
2011/3/17 オブジェクト指向プログラミング入門 6 11
オブジェクトのアイデンティティ
 オブジェクト指向システムの実行中に作成さ
れるオブジェクトには,そのフィールドに
よって定義されるオブジェクトの値とは無関
係の,唯一のアイデンティティがある.
 アイデンティティの異なる2つのオブジェクトに
同一のフィールドが含まれている場合がある
 反対に,特定のオブジェクトのフィールドがシス
テムの実行中に変わる可能性がある.だからと
いって,そのオブジェクトのアイデンティティは
変わらない.
2011/3/17 オブジェクト指向プログラミング入門 6 12
参照の宣言
 クラス BOOK3 の定義
class BOOK3 feature
title: STRING
date, page_count: INTEGER
author: WRITE -- これが新しい属性
end
 クラスが次のような標準的な形式で宣言されているときには必
ず,
class C feature … end
次の形式の宣言によって C 型と宣言されたすべてのエンティ
ティは
x: C
C 型のオブジェクトへの参照である値を表す
2011/3/17 オブジェクト指向プログラミング入門 6 13
自己参照
 対応するクラス間の顧客関係にも循環がある
class PERSON1 feature
name: STRING
loved_one, landlord: PERSON1
end
“Almaviva”name
landlord
(PERSON1)
loved_one
“Figaro”name
landlord
(PERSON1)
loved_one
“Susanna” name
landlord
(PERSON1)
loved_one
2011/3/17 オブジェクト指向プログラミング入門 6 14
実行時のオブジェクト構造
 実行時のオブジェクト構造が複雑だからといって,必ずしも,
ソフトウェアそのもの,すなわち,クラス間の関係が複雑とは
限らない.
 クラス間の関係はむしろできる限り単純にするように心がける
べき
27
“Raphael”
True
897
3.5
“Sarah”
-62
“Caroline”
‘Z’
(TYPE1)
(TYPE1)
(TYPE4)
(TYPE3)
(TYPE5)
(TYPE2)
ルート
2011/3/17 オブジェクト指向プログラミング入門 6 15
モデリングツールとしてのオブジェ
クト
 ソフトウェア開発における4つの世界
 モデル化される側のシステム
 オブジェクトの型とその抽象的な関係によって記述され
る
 外界システムの特定の具体例
 関係する可能性のあるオブジェクト(もの)から構成さ
れる
 ソフトウェアシステム
 オブジェクト指向の関係(顧客と継承)によって結び付
けられたクラスから構成される
 オブジェクト構造
 参照によって結び付けられたソフトウェアオブジェクト
から構成される
2011/3/17 オブジェクト指向プログラミング入門 6 16
4つの世界の対応
抽象データ型
クラス
モデル
オブジェクト
(ソフトウェア)
オブジェクト
鋳型 実体(インスタンス)
抽象
具象 実装する
インスタンス
である
2011/3/17 オブジェクト指向プログラミング入門 6 17
オブジェクトと参照を操作する
 柔軟なデータ構造を作成し,利用できるようにする
ために,オブジェクト指向によるソフトウェアシス
テムがオブジェクトをどのように扱うのか
 動的な作成と再アタッチメント
 実行時に必要に応じてオブジェクトをシステムに作らせる
 最初の状態はオブジェクトが 1 つだけ(ルートオブジェク
ト)作られる
 新しいオブジェクトを作成する
 void だった参照をオブジェクトにアタッチする
 参照を void にする
 すでにアタッチされていた参照を他のオブジェクトにア
タッチする
2011/3/17 オブジェクト指向プログラミング入門 6 18
生成命令
 単純な形式の生成命令: create x
 x は生成命令のターゲットと呼ばれる
 BOOK3 クラスの顧客クラス QUOTATION の例:
class QUOTATION feature
source: BOOK3
page: INTEGER
make_book is
do create source end
end
 すべてのフィールドはデフォルトで初期化される
2011/3/17 オブジェクト指向プログラミング入門 6 19
生成命令(2)
ターゲット x の型がクラス C に基づいた参照型であるとき, create x とい
う形式の生成命令の効果は次の3つのステップを実行することである.
C1 ● C の新しいインスタンス( C の個々の属性に対して1つずつ作られる
フィールドの集合から構成される)を作成する. OC を新しいインスタンス
とする
C2 ● 標準のデフォルト値に従って OC の個々のフィールドを初期化する
C3 ● x の参照値を OC にする.すなわち x に OC をアタッチする
基本生成命令の効果
参照値のデフォルト値は void である
BOOLEAN 値のデフォルト値は False である
CHARACTER 値のデフォルト値はヌルキャラクタである
数値( INTEGER 型, REAL 型, DOUBLE 型)のデフォルト値はゼロ(す
なわち,適切な型の値ゼロ)である
デフォルトの初期値
2011/3/17 オブジェクト指向プログラミング入門 6 20
なぜ明示的な生成が必要なのか?
 生成と宣言は区別される
b: BOOK3 -- 宣言(オブジェクトは作られない)
create b -- 生成(オブジェクトが生成される)
 宣言時にオブジェクトが生成されたとしたら...
 オブジェクトを 1 つ生成するためにたくさんのオブジェク
トが生成されてしまう
 特に自己参照クラスの場合,無限ループに陥る
 void 参照や1つのオブジェクトに複数の参照をアタッチす
る余地がなくなってしまう
 フィールドが作られるたびにオブジェクトを作成するのは意
味がない
2011/3/17 オブジェクト指向プログラミング入門 6 21
生成プロシージャ
 デフォルトの初期化以外の初期化をするためには,そのクラス
に1つ以上の生成プロシージャを記述する
 生成プロシージャとは, feature 句の前のキーワード creation で
始まる句に列挙するプロシージャ
indexing
…
class C creation
p1, p2, …
feature
… プロシージャ p1, p2 …の宣言を含む特性宣言
end
 生成命令は以下のようになる
create x.p(…)
2011/3/17 オブジェクト指向プログラミング入門 6 22
クラス POINT の例
class POINT1 creation
make_cartesian, make_polar
feature
… 前のバージョンに記述されている特性 :
x, y, ro, theta, translate, scale, …
feature {NONE}
make_cartesian(a,b: REAL) is
do x := a; y := b end
make_polar(r,t: REAL) is
do x := r*cos(t); y := r*sin(t) end
end -- クラス POINT1
 顧客は次のような命令で点を生成する
create my_point.make_cartesian(0, 1)
create my_point.make_polar(1, Pi/2)
2011/3/17 オブジェクト指向プログラミング入門 6 23
生成呼び出しの効果
 最初の3つのステップは,基本生成命令と同
じ
create x.p(…) という形式の生成呼び出しを実行すると,次の4つのステッ
プが実行される.ただし,ターゲット x の型はクラス C に基づいた参照型で
あり, p はクラス C の生成プロシージャであり, (…) は必要ならば指定す
べき,このプロシージャの実引数の有効な並びを表す.
C1 ● C の新しいインスタンス( C の個々の属性に対して1つずつ作られる
フィール  
  ドの集合から構成される)を作成する.この新しいインスタンスを OC
と呼ぶこと  
  にする.
C2 ● 標準のデフォルト値に従って OC の各フィールドを初期化する.
C3 ● x の値(参照)を OC にアタッチする.
C4 ● 与えられた引数とともに OC に対してプロシージャ p 呼び出す.
生成呼び出しの効果
2011/3/17 オブジェクト指向プログラミング入門 6 24
生成プロシージャのエクスポートス
テータス
 POINT1 の2つの生成プロシージャは feature
{NONE} で始まる特性句で宣言されており,通常の
呼び出しに対しては非公開である.
 my_point.make_cartesian(0,1) や my_point.make_polar(1,
Pi/2) という呼び出しは不正
 一度生成した点オブジェクトの座標を顧客に直接設定させ
ないようにするため.
 生成プロシージャの選択的な公開を設定することも
可能
class C creation {A, B, …}
p1, p2,
…
2011/3/17 オブジェクト指向プログラミング入門 6 25
生成プロシージャに関する規則
 create x という基本形式と create x.p(…) という生
成呼び出しの2つの形式の生成命令は互いに排他的
である.
 クラスの中に creation 句が現れたら,許されるのは生成呼
び出しだけで基本形式は無効.
 コンパイラによって拒絶される
 オブジェクトの一貫性のため
 生成命令は常に一貫したオブジェクトを生成しなければなら
ない
 呼び出しのない create x という基本形式の生成命令が許され
るのは,すべてのフィールドにデフォルト値を設定すること
で一貫したオブジェクトが生成される場合だけ.
2011/3/17 オブジェクト指向プログラミング入門 6 26
複数の生成プロシージャと多重定
義
 C++ や Java では,生成プロシージャ(「コ
ンストラクタ」)はすべて同じ名前であり,
クラス名そのものである.
 2つのコンストラクタを区別するにはシグネチャ
(引数の型)で区別するしかない
 make_cartesian と make_polar に相当するコンス
トラクタを同時に定義できない...
2011/3/17 オブジェクト指向プログラミング入門 6 27
参照の状態
 参照は void かアタッチされているかの2つの状態のいずれかで
ある.
 オブジェクト
 実行時の概念.すべてのオブジェクトはある特定のクラスのイ
ンスタンスで,実行時作成され,いくつかのフィールドから構
成される
 参照
 実行時の概念.参照は void かオブジェクトにアタッチされてい
るかのいずれかの値である.
 エンティティ
 静的な概念.クラステキストに現れる識別子である.
VOID
STATE
ATTACHED
STATE
create b
b := c (c がアタッチされてる )
b := Void
b := c (c が void)
2011/3/17 オブジェクト指向プログラミング入門 6 28
void の参照と呼び出し
 ターゲットが void の特性呼び出しを実行しようとすると例外例外( exception )が
発生する
 コンパイラでチェックすることは非現実的
 void のターゲットに対して特性呼び出しをしないことを保証するのはプログラマの責
任
 簡単な方法
if x /= Void then
x.f(…)
else
…
end
 ただし,すべての特性呼び出しに対して上記のように書くのは荷が重過ぎる
 システムが正確であることを証明するには以下を証明する必要がある
 void の参照に適用される呼び出しが全く無いこと
 すべての表明(後の章で説明)が対応する実行時の瞬間に満たされていること
 ソフトウェアを守る方法
 ソフトウェアを書くときは,誤った状況が実行時に発生するのをあらゆる手段を使っ
て防ぐ必要がある(注意深く開発する.クラスを検査する,チェックツールを使用す
る)
 何らかの疑問が残っていて,同時に実行時の失敗が許されない場合,例外を処理する
ための用意をソフトウェアに備えておく
2011/3/17 オブジェクト指向プログラミング入門 6 29
参照についてのその他の操作
 参照をオブジェクトにアタッチする
class PERSON2 feature
name: STRING
loved_one, landlord: PERSION2
set_loved(l: PERSION2) is
do loved_one := l end
end
 a.set_loved(r) の実行
“Almavia”
“Susanna” “Rosina”
r
(PERSON2)
(PERSON2)(PERSON2)
O1
O2 O3
name
landlord
loved_one
name
landlord
loved_one
name
landlord
loved_one
a
2011/3/17 オブジェクト指向プログラミング入門 6 30
参照の比較
 等号演算子 = を使う(逆の演算子は /= )
 x=y が真になるのは,対応する参照が共に
void であるか,同じオブジェクトにアタッチ
されている場合だけ
 参照を比較するのであって,オブジェクトを
比較するのではない
 x と y が全く別のオブジェクトにアタッチされて
いれば,たとえそれらのオブジェクトのフィール
ドが全く一致していたとしても, x=y の値は偽と
なる
2011/3/17 オブジェクト指向プログラミング入門 6 31
void という値
 定義済みの特性 Void
 特定の参照が void かどうかテストする
if x = Void then …
 void の参照を作る
x := Void
x x
O1 O1
2011/3/17 オブジェクト指向プログラミング入門 6 32
オブジェクトのクローニングと一
致
 オブジェクトの新しいコピーを作る
x := clone(y)
 オブジェクトの内容を比較する
equal(x,y)
783
‘A’
783
‘A’
783
‘A’
y y x
OY OY OX
2011/3/17 オブジェクト指向プログラミング入門 6 33
オブジェクトのコピー
 すでにあるオブジェクトのフィールドに上書
きしたい場合
x.copy(y)
 y にアタッチされているオブジェクトの
フィールドが x に対応するフィールドにコ
ピーされる
 x も y も void であってはならない
2011/3/17 オブジェクト指向プログラミング入門 6 34
深いクローニングと比較
“Almaviva”name
landlord
(PERSON1)
loved_one
name
landlord
(PERSON1)
loved_one
name
landlord
(PERSON1)
loved_one
“Figaro” “Figaro”
O2
O1
O3
a
“Almaviva”name
landlord
(PERSON1)
loved_one
name
landlord
(PERSON1)
loved_one
name
landlord
(PERSON1)
loved_one
“Figaro” “Figaro”
O6
O5
O7
“Almaviva”name
landlord
loved_one
O4
b
b := a
c
c := clone(a)
d
d := deep_clone(a)
同様に deep_equal(x,y) もある
2011/3/17 オブジェクト指向プログラミング入門 6 35
深い記憶:永続性について
 参照を含むオブジェクトに対するストレージと復元
をどうすべきか?
 オブジェクトにアタッチされている参照はそのオブジェク
トなしでは価値がない
オブジェクトの直接依存オブジェクトとは,そのオブジェクトの参照フィー
ルドにアタッチされているオブジェクトがあれば,そのオブジェクトのこと
をいう.
オブジェクトの依存オブジェクトは,そのオブジェクト自身と,(再帰的に
関係をたどっていった)そのオブジェクトの直接依存オブジェクトの依存オ
ブジェクトである.
定義:直接依存オブジェクトと依存オブジェクト
ストレージメカニズムによってオブジェクトを保存するときには必ずそのオ
ブジェクトの依存オブジェクトも一緒に保存しなければならない.保存され
ているオブジェクトを復元メカニズムによって取り出すとき,そのオブジェ
クトのまだ取り出されていない依存オブジェクトがある場合には,必ずそれ
らも取り出さなければならない.
永続性の閉鎖の原則
2011/3/17 オブジェクト指向プログラミング入門 6 36
STORABLE クラス
 STORABLE の基本的な特性の形式
 store(f: IO_MEDIUM)
 x.store(f) という形式の呼び出しを実行すると, x にア
タッチされているオブジェクトがそのすべての依存オブ
ジェクトと一緒に f に関連付けられているファイルに保
存される
 x の生成クラスは STORABLE の子孫でなければならな
い
 x にアタッチされているオブジェクトをその保存される
構造の先頭オブジェクト( head object )という.
 retrieved(f: IO_MEDIUM): STORABLE
 retrieved(f) の結果として,前の store 呼び出しによって
f に保存された完全なオブジェクト構造と同一なオブ
ジェクト構造が得られる
2011/3/17 オブジェクト指向プログラミング入門 6 37
複合オブジェクトと拡張型
 実行時の値が C のインスタンスそのものであるエンティティ x が必要
な場合,次のように宣言する
x: expanded C
 あるオブジェクト O の1つまたは複数のフィールド自体がオブジェク
ト( O のサブオブジェクトと呼ばれる)であるとき, O は複合オブ
ジェクトであるという
 複合オブジェクトの書き方:
class COMPOSITE feature
ref: C
sub: expanded C
end
(C)
(C)
(COMPOSITE)
ref
sub
2011/3/17 オブジェクト指向プログラミング入門 6 38
拡張型
 拡張クラス
expanded class E feature
…
end
 E 型として宣言されるエンティティはすべて拡張
型になる
次のような2つの場合,その型は拡張型である
 ● expanded C という形式である
 ● E という形式である.ただし, E は拡張クラスである.
定義:拡張型
2011/3/17 オブジェクト指向プログラミング入門 6 39
拡張型の役割
 効率性を向上させる
 より良いモデル化を可能にする
 以下の属性宣言がクラス C の中にあるとする
D1 ● ref: S
D2 ● exp: expanded S
 D1 の宣言は C のすべてのインスタンスは S の特定のイン
スタンスについて「知っている」を表している
 共有を許す
 D2 の宣言は C のすべてのインスタンスは S のインスタン
スを1つ「含む」ということを表している
 共有を許さない
 統一されたオブジェクト指向的型体系の中での基本
型をサポートする
2011/3/17 オブジェクト指向プログラミング入門 6 40
オブジェクト間の「知っている」と
いう関係と「含む」という関係
class WORKSTATION feature
k: expanded KEYBOARD
c: expanded CPU
m: expanded MONITOR
n: NETWORK
…
end
(NETWORK)
KEYBOARD1
CPU1
MONITOR1
k
c
m
n
KEYBOARD1
CPU1
MONITOR1
k
c
m
n
KEYBOARD1
CPU1
MONITOR1
k
c
m
n
(WORKSTATION) (WORKSTATION) (WORKSTATION)「集約」と
いう関係を
表現してい
る
2011/3/17 オブジェクト指向プログラミング入門 6 41
拡張型の性質
 E 型の拡張エンティティ x について
 x の値は常にオブジェクトなので,絶対に void にはならな
い
 x = Void の結果は常に偽になる
 クラス D に expanded C 型の属性が含まれている
場合,クラス C は expanded D 型の属性を持つこ
とはできない
「拡張顧客」は次のように定義されたクラス間の関係であるとする.すなわ
ち, C のいずれかの属性が S に基づく拡張型である(つまり, expanded S
であるか, S が拡張クラスである場合には単に S )ならば, C は S の拡張
顧客である.
したがって,拡張顧客という関係に循環が含まれることがあってはならない
.
拡張顧客の規則
2011/3/17 オブジェクト指向プログラミング入門 6 42
サブオブジェクトへの参照はだめ
 実装の側面
 ガーベッジコレクションが効率良く実装できる
 モデリングの視点
 システム記述を単純化することになる
(C)
(E)
(COMPOSITE1)
other
sub
ref
x
y
OE
OC
O_CMP1
2011/3/17 オブジェクト指向プログラミング入門 6 43
アタッチメント:参照と値の意味
 アタッチメント x := y の効果
ソース y の型→
↓ ターゲット x
の型
参照型 拡張型
参照型 参照のアタッチメ
ント
クローン.
x := clone(y) の効
果
拡張型 コピー.
x.copy(y) の効果
( y が void なら失
敗)
コピー.
x.copy(y) の効果
2011/3/17 オブジェクト指向プログラミング入門 6 44
アタッチメント:参照と値の意味
 比較 x = y の意味
y の型→
↓x の型
参照型 拡張型
参照型 参照の比較 equal(x,y)
x が void でない場合はオブ
ジェクトの比較で, x が void
の場合は偽
拡張型 equal(x,y)
y が void でない場合はオブ
ジェクトの比較で, y が
void の場合は偽
equal(x,y)
オブジェクトの比較
2011/3/17 オブジェクト指向プログラミング入門 6 45
参照の利点と危険
 参照型の代入によって同じオブジェクトに別名が付
けられる(動的別名付け)
 思わぬ影響を及ぼす可能性がある
-- y.boolattr は偽とする
x := y
-- y.boolattr は偽
x.set_true
-- y.boolattr は真!
 動的別名付けとうまく折り合う
 複雑なデータ構造を記述するには参照の代入が必要
 カプセル化によって参照の操作の危険を避けられる
次回予定
 日時: 2011年3月24日(木)13:
00~14:30
 場所: LB 2F/A 会議室
 内容:総称性
2011/3/17 オブジェクト指向プログラミング入門 6 46

Más contenido relacionado

Similar a オブジェクト指向入門6

VSUG Day 2010 Summer - Using ADO.NET Entity Framework
VSUG Day 2010 Summer - Using ADO.NET Entity FrameworkVSUG Day 2010 Summer - Using ADO.NET Entity Framework
VSUG Day 2010 Summer - Using ADO.NET Entity FrameworkAtsushi Fukui
 
CMSI計算科学技術特論A(8) 高速化チューニングとその関連技術1
CMSI計算科学技術特論A(8) 高速化チューニングとその関連技術1CMSI計算科学技術特論A(8) 高速化チューニングとその関連技術1
CMSI計算科学技術特論A(8) 高速化チューニングとその関連技術1Computational Materials Science Initiative
 
僕がやったXaml戦略
僕がやったXaml戦略僕がやったXaml戦略
僕がやったXaml戦略Hiroyuki Mori
 
DSL駆動によるクラウド・アプリケーション開発
DSL駆動によるクラウド・アプリケーション開発DSL駆動によるクラウド・アプリケーション開発
DSL駆動によるクラウド・アプリケーション開発Tomoharu ASAMI
 
はじめての人のためのDeep Learning
はじめての人のためのDeep Learningはじめての人のためのDeep Learning
はじめての人のためのDeep LearningTadaichiro Nakano
 
UMLだけじゃないもやもやを解消するモデリング技術の紹介 その2 Feature Model
UMLだけじゃないもやもやを解消するモデリング技術の紹介 その2 Feature ModelUMLだけじゃないもやもやを解消するモデリング技術の紹介 その2 Feature Model
UMLだけじゃないもやもやを解消するモデリング技術の紹介 その2 Feature ModelShintaro Hosoai
 
非技術者でもわかる(?)コンピュータビジョン紹介資料
非技術者でもわかる(?)コンピュータビジョン紹介資料非技術者でもわかる(?)コンピュータビジョン紹介資料
非技術者でもわかる(?)コンピュータビジョン紹介資料Takuya Minagawa
 
第2回c#画像処理講習
第2回c#画像処理講習第2回c#画像処理講習
第2回c#画像処理講習Koshiro Miyauchi
 
[DL輪読会]End-to-End Object Detection with Transformers
[DL輪読会]End-to-End Object Detection with Transformers[DL輪読会]End-to-End Object Detection with Transformers
[DL輪読会]End-to-End Object Detection with TransformersDeep Learning JP
 
Javaセキュアコーディングセミナー東京第1回 講義
Javaセキュアコーディングセミナー東京第1回 講義Javaセキュアコーディングセミナー東京第1回 講義
Javaセキュアコーディングセミナー東京第1回 講義JPCERT Coordination Center
 
DDD 20121106 SEA Forum November
DDD 20121106 SEA Forum NovemberDDD 20121106 SEA Forum November
DDD 20121106 SEA Forum November増田 亨
 
設計/コンポーネント設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第22回】
設計/コンポーネント設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第22回】設計/コンポーネント設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第22回】
設計/コンポーネント設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第22回】Tomoharu ASAMI
 
データモデルの更新を効率よく検証するの並列可能性
データモデルの更新を効率よく検証するの並列可能性データモデルの更新を効率よく検証するの並列可能性
データモデルの更新を効率よく検証するの並列可能性Jiachen Yang
 
機械学習デザインパターン Machine Learning Design Patterns
機械学習デザインパターン Machine Learning Design Patterns機械学習デザインパターン Machine Learning Design Patterns
機械学習デザインパターン Machine Learning Design PatternsHironori Washizaki
 
オブジェクト指向最強
オブジェクト指向最強オブジェクト指向最強
オブジェクト指向最強haganemetal
 
20120623 cv勉強会 shirasy
20120623 cv勉強会 shirasy20120623 cv勉強会 shirasy
20120623 cv勉強会 shirasyYoichi Shirasawa
 

Similar a オブジェクト指向入門6 (20)

VSUG Day 2010 Summer - Using ADO.NET Entity Framework
VSUG Day 2010 Summer - Using ADO.NET Entity FrameworkVSUG Day 2010 Summer - Using ADO.NET Entity Framework
VSUG Day 2010 Summer - Using ADO.NET Entity Framework
 
Cpp v3
Cpp v3Cpp v3
Cpp v3
 
CMSI計算科学技術特論A(8) 高速化チューニングとその関連技術1
CMSI計算科学技術特論A(8) 高速化チューニングとその関連技術1CMSI計算科学技術特論A(8) 高速化チューニングとその関連技術1
CMSI計算科学技術特論A(8) 高速化チューニングとその関連技術1
 
僕がやったXaml戦略
僕がやったXaml戦略僕がやったXaml戦略
僕がやったXaml戦略
 
DSL駆動によるクラウド・アプリケーション開発
DSL駆動によるクラウド・アプリケーション開発DSL駆動によるクラウド・アプリケーション開発
DSL駆動によるクラウド・アプリケーション開発
 
はじめての人のためのDeep Learning
はじめての人のためのDeep Learningはじめての人のためのDeep Learning
はじめての人のためのDeep Learning
 
UMLだけじゃないもやもやを解消するモデリング技術の紹介 その2 Feature Model
UMLだけじゃないもやもやを解消するモデリング技術の紹介 その2 Feature ModelUMLだけじゃないもやもやを解消するモデリング技術の紹介 その2 Feature Model
UMLだけじゃないもやもやを解消するモデリング技術の紹介 その2 Feature Model
 
非技術者でもわかる(?)コンピュータビジョン紹介資料
非技術者でもわかる(?)コンピュータビジョン紹介資料非技術者でもわかる(?)コンピュータビジョン紹介資料
非技術者でもわかる(?)コンピュータビジョン紹介資料
 
第2回c#画像処理講習
第2回c#画像処理講習第2回c#画像処理講習
第2回c#画像処理講習
 
[DL輪読会]End-to-End Object Detection with Transformers
[DL輪読会]End-to-End Object Detection with Transformers[DL輪読会]End-to-End Object Detection with Transformers
[DL輪読会]End-to-End Object Detection with Transformers
 
Javaセキュアコーディングセミナー東京第1回 講義
Javaセキュアコーディングセミナー東京第1回 講義Javaセキュアコーディングセミナー東京第1回 講義
Javaセキュアコーディングセミナー東京第1回 講義
 
Di入門
Di入門Di入門
Di入門
 
DDD 20121106 SEA Forum November
DDD 20121106 SEA Forum NovemberDDD 20121106 SEA Forum November
DDD 20121106 SEA Forum November
 
Thinking in Cats
Thinking in CatsThinking in Cats
Thinking in Cats
 
設計/コンポーネント設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第22回】
設計/コンポーネント設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第22回】設計/コンポーネント設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第22回】
設計/コンポーネント設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第22回】
 
データモデルの更新を効率よく検証するの並列可能性
データモデルの更新を効率よく検証するの並列可能性データモデルの更新を効率よく検証するの並列可能性
データモデルの更新を効率よく検証するの並列可能性
 
機械学習デザインパターン Machine Learning Design Patterns
機械学習デザインパターン Machine Learning Design Patterns機械学習デザインパターン Machine Learning Design Patterns
機械学習デザインパターン Machine Learning Design Patterns
 
オブジェクト指向最強
オブジェクト指向最強オブジェクト指向最強
オブジェクト指向最強
 
CMSI計算科学技術特論A (2015) 第8回
CMSI計算科学技術特論A (2015) 第8回CMSI計算科学技術特論A (2015) 第8回
CMSI計算科学技術特論A (2015) 第8回
 
20120623 cv勉強会 shirasy
20120623 cv勉強会 shirasy20120623 cv勉強会 shirasy
20120623 cv勉強会 shirasy
 

Más de Kenta Hattori

オブジェクト指向入門2
オブジェクト指向入門2オブジェクト指向入門2
オブジェクト指向入門2Kenta Hattori
 
オブジェクト指向入門1
オブジェクト指向入門1オブジェクト指向入門1
オブジェクト指向入門1Kenta Hattori
 
オブジェクト指向入門10
オブジェクト指向入門10オブジェクト指向入門10
オブジェクト指向入門10Kenta Hattori
 
オブジェクト指向入門9
オブジェクト指向入門9オブジェクト指向入門9
オブジェクト指向入門9Kenta Hattori
 
オブジェクト指向入門7
オブジェクト指向入門7オブジェクト指向入門7
オブジェクト指向入門7Kenta Hattori
 
ソフトウェア・テスト入門2
ソフトウェア・テスト入門2ソフトウェア・テスト入門2
ソフトウェア・テスト入門2Kenta Hattori
 
ソフトウェア・テスト入門1
ソフトウェア・テスト入門1ソフトウェア・テスト入門1
ソフトウェア・テスト入門1Kenta Hattori
 
ソフトウェア・テスト入門8
ソフトウェア・テスト入門8ソフトウェア・テスト入門8
ソフトウェア・テスト入門8Kenta Hattori
 
ソフトウェア・テスト入門7
ソフトウェア・テスト入門7ソフトウェア・テスト入門7
ソフトウェア・テスト入門7Kenta Hattori
 
ソフトウェア・テスト入門6
ソフトウェア・テスト入門6ソフトウェア・テスト入門6
ソフトウェア・テスト入門6Kenta Hattori
 
ソフトウェア・テスト入門5
ソフトウェア・テスト入門5ソフトウェア・テスト入門5
ソフトウェア・テスト入門5Kenta Hattori
 
ソフトウェア・テスト入門4
ソフトウェア・テスト入門4ソフトウェア・テスト入門4
ソフトウェア・テスト入門4Kenta Hattori
 
ソフトウェア・テスト入門3
ソフトウェア・テスト入門3ソフトウェア・テスト入門3
ソフトウェア・テスト入門3Kenta Hattori
 
アルゴリズムとデータ構造15
アルゴリズムとデータ構造15アルゴリズムとデータ構造15
アルゴリズムとデータ構造15Kenta Hattori
 
アルゴリズムとデータ構造14
アルゴリズムとデータ構造14アルゴリズムとデータ構造14
アルゴリズムとデータ構造14Kenta Hattori
 
アルゴリズムとデータ構造13
アルゴリズムとデータ構造13アルゴリズムとデータ構造13
アルゴリズムとデータ構造13Kenta Hattori
 
アルゴリズムとデータ構造12
アルゴリズムとデータ構造12アルゴリズムとデータ構造12
アルゴリズムとデータ構造12Kenta Hattori
 
アルゴリズムとデータ構造11
アルゴリズムとデータ構造11アルゴリズムとデータ構造11
アルゴリズムとデータ構造11Kenta Hattori
 
アルゴリズムとデータ構造10
アルゴリズムとデータ構造10アルゴリズムとデータ構造10
アルゴリズムとデータ構造10Kenta Hattori
 
アルゴリズムとデータ構造9
アルゴリズムとデータ構造9アルゴリズムとデータ構造9
アルゴリズムとデータ構造9Kenta Hattori
 

Más de Kenta Hattori (20)

オブジェクト指向入門2
オブジェクト指向入門2オブジェクト指向入門2
オブジェクト指向入門2
 
オブジェクト指向入門1
オブジェクト指向入門1オブジェクト指向入門1
オブジェクト指向入門1
 
オブジェクト指向入門10
オブジェクト指向入門10オブジェクト指向入門10
オブジェクト指向入門10
 
オブジェクト指向入門9
オブジェクト指向入門9オブジェクト指向入門9
オブジェクト指向入門9
 
オブジェクト指向入門7
オブジェクト指向入門7オブジェクト指向入門7
オブジェクト指向入門7
 
ソフトウェア・テスト入門2
ソフトウェア・テスト入門2ソフトウェア・テスト入門2
ソフトウェア・テスト入門2
 
ソフトウェア・テスト入門1
ソフトウェア・テスト入門1ソフトウェア・テスト入門1
ソフトウェア・テスト入門1
 
ソフトウェア・テスト入門8
ソフトウェア・テスト入門8ソフトウェア・テスト入門8
ソフトウェア・テスト入門8
 
ソフトウェア・テスト入門7
ソフトウェア・テスト入門7ソフトウェア・テスト入門7
ソフトウェア・テスト入門7
 
ソフトウェア・テスト入門6
ソフトウェア・テスト入門6ソフトウェア・テスト入門6
ソフトウェア・テスト入門6
 
ソフトウェア・テスト入門5
ソフトウェア・テスト入門5ソフトウェア・テスト入門5
ソフトウェア・テスト入門5
 
ソフトウェア・テスト入門4
ソフトウェア・テスト入門4ソフトウェア・テスト入門4
ソフトウェア・テスト入門4
 
ソフトウェア・テスト入門3
ソフトウェア・テスト入門3ソフトウェア・テスト入門3
ソフトウェア・テスト入門3
 
アルゴリズムとデータ構造15
アルゴリズムとデータ構造15アルゴリズムとデータ構造15
アルゴリズムとデータ構造15
 
アルゴリズムとデータ構造14
アルゴリズムとデータ構造14アルゴリズムとデータ構造14
アルゴリズムとデータ構造14
 
アルゴリズムとデータ構造13
アルゴリズムとデータ構造13アルゴリズムとデータ構造13
アルゴリズムとデータ構造13
 
アルゴリズムとデータ構造12
アルゴリズムとデータ構造12アルゴリズムとデータ構造12
アルゴリズムとデータ構造12
 
アルゴリズムとデータ構造11
アルゴリズムとデータ構造11アルゴリズムとデータ構造11
アルゴリズムとデータ構造11
 
アルゴリズムとデータ構造10
アルゴリズムとデータ構造10アルゴリズムとデータ構造10
アルゴリズムとデータ構造10
 
アルゴリズムとデータ構造9
アルゴリズムとデータ構造9アルゴリズムとデータ構造9
アルゴリズムとデータ構造9
 

オブジェクト指向入門6

  • 2. 2011/3/17 オブジェクト指向プログラミング入門 6 2 オブジェクトとは何か?  上の定義以外の見方  外界のシステムに見られる「オブジェクト」  例:グラフィックスシステム  点,線,面,立体, etc  例:給与計算システム  従業員,給与小切手,給与体系  オブジェクト指向によって,外界のシステムを自然にモデル化 できる  あるクラスは問題領域における外界のオブジェクトの型のモデルを 意味する.  ただし,すべてのクラスが問題領域のオブジェクト型に対応すると は限らない. オブジェクトは何らかのクラスの実行時のインスタンスである. 定義:オブジェクト
  • 3. 2011/3/17 オブジェクト指向プログラミング入門 6 3 基本形式  O をオブジェクトとする.オブジェクトは何らかのクラス C の 直接インスタンスである.  C は O の生成クラス,あるいは,単にジェネレータと呼ばれる .  C はソフトウェアテキスト, O は実行時のデータ構造である.  オブジェクトの形式はクラスが持つ属性によって決まる.  オブジェクトはフィールドフィールド(個々の属性について1つずつ用意 されている要素)の集合に過ぎない.  例:クラス POINT class POINT feature x, y: REAL … …ルーチンの宣言 end 3.4 -8.09 x y P_OBJ (POINT)
  • 4. 2011/3/17 オブジェクト指向プログラミング入門 6 4 単純なフィールド  基本型  BOOLEAN  それぞれの論理値の真と偽を表すインスタンスを2つだけ持つ  True および False  CHARACTER  インスタンスは文字を表す  ‘A’ のように一重引用符でその文字を囲む  STRING (実は参照型)  インスタンスは有限の長さの文字列を表す  “A STRING” のように文字の並びを二重引用符で囲む  INTEGER  インスタンスは整数を表す  34, -675, +4 など  REAL および DOUBLE  インスタンスは単精度および倍精度の浮動小数を表す  3.5, -0.05 など. DOUBLE の場合は, -5.e-2 のような表記も可能  基本型のインスタンスはコンピュータ上で効率的に実装される定義済 み集合から値を取り出す
  • 5. 2011/3/17 オブジェクト指向プログラミング入門 6 5 本の単純な概念  例:クラス BOOK1 class BOOK1 feature title: STRING date, page_count: INTEGER end  典型的なインスタンスの例:  レコードや構造型と違い,以下のようにフィールドに値を割当 てることはできない b1: BOOK1 … b1.page_count := 355 “The Red and the Black” 1830 title date (BOOK1) 341page_count
  • 6. 2011/3/17 オブジェクト指向プログラミング入門 6 6 著者  例:クラス WRITER class WRITER feature name, real_name: STRING birth_year, death_year: INTEGER end  インスタンスの例: “Stendhal” “Henri Beyle” name real_name (WRITER) 1842 birth_year death_year 1783
  • 7. 2011/3/17 オブジェクト指向プログラミング入門 6 7 サブオブジェクト  本には著者があるという特徴を表現したい  本のクラス BOOK2 の中にそれ自体がオブジェクトである フィールド author を設ける  例:サブオブジェクト「著者」を持つ 2 つの「本」オブジェク ト “The Red and the Black” 1830 title date 341page_count “Life of Rossini” 1830 title date 341page_count (BOOK2) (BOOK3) “Stendhal” “Henri Beyle” name real_name (WRITER) 1842 birth_year death_year 1783 “Stendhal” “Henri Beyle” name real_name (WRITER) 1842 birth_year death_year 1783 author author
  • 8. 2011/3/17 オブジェクト指向プログラミング入門 6 8 サブオブジェクトの問題点  メモリ領域の無駄  例えば,人を表すオブジェクトを考えたとき,そ れぞれは市民権を持っている国を表すサブオブ ジェクトを持っているとする.表現される人の数 は多いが国の数は少ない  共有共有( sharing )を表現できない  2つのオブジェクトの author フィールドは WRITER の同じインスタンスを参照す る. WRITER オブジェクトが更新されたら,そ の変更がその著者の関係するすべての本に反映さ れるようにしたい
  • 9. 2011/3/17 オブジェクト指向プログラミング入門 6 9 参照(1)  例:同じ「著者」オブジェクトへの参照を含む 2 つ の「本」オブジェクト “The Red and the Black” 1830 title date (BOOK3) 341page_count “The Red and the Black” 1830 title date (BOOK3) 341page_count “Stendhal” “Henri Beyle” name real_name (WRITER) 1842 birth_year death_year 1783 author author
  • 10. 2011/3/17 オブジェクト指向プログラミング入門 6 10 参照(2)  void の参照フィールドがあるオブジェクト 参照とは実行時に void (無効)かアタッチ状態( attached )かのいずれか の値をとる. アタッチ状態の場合,参照は1つのオブジェクトを示す(その場合,その参 照はその特定のオブジェクトにアタッチされているという). 定義:参照 “Candide, or Optimism” 1759 title date (BOOK3) 120 author page_count
  • 11. 2011/3/17 オブジェクト指向プログラミング入門 6 11 オブジェクトのアイデンティティ  オブジェクト指向システムの実行中に作成さ れるオブジェクトには,そのフィールドに よって定義されるオブジェクトの値とは無関 係の,唯一のアイデンティティがある.  アイデンティティの異なる2つのオブジェクトに 同一のフィールドが含まれている場合がある  反対に,特定のオブジェクトのフィールドがシス テムの実行中に変わる可能性がある.だからと いって,そのオブジェクトのアイデンティティは 変わらない.
  • 12. 2011/3/17 オブジェクト指向プログラミング入門 6 12 参照の宣言  クラス BOOK3 の定義 class BOOK3 feature title: STRING date, page_count: INTEGER author: WRITE -- これが新しい属性 end  クラスが次のような標準的な形式で宣言されているときには必 ず, class C feature … end 次の形式の宣言によって C 型と宣言されたすべてのエンティ ティは x: C C 型のオブジェクトへの参照である値を表す
  • 13. 2011/3/17 オブジェクト指向プログラミング入門 6 13 自己参照  対応するクラス間の顧客関係にも循環がある class PERSON1 feature name: STRING loved_one, landlord: PERSON1 end “Almaviva”name landlord (PERSON1) loved_one “Figaro”name landlord (PERSON1) loved_one “Susanna” name landlord (PERSON1) loved_one
  • 14. 2011/3/17 オブジェクト指向プログラミング入門 6 14 実行時のオブジェクト構造  実行時のオブジェクト構造が複雑だからといって,必ずしも, ソフトウェアそのもの,すなわち,クラス間の関係が複雑とは 限らない.  クラス間の関係はむしろできる限り単純にするように心がける べき 27 “Raphael” True 897 3.5 “Sarah” -62 “Caroline” ‘Z’ (TYPE1) (TYPE1) (TYPE4) (TYPE3) (TYPE5) (TYPE2) ルート
  • 15. 2011/3/17 オブジェクト指向プログラミング入門 6 15 モデリングツールとしてのオブジェ クト  ソフトウェア開発における4つの世界  モデル化される側のシステム  オブジェクトの型とその抽象的な関係によって記述され る  外界システムの特定の具体例  関係する可能性のあるオブジェクト(もの)から構成さ れる  ソフトウェアシステム  オブジェクト指向の関係(顧客と継承)によって結び付 けられたクラスから構成される  オブジェクト構造  参照によって結び付けられたソフトウェアオブジェクト から構成される
  • 16. 2011/3/17 オブジェクト指向プログラミング入門 6 16 4つの世界の対応 抽象データ型 クラス モデル オブジェクト (ソフトウェア) オブジェクト 鋳型 実体(インスタンス) 抽象 具象 実装する インスタンス である
  • 17. 2011/3/17 オブジェクト指向プログラミング入門 6 17 オブジェクトと参照を操作する  柔軟なデータ構造を作成し,利用できるようにする ために,オブジェクト指向によるソフトウェアシス テムがオブジェクトをどのように扱うのか  動的な作成と再アタッチメント  実行時に必要に応じてオブジェクトをシステムに作らせる  最初の状態はオブジェクトが 1 つだけ(ルートオブジェク ト)作られる  新しいオブジェクトを作成する  void だった参照をオブジェクトにアタッチする  参照を void にする  すでにアタッチされていた参照を他のオブジェクトにア タッチする
  • 18. 2011/3/17 オブジェクト指向プログラミング入門 6 18 生成命令  単純な形式の生成命令: create x  x は生成命令のターゲットと呼ばれる  BOOK3 クラスの顧客クラス QUOTATION の例: class QUOTATION feature source: BOOK3 page: INTEGER make_book is do create source end end  すべてのフィールドはデフォルトで初期化される
  • 19. 2011/3/17 オブジェクト指向プログラミング入門 6 19 生成命令(2) ターゲット x の型がクラス C に基づいた参照型であるとき, create x とい う形式の生成命令の効果は次の3つのステップを実行することである. C1 ● C の新しいインスタンス( C の個々の属性に対して1つずつ作られる フィールドの集合から構成される)を作成する. OC を新しいインスタンス とする C2 ● 標準のデフォルト値に従って OC の個々のフィールドを初期化する C3 ● x の参照値を OC にする.すなわち x に OC をアタッチする 基本生成命令の効果 参照値のデフォルト値は void である BOOLEAN 値のデフォルト値は False である CHARACTER 値のデフォルト値はヌルキャラクタである 数値( INTEGER 型, REAL 型, DOUBLE 型)のデフォルト値はゼロ(す なわち,適切な型の値ゼロ)である デフォルトの初期値
  • 20. 2011/3/17 オブジェクト指向プログラミング入門 6 20 なぜ明示的な生成が必要なのか?  生成と宣言は区別される b: BOOK3 -- 宣言(オブジェクトは作られない) create b -- 生成(オブジェクトが生成される)  宣言時にオブジェクトが生成されたとしたら...  オブジェクトを 1 つ生成するためにたくさんのオブジェク トが生成されてしまう  特に自己参照クラスの場合,無限ループに陥る  void 参照や1つのオブジェクトに複数の参照をアタッチす る余地がなくなってしまう  フィールドが作られるたびにオブジェクトを作成するのは意 味がない
  • 21. 2011/3/17 オブジェクト指向プログラミング入門 6 21 生成プロシージャ  デフォルトの初期化以外の初期化をするためには,そのクラス に1つ以上の生成プロシージャを記述する  生成プロシージャとは, feature 句の前のキーワード creation で 始まる句に列挙するプロシージャ indexing … class C creation p1, p2, … feature … プロシージャ p1, p2 …の宣言を含む特性宣言 end  生成命令は以下のようになる create x.p(…)
  • 22. 2011/3/17 オブジェクト指向プログラミング入門 6 22 クラス POINT の例 class POINT1 creation make_cartesian, make_polar feature … 前のバージョンに記述されている特性 : x, y, ro, theta, translate, scale, … feature {NONE} make_cartesian(a,b: REAL) is do x := a; y := b end make_polar(r,t: REAL) is do x := r*cos(t); y := r*sin(t) end end -- クラス POINT1  顧客は次のような命令で点を生成する create my_point.make_cartesian(0, 1) create my_point.make_polar(1, Pi/2)
  • 23. 2011/3/17 オブジェクト指向プログラミング入門 6 23 生成呼び出しの効果  最初の3つのステップは,基本生成命令と同 じ create x.p(…) という形式の生成呼び出しを実行すると,次の4つのステッ プが実行される.ただし,ターゲット x の型はクラス C に基づいた参照型で あり, p はクラス C の生成プロシージャであり, (…) は必要ならば指定す べき,このプロシージャの実引数の有効な並びを表す. C1 ● C の新しいインスタンス( C の個々の属性に対して1つずつ作られる フィール     ドの集合から構成される)を作成する.この新しいインスタンスを OC と呼ぶこと     にする. C2 ● 標準のデフォルト値に従って OC の各フィールドを初期化する. C3 ● x の値(参照)を OC にアタッチする. C4 ● 与えられた引数とともに OC に対してプロシージャ p 呼び出す. 生成呼び出しの効果
  • 24. 2011/3/17 オブジェクト指向プログラミング入門 6 24 生成プロシージャのエクスポートス テータス  POINT1 の2つの生成プロシージャは feature {NONE} で始まる特性句で宣言されており,通常の 呼び出しに対しては非公開である.  my_point.make_cartesian(0,1) や my_point.make_polar(1, Pi/2) という呼び出しは不正  一度生成した点オブジェクトの座標を顧客に直接設定させ ないようにするため.  生成プロシージャの選択的な公開を設定することも 可能 class C creation {A, B, …} p1, p2, …
  • 25. 2011/3/17 オブジェクト指向プログラミング入門 6 25 生成プロシージャに関する規則  create x という基本形式と create x.p(…) という生 成呼び出しの2つの形式の生成命令は互いに排他的 である.  クラスの中に creation 句が現れたら,許されるのは生成呼 び出しだけで基本形式は無効.  コンパイラによって拒絶される  オブジェクトの一貫性のため  生成命令は常に一貫したオブジェクトを生成しなければなら ない  呼び出しのない create x という基本形式の生成命令が許され るのは,すべてのフィールドにデフォルト値を設定すること で一貫したオブジェクトが生成される場合だけ.
  • 26. 2011/3/17 オブジェクト指向プログラミング入門 6 26 複数の生成プロシージャと多重定 義  C++ や Java では,生成プロシージャ(「コ ンストラクタ」)はすべて同じ名前であり, クラス名そのものである.  2つのコンストラクタを区別するにはシグネチャ (引数の型)で区別するしかない  make_cartesian と make_polar に相当するコンス トラクタを同時に定義できない...
  • 27. 2011/3/17 オブジェクト指向プログラミング入門 6 27 参照の状態  参照は void かアタッチされているかの2つの状態のいずれかで ある.  オブジェクト  実行時の概念.すべてのオブジェクトはある特定のクラスのイ ンスタンスで,実行時作成され,いくつかのフィールドから構 成される  参照  実行時の概念.参照は void かオブジェクトにアタッチされてい るかのいずれかの値である.  エンティティ  静的な概念.クラステキストに現れる識別子である. VOID STATE ATTACHED STATE create b b := c (c がアタッチされてる ) b := Void b := c (c が void)
  • 28. 2011/3/17 オブジェクト指向プログラミング入門 6 28 void の参照と呼び出し  ターゲットが void の特性呼び出しを実行しようとすると例外例外( exception )が 発生する  コンパイラでチェックすることは非現実的  void のターゲットに対して特性呼び出しをしないことを保証するのはプログラマの責 任  簡単な方法 if x /= Void then x.f(…) else … end  ただし,すべての特性呼び出しに対して上記のように書くのは荷が重過ぎる  システムが正確であることを証明するには以下を証明する必要がある  void の参照に適用される呼び出しが全く無いこと  すべての表明(後の章で説明)が対応する実行時の瞬間に満たされていること  ソフトウェアを守る方法  ソフトウェアを書くときは,誤った状況が実行時に発生するのをあらゆる手段を使っ て防ぐ必要がある(注意深く開発する.クラスを検査する,チェックツールを使用す る)  何らかの疑問が残っていて,同時に実行時の失敗が許されない場合,例外を処理する ための用意をソフトウェアに備えておく
  • 29. 2011/3/17 オブジェクト指向プログラミング入門 6 29 参照についてのその他の操作  参照をオブジェクトにアタッチする class PERSON2 feature name: STRING loved_one, landlord: PERSION2 set_loved(l: PERSION2) is do loved_one := l end end  a.set_loved(r) の実行 “Almavia” “Susanna” “Rosina” r (PERSON2) (PERSON2)(PERSON2) O1 O2 O3 name landlord loved_one name landlord loved_one name landlord loved_one a
  • 30. 2011/3/17 オブジェクト指向プログラミング入門 6 30 参照の比較  等号演算子 = を使う(逆の演算子は /= )  x=y が真になるのは,対応する参照が共に void であるか,同じオブジェクトにアタッチ されている場合だけ  参照を比較するのであって,オブジェクトを 比較するのではない  x と y が全く別のオブジェクトにアタッチされて いれば,たとえそれらのオブジェクトのフィール ドが全く一致していたとしても, x=y の値は偽と なる
  • 31. 2011/3/17 オブジェクト指向プログラミング入門 6 31 void という値  定義済みの特性 Void  特定の参照が void かどうかテストする if x = Void then …  void の参照を作る x := Void x x O1 O1
  • 32. 2011/3/17 オブジェクト指向プログラミング入門 6 32 オブジェクトのクローニングと一 致  オブジェクトの新しいコピーを作る x := clone(y)  オブジェクトの内容を比較する equal(x,y) 783 ‘A’ 783 ‘A’ 783 ‘A’ y y x OY OY OX
  • 33. 2011/3/17 オブジェクト指向プログラミング入門 6 33 オブジェクトのコピー  すでにあるオブジェクトのフィールドに上書 きしたい場合 x.copy(y)  y にアタッチされているオブジェクトの フィールドが x に対応するフィールドにコ ピーされる  x も y も void であってはならない
  • 34. 2011/3/17 オブジェクト指向プログラミング入門 6 34 深いクローニングと比較 “Almaviva”name landlord (PERSON1) loved_one name landlord (PERSON1) loved_one name landlord (PERSON1) loved_one “Figaro” “Figaro” O2 O1 O3 a “Almaviva”name landlord (PERSON1) loved_one name landlord (PERSON1) loved_one name landlord (PERSON1) loved_one “Figaro” “Figaro” O6 O5 O7 “Almaviva”name landlord loved_one O4 b b := a c c := clone(a) d d := deep_clone(a) 同様に deep_equal(x,y) もある
  • 35. 2011/3/17 オブジェクト指向プログラミング入門 6 35 深い記憶:永続性について  参照を含むオブジェクトに対するストレージと復元 をどうすべきか?  オブジェクトにアタッチされている参照はそのオブジェク トなしでは価値がない オブジェクトの直接依存オブジェクトとは,そのオブジェクトの参照フィー ルドにアタッチされているオブジェクトがあれば,そのオブジェクトのこと をいう. オブジェクトの依存オブジェクトは,そのオブジェクト自身と,(再帰的に 関係をたどっていった)そのオブジェクトの直接依存オブジェクトの依存オ ブジェクトである. 定義:直接依存オブジェクトと依存オブジェクト ストレージメカニズムによってオブジェクトを保存するときには必ずそのオ ブジェクトの依存オブジェクトも一緒に保存しなければならない.保存され ているオブジェクトを復元メカニズムによって取り出すとき,そのオブジェ クトのまだ取り出されていない依存オブジェクトがある場合には,必ずそれ らも取り出さなければならない. 永続性の閉鎖の原則
  • 36. 2011/3/17 オブジェクト指向プログラミング入門 6 36 STORABLE クラス  STORABLE の基本的な特性の形式  store(f: IO_MEDIUM)  x.store(f) という形式の呼び出しを実行すると, x にア タッチされているオブジェクトがそのすべての依存オブ ジェクトと一緒に f に関連付けられているファイルに保 存される  x の生成クラスは STORABLE の子孫でなければならな い  x にアタッチされているオブジェクトをその保存される 構造の先頭オブジェクト( head object )という.  retrieved(f: IO_MEDIUM): STORABLE  retrieved(f) の結果として,前の store 呼び出しによって f に保存された完全なオブジェクト構造と同一なオブ ジェクト構造が得られる
  • 37. 2011/3/17 オブジェクト指向プログラミング入門 6 37 複合オブジェクトと拡張型  実行時の値が C のインスタンスそのものであるエンティティ x が必要 な場合,次のように宣言する x: expanded C  あるオブジェクト O の1つまたは複数のフィールド自体がオブジェク ト( O のサブオブジェクトと呼ばれる)であるとき, O は複合オブ ジェクトであるという  複合オブジェクトの書き方: class COMPOSITE feature ref: C sub: expanded C end (C) (C) (COMPOSITE) ref sub
  • 38. 2011/3/17 オブジェクト指向プログラミング入門 6 38 拡張型  拡張クラス expanded class E feature … end  E 型として宣言されるエンティティはすべて拡張 型になる 次のような2つの場合,その型は拡張型である  ● expanded C という形式である  ● E という形式である.ただし, E は拡張クラスである. 定義:拡張型
  • 39. 2011/3/17 オブジェクト指向プログラミング入門 6 39 拡張型の役割  効率性を向上させる  より良いモデル化を可能にする  以下の属性宣言がクラス C の中にあるとする D1 ● ref: S D2 ● exp: expanded S  D1 の宣言は C のすべてのインスタンスは S の特定のイン スタンスについて「知っている」を表している  共有を許す  D2 の宣言は C のすべてのインスタンスは S のインスタン スを1つ「含む」ということを表している  共有を許さない  統一されたオブジェクト指向的型体系の中での基本 型をサポートする
  • 40. 2011/3/17 オブジェクト指向プログラミング入門 6 40 オブジェクト間の「知っている」と いう関係と「含む」という関係 class WORKSTATION feature k: expanded KEYBOARD c: expanded CPU m: expanded MONITOR n: NETWORK … end (NETWORK) KEYBOARD1 CPU1 MONITOR1 k c m n KEYBOARD1 CPU1 MONITOR1 k c m n KEYBOARD1 CPU1 MONITOR1 k c m n (WORKSTATION) (WORKSTATION) (WORKSTATION)「集約」と いう関係を 表現してい る
  • 41. 2011/3/17 オブジェクト指向プログラミング入門 6 41 拡張型の性質  E 型の拡張エンティティ x について  x の値は常にオブジェクトなので,絶対に void にはならな い  x = Void の結果は常に偽になる  クラス D に expanded C 型の属性が含まれている 場合,クラス C は expanded D 型の属性を持つこ とはできない 「拡張顧客」は次のように定義されたクラス間の関係であるとする.すなわ ち, C のいずれかの属性が S に基づく拡張型である(つまり, expanded S であるか, S が拡張クラスである場合には単に S )ならば, C は S の拡張 顧客である. したがって,拡張顧客という関係に循環が含まれることがあってはならない . 拡張顧客の規則
  • 42. 2011/3/17 オブジェクト指向プログラミング入門 6 42 サブオブジェクトへの参照はだめ  実装の側面  ガーベッジコレクションが効率良く実装できる  モデリングの視点  システム記述を単純化することになる (C) (E) (COMPOSITE1) other sub ref x y OE OC O_CMP1
  • 43. 2011/3/17 オブジェクト指向プログラミング入門 6 43 アタッチメント:参照と値の意味  アタッチメント x := y の効果 ソース y の型→ ↓ ターゲット x の型 参照型 拡張型 参照型 参照のアタッチメ ント クローン. x := clone(y) の効 果 拡張型 コピー. x.copy(y) の効果 ( y が void なら失 敗) コピー. x.copy(y) の効果
  • 44. 2011/3/17 オブジェクト指向プログラミング入門 6 44 アタッチメント:参照と値の意味  比較 x = y の意味 y の型→ ↓x の型 参照型 拡張型 参照型 参照の比較 equal(x,y) x が void でない場合はオブ ジェクトの比較で, x が void の場合は偽 拡張型 equal(x,y) y が void でない場合はオブ ジェクトの比較で, y が void の場合は偽 equal(x,y) オブジェクトの比較
  • 45. 2011/3/17 オブジェクト指向プログラミング入門 6 45 参照の利点と危険  参照型の代入によって同じオブジェクトに別名が付 けられる(動的別名付け)  思わぬ影響を及ぼす可能性がある -- y.boolattr は偽とする x := y -- y.boolattr は偽 x.set_true -- y.boolattr は真!  動的別名付けとうまく折り合う  複雑なデータ構造を記述するには参照の代入が必要  カプセル化によって参照の操作の危険を避けられる
  • 46. 次回予定  日時: 2011年3月24日(木)13: 00~14:30  場所: LB 2F/A 会議室  内容:総称性 2011/3/17 オブジェクト指向プログラミング入門 6 46