SlideShare a Scribd company logo
1 of 33
オブジェクト指向
プログラミング入門
ソフトウェア基礎講座 第 1 回
2011年2月9日
服部健太
オブジェクト指向とは
 “Object” は最も汎用的な英単語
 認識できるすべてのものはオブジェクトである
 要するにほとんど何の意味もない
 オブジェクト指向の決定的な定義はない
 いろいろな人がいろいろなことを言ってる
2011/2/9 オブジェクト指向プログラミング入門 1 2
2011/2/9 オブジェクト指向プログラミング入門 1 3
オブジェクト指向の重要な特徴
 カプセル化( Encapsulation )
 情報 / 実装の隠蔽( Information/implementation
hiding )
 状態保持( State retention )
 オブジェクトの固有性( Object identity )
 メッセージ( Messages )
 クラス( Classes )
 継承( Inheritance )
 多態性( Polymorphism )
 総称性( Genericity )
2011/2/9 オブジェクト指向プログラミング入門 1 4
カプセル化( Encapsulation )
 カプセル化の概念はソフトウェアと同じくらい古い
 1940 年くらいには,プログラマ達は同じような命
令のパターンが同じプログラムに何度も現れること
に気づいた
 人々は,そのような繰返しパターンはプログラムの
隅っこの箱の中に閉じ込めておき,メインプログラ
ムの異なる場所から単一の名前単一の名前で呼び出し得ること
を理解した
⇒  こうしてサブルーチン( subroutine )が発明されたカプセル化とは,関連する概念を一つのユ
ニットにグループ化し,それ以後,単一の名
前で参照できるようにすることである
2011/2/9 オブジェクト指向プログラミング入門 1 5
サブルーチン( Subroutine )
 サブルーチンは当時の貴重なメモリを節約する良い
手段だった
 後に人々は,人間の記憶も節約できることに気づい
た
 人が単一の観念として捉え,操作できる概念の塊として表
される
月々のローン
返済額の計算
元金
ローン期間
利率
返済額
ローンの許可
入力変数
出力変数サブルーチン
コードはサブルーチン
の中にカプセル化され
る
2011/2/9 オブジェクト指向プログラミング入門 1 6
オブジェクト指向におけるカプセル
化
 オブジェクト指向におけるカプセル化の目的もサブ
ルーチンのそれと同じ
 ただし,構造的にはより洗練されている
オブジェクト指向におけるカプセル化とは,
データを取り巻く手続きをグループ化したも
のである
direction
location
set-in-grid
turn-left
turn-right
advance location
facing-wall
display
メソッ
ド
変数
2011/2/9 オブジェクト指向プログラミング入門 1 7
オブジェクト指向におけるオブジェ
クト
 複数のメソッドと複数の変数から構成される
 変数はオブジェクトのメソッドからアクセス
され更新される
 それぞれの変数は非公開であり,他のオブ
ジェクトは変数に直接アクセスすることはで
きない
 他のオブジェクトがそのオブジェクトの変数の情
報が必要なら,そのオブジェクトのメソッドにお
願いしてアクセスする
2011/2/9 オブジェクト指向プログラミング入門 1 8
情報 / 実装の隠蔽
( Information/Implementation
Hiding ) カプセル化されたユニットは外( public view )と
内( private view )から眺めることができる
 良いカプセル化に対する報酬はプライベートビュー
に見られる無数のこまごまとしたことを,パブリッ
クビューでは伏せておけることである
 情報の隠蔽と実装の隠蔽
情報 / 実装の隠蔽とは,カプセル化された構
造の内側にある特定の情報や実装上の決定に
ついて,外部への見せ方を制限することであ
る
2011/2/9 オブジェクト指向プログラミング入門 1 9
情報 / 実装隠蔽によるオブジェクト
のブラックボックス化
 外部の観察者は,オブジェクトが何( what )がで
きるかについては知っている
 オブジェクトがどのように( how )するのか,中
がどうなってるのか,についてはまったく知らない
 情報 / 実装隠蔽の2つの利点
 設計上の決定を局所化する
 情報の内容を表現の形式と分離する
set-in-grid
turn-left
turn-right
advance location
facing-wall
display
2011/2/9 オブジェクト指向プログラミング入門 1 10
状態の保持( State Retention )
 オブジェクトは状態を保つことができる
 伝統的な手続きモジュール(関数,副プログラム
,手続き,など)では,呼び出し元に戻ってその
モジュールが終了すると,結果だけが残る
 同じモジュールが再び呼ばれても,あたかも最初
に呼び出されたかのように生み出される
 オブジェクトは情報をそれ自身の中に無期限
に保持する
2011/2/9 オブジェクト指向プログラミング入門 1 11
抽象データ型( ADT )
 カプセル化,情報 / 実装隠蔽,状態の保持は
,オブジェクト指向の核ではあるが,新しい
アイディアではない
 計算機科学者たちは,それらを抽象データ型の分
野として何年もの間,研究してきた
 オブジェクト指向は ADT よりさらに進んで
,以降に示すような特徴を持つ
2011/2/9 オブジェクト指向プログラミング入門 1 12
オブジェクトの固有性( Object
Identity )
 オブジェクト指向の決定的な特徴は,それぞれのオ
ブジェクトが固有のアイデンティティを持つことに
ある
 仲間のオブジェクトと区別するための何かユニーク
なものがある
 オブジェクトハンドル機構によって提供される
オブジェクトの固有性とは,各オブジェクト
が異なるソフトウェア実体として識別され,
扱われるという特性である
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
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;
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
2011/2/9 オブジェクト指向プログラミング入門 1 16
メッセージ( Messages )
 オブジェクトは別のオブジェクトに対して,
メッセージによってアクティビティを遂行す
る
 典型的なメッセージでは,一つのオブジェク
トから別のオブジェクトに対して何らかの情
報を運ぶメッセージは送信者オブジェクト ob1 があて
先オブジェクト ob2 に対して, ob2 がそのメ
ソッドの一つに適用するための要求物を運ぶ
手段である
2011/2/9 オブジェクト指向プログラミング入門 1 17
メッセージの構造
 Ob1 が ob2 にメッセージを送るには, ob1 は以下の3つを知っ
てる必要がある
 Ob2 のハンドル
 Ob2 のメソッド名
 Ob2 がメソッド実行に必要とする追加的な情報(引数)
 メッセージ送信の例:
hom1.turn-left;
 オブジェクトにお願いする
 伝統的な手続き(関数)呼び出しと逆になってる
call turn-left(hom1);
 手続きユニットにお願いする
 多態,オーバロード,動的束縛を議論するとき,この逆転は実
際上重要な違いをもたらす
2011/2/9 オブジェクト指向プログラミング入門 1 18
メッセージ引数
hom1.advance(no-of-squares; advance-ok)
 純粋なオブジェクト指向環境では,メッセージの引
数はオブジェクトのハンドルである
あて先オブジェクト
メソッド名
入力引数 出力引数
シグネチャ
メッセージ
2011/2/9 オブジェクト指向プログラミング入門 1 19
メッセージにおけるオブジェクトの
役割
 メッセージの送信者
 メッセージのあて先
 別のオブジェクトの中の変数から指されるも
の
 メッセージの引数から指されるもの
method
2011/2/9 オブジェクト指向プログラミング入門 1 20
メッセージの種類
 情報メッセージ(過去指向)
 オブジェクトに情報を提供し,更新させる
 例: hom1.set-in-grid
 質問メッセージ(現在指向)
 オブジェクトの情報を明かすように要求する
 例: hom1.location
 命令メッセージ(未来指向)
 オブジェクトにあるアクションをするように要求
する
 例: hom1.advance
2011/2/9 オブジェクト指向プログラミング入門 1 21
クラス( Classes )
 クラスとオブジェクトの違い
 クラスはあなたが設計しプログラムするもの
 オブジェクトとはあなたが実行時に(クラスか
ら)生成しようとするもの
クラスとは,そこからオブジェクトが生成
(具体化)される雛形である.各オブジェク
トはそれの生成元であるクラスと同じ構造と
振る舞いを持つ
オブジェクト ob がクラス C に属するとき,
「 ob は C のインスタンスである」と言う
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
・・・
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
クラス変
数
クラス
メソッ
ド
インスタン
ス
メソッド
インス
タンス
変数
2011/2/9 オブジェクト指向プログラミング入門 1 24
継承( Inheritance )
 クラス C を書いた後で,いくつかのメソッドを除い
てほとんど同じようなクラス D が必要だとわかった
らどうする?
 コピペコードはメンテナンス上よろしくない
( D による C からの)継承とは,クラス D
のオブジェクトがクラス C のオブジェクトに
利用可能なメソッドと変数を,あたかも D で
定義されたメソッドや変数のように使えるよ
うにする機能のことである.
C は D のスーパークラスと呼ばれる. D は C
のサブクラスである.
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()
2011/2/9 オブジェクト指向プログラミング入門 1 26
is-a 関係
 継承関係が適切かチェックする
 「 D は C である」と言えるなら, D はほぼ
確実に C のサブクラスである
 グライダーは航空機である (A glider is an aircraft)
2011/2/9 オブジェクト指向プログラミング入門 1 27
単一継承と多重継承
 多重継承では,単一継承における継承木が継
承格子( lattice )となる
 多重継承は設計上の困難な問題をもたらす
AIRCRAFT PASSENGER
-VEHICLE
PASSENGER
-AIRCRAFT
2011/2/9 オブジェクト指向プログラミング入門 1 28
多態性( Polymorphism )
 ありがちな例
(a) 多態性とは,単一のメソッド名が複数の
クラス上で定義され,それらのクラスにおい
て異なる実装を取りうる機能である
(b) 多態性とは,一つの変数が異なる時点の
異なるクラスを指すことによる特徴である.
POLYGON
area()
TRIANGLE
area()
RECTANGLE
area()
HEXAGON
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 のどちらか
動的束縛(実行時束縛や遅延束縛ともいう)
とは,実際に実行されるべきコードを(コン
パイル時ではなく)実行時に決める技術であ
る
オーバーライドとオーバーロード
 オーバーライド( overriding )
 クラス C で定義されたメソッドを C のサブクラスの
中で再定義すること
 オーバーロード( overloading )
 同一のクラス上に定義されたいくつかのメソッド(や
演算子)が同じ名前やシンボルを持つとき,名前やシ
ンボルがオーバーロードされたという
 多態性と関連した概念だが,オーバーライドとごっ
ちゃにしないこと
 メソッドのどのコードが実行されるかはシグネチャに
よって決まる
product1.mark-down()
product1.mark-down(huge-percentage)
2011/2/9 オブジェクト指向プログラミング入門 1 30
総称性( Genericity )
 コードをコピペしなくても済む技術
2011/2/9 オブジェクト指向プログラミング入門 1 31
総称性とは,あるクラス C を,1つかそれ以
上のクラスとして実行時(クラス C のオブ
ジェクトがインスタンス化されたとき)に供
給されるように構築することである.
総称的な 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];
次回予定
 日時:2011年2月16日(水)
 場所: LB2  2 F / A 会議室
 内容:モジュール
2011/2/9 オブジェクト指向プログラミング入門 1 33

More Related Content

What's hot

良質なコードを高速に書くコツ
良質なコードを高速に書くコツ良質なコードを高速に書くコツ
良質なコードを高速に書くコツShunji Konishi
 
DDDオンライン勉強会#2 「集約・境界付けられたコンテキスト」
DDDオンライン勉強会#2 「集約・境界付けられたコンテキスト」 DDDオンライン勉強会#2 「集約・境界付けられたコンテキスト」
DDDオンライン勉強会#2 「集約・境界付けられたコンテキスト」 Koichiro Matsuoka
 
ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8
ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8
ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8Koichiro Matsuoka
 
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)Mikiya Okuno
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)Yoshitaka Kawashima
 
リッチなドメインモデル 名前探し
リッチなドメインモデル 名前探しリッチなドメインモデル 名前探し
リッチなドメインモデル 名前探し増田 亨
 
ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門増田 亨
 
ドメイン駆動開発 勉強会 ①
ドメイン駆動開発 勉強会 ①ドメイン駆動開発 勉強会 ①
ドメイン駆動開発 勉強会 ①Kakeru Kikuchi
 
機械学習デザインパターンおよび機械学習システムの品質保証の取り組み
機械学習デザインパターンおよび機械学習システムの品質保証の取り組み機械学習デザインパターンおよび機械学習システムの品質保証の取り組み
機械学習デザインパターンおよび機械学習システムの品質保証の取り組みHironori Washizaki
 
C#実装から見るDDD(ドメイン駆動設計)
C#実装から見るDDD(ドメイン駆動設計)C#実装から見るDDD(ドメイン駆動設計)
C#実装から見るDDD(ドメイン駆動設計)Takuya Kawabe
 
正しいものを正しく作る塾-設計コース
正しいものを正しく作る塾-設計コース正しいものを正しく作る塾-設計コース
正しいものを正しく作る塾-設計コース増田 亨
 
ドメイン駆動設計 複雑さに立ち向かう
ドメイン駆動設計 複雑さに立ち向かうドメイン駆動設計 複雑さに立ち向かう
ドメイン駆動設計 複雑さに立ち向かう増田 亨
 
ドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解するドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解する増田 亨
 
[DL輪読会]SoftTriple Loss: Deep Metric Learning Without Triplet Sampling (ICCV2019)
[DL輪読会]SoftTriple Loss: Deep Metric Learning Without Triplet Sampling (ICCV2019)[DL輪読会]SoftTriple Loss: Deep Metric Learning Without Triplet Sampling (ICCV2019)
[DL輪読会]SoftTriple Loss: Deep Metric Learning Without Triplet Sampling (ICCV2019)Deep Learning JP
 
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門増田 亨
 
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話Koichiro Matsuoka
 
「ドメイン駆動設計」の複雑さに立ち向かう
「ドメイン駆動設計」の複雑さに立ち向かう「ドメイン駆動設計」の複雑さに立ち向かう
「ドメイン駆動設計」の複雑さに立ち向かう増田 亨
 
ドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみようドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみよう増田 亨
 

What's hot (20)

良質なコードを高速に書くコツ
良質なコードを高速に書くコツ良質なコードを高速に書くコツ
良質なコードを高速に書くコツ
 
自然言語処理向け データアノテーションとそのユースケース
自然言語処理向け データアノテーションとそのユースケース自然言語処理向け データアノテーションとそのユースケース
自然言語処理向け データアノテーションとそのユースケース
 
DDDオンライン勉強会#2 「集約・境界付けられたコンテキスト」
DDDオンライン勉強会#2 「集約・境界付けられたコンテキスト」 DDDオンライン勉強会#2 「集約・境界付けられたコンテキスト」
DDDオンライン勉強会#2 「集約・境界付けられたコンテキスト」
 
ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8
ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8
ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8
 
形態素解析
形態素解析形態素解析
形態素解析
 
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
 
リッチなドメインモデル 名前探し
リッチなドメインモデル 名前探しリッチなドメインモデル 名前探し
リッチなドメインモデル 名前探し
 
ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門
 
ドメイン駆動開発 勉強会 ①
ドメイン駆動開発 勉強会 ①ドメイン駆動開発 勉強会 ①
ドメイン駆動開発 勉強会 ①
 
機械学習デザインパターンおよび機械学習システムの品質保証の取り組み
機械学習デザインパターンおよび機械学習システムの品質保証の取り組み機械学習デザインパターンおよび機械学習システムの品質保証の取り組み
機械学習デザインパターンおよび機械学習システムの品質保証の取り組み
 
C#実装から見るDDD(ドメイン駆動設計)
C#実装から見るDDD(ドメイン駆動設計)C#実装から見るDDD(ドメイン駆動設計)
C#実装から見るDDD(ドメイン駆動設計)
 
正しいものを正しく作る塾-設計コース
正しいものを正しく作る塾-設計コース正しいものを正しく作る塾-設計コース
正しいものを正しく作る塾-設計コース
 
ドメイン駆動設計 複雑さに立ち向かう
ドメイン駆動設計 複雑さに立ち向かうドメイン駆動設計 複雑さに立ち向かう
ドメイン駆動設計 複雑さに立ち向かう
 
ドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解するドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解する
 
[DL輪読会]SoftTriple Loss: Deep Metric Learning Without Triplet Sampling (ICCV2019)
[DL輪読会]SoftTriple Loss: Deep Metric Learning Without Triplet Sampling (ICCV2019)[DL輪読会]SoftTriple Loss: Deep Metric Learning Without Triplet Sampling (ICCV2019)
[DL輪読会]SoftTriple Loss: Deep Metric Learning Without Triplet Sampling (ICCV2019)
 
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
 
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
 
「ドメイン駆動設計」の複雑さに立ち向かう
「ドメイン駆動設計」の複雑さに立ち向かう「ドメイン駆動設計」の複雑さに立ち向かう
「ドメイン駆動設計」の複雑さに立ち向かう
 
ドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみようドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみよう
 

Similar to オブジェクト指向入門1

~PHPで学ぶ~ オブジェクト指向プログラミング
~PHPで学ぶ~ オブジェクト指向プログラミング~PHPで学ぶ~ オブジェクト指向プログラミング
~PHPで学ぶ~ オブジェクト指向プログラミングJunRails
 
第2回勉強会 オブジェクト指向
第2回勉強会 オブジェクト指向第2回勉強会 オブジェクト指向
第2回勉強会 オブジェクト指向hakoika-itwg
 
オブジェクト指向とは何ですか?
オブジェクト指向とは何ですか?オブジェクト指向とは何ですか?
オブジェクト指向とは何ですか?sumim
 
オブジェクト指向講座
オブジェクト指向講座オブジェクト指向講座
オブジェクト指向講座Kaito Sato
 
2019年度 若手技術者向け講座 オブジェクト指向
2019年度 若手技術者向け講座 オブジェクト指向2019年度 若手技術者向け講座 オブジェクト指向
2019年度 若手技術者向け講座 オブジェクト指向keki3
 
Web技術勉強会 20110514
Web技術勉強会 20110514Web技術勉強会 20110514
Web技術勉強会 20110514龍一 田中
 
早稲田大学授業 - Java Programing上級
早稲田大学授業 - Java Programing上級早稲田大学授業 - Java Programing上級
早稲田大学授業 - Java Programing上級Ippei Arita
 
CVPR2011祭り 発表スライド
CVPR2011祭り 発表スライドCVPR2011祭り 発表スライド
CVPR2011祭り 発表スライドAkisato Kimura
 

Similar to オブジェクト指向入門1 (10)

~PHPで学ぶ~ オブジェクト指向プログラミング
~PHPで学ぶ~ オブジェクト指向プログラミング~PHPで学ぶ~ オブジェクト指向プログラミング
~PHPで学ぶ~ オブジェクト指向プログラミング
 
第2回勉強会 オブジェクト指向
第2回勉強会 オブジェクト指向第2回勉強会 オブジェクト指向
第2回勉強会 オブジェクト指向
 
オブジェクト指向とは何ですか?
オブジェクト指向とは何ですか?オブジェクト指向とは何ですか?
オブジェクト指向とは何ですか?
 
オブジェクト指向講座
オブジェクト指向講座オブジェクト指向講座
オブジェクト指向講座
 
2019年度 若手技術者向け講座 オブジェクト指向
2019年度 若手技術者向け講座 オブジェクト指向2019年度 若手技術者向け講座 オブジェクト指向
2019年度 若手技術者向け講座 オブジェクト指向
 
Web技術勉強会 20110514
Web技術勉強会 20110514Web技術勉強会 20110514
Web技術勉強会 20110514
 
早稲田大学授業 - Java Programing上級
早稲田大学授業 - Java Programing上級早稲田大学授業 - Java Programing上級
早稲田大学授業 - Java Programing上級
 
Cpp v3
Cpp v3Cpp v3
Cpp v3
 
CVPR2011祭り 発表スライド
CVPR2011祭り 発表スライドCVPR2011祭り 発表スライド
CVPR2011祭り 発表スライド
 
I lang-modeling
I lang-modelingI lang-modeling
I lang-modeling
 

More from Kenta Hattori

オブジェクト指向入門2
オブジェクト指向入門2オブジェクト指向入門2
オブジェクト指向入門2Kenta Hattori
 
オブジェクト指向入門10
オブジェクト指向入門10オブジェクト指向入門10
オブジェクト指向入門10Kenta Hattori
 
オブジェクト指向入門9
オブジェクト指向入門9オブジェクト指向入門9
オブジェクト指向入門9Kenta 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
 
ソフトウェア・テスト入門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
 

More from Kenta Hattori (20)

オブジェクト指向入門2
オブジェクト指向入門2オブジェクト指向入門2
オブジェクト指向入門2
 
オブジェクト指向入門10
オブジェクト指向入門10オブジェクト指向入門10
オブジェクト指向入門10
 
オブジェクト指向入門9
オブジェクト指向入門9オブジェクト指向入門9
オブジェクト指向入門9
 
オブジェクト指向入門8
オブジェクト指向入門8オブジェクト指向入門8
オブジェクト指向入門8
 
オブジェクト指向入門7
オブジェクト指向入門7オブジェクト指向入門7
オブジェクト指向入門7
 
オブジェクト指向入門6
オブジェクト指向入門6オブジェクト指向入門6
オブジェクト指向入門6
 
オブジェクト指向入門5
オブジェクト指向入門5オブジェクト指向入門5
オブジェクト指向入門5
 
オブジェクト指向入門4
オブジェクト指向入門4オブジェクト指向入門4
オブジェクト指向入門4
 
オブジェクト指向入門3
オブジェクト指向入門3オブジェクト指向入門3
オブジェクト指向入門3
 
ソフトウェア・テスト入門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
 

Recently uploaded

リアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライド
リアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライドリアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライド
リアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライドKen Fukui
 
リアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライド
リアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライドリアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライド
リアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライドKen Fukui
 
リアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライド
リアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライドリアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライド
リアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライドKen Fukui
 
TEAMIN Service overview for customer_20240422.pdf
TEAMIN Service overview for customer_20240422.pdfTEAMIN Service overview for customer_20240422.pdf
TEAMIN Service overview for customer_20240422.pdfyukisuga3
 
リアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライド
リアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライドリアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライド
リアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライドKen Fukui
 
リアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライド
リアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライドリアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライド
リアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライドKen Fukui
 
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学ssusere0a682
 
【ゲーム理論入門】ChatGPTが作成した ゲーム理論の問題を解く #3 Slide
【ゲーム理論入門】ChatGPTが作成した ゲーム理論の問題を解く #3 Slide【ゲーム理論入門】ChatGPTが作成した ゲーム理論の問題を解く #3 Slide
【ゲーム理論入門】ChatGPTが作成した ゲーム理論の問題を解く #3 Slidessusere0a682
 

Recently uploaded (8)

リアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライド
リアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライドリアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライド
リアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライド
 
リアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライド
リアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライドリアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライド
リアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライド
 
リアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライド
リアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライドリアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライド
リアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライド
 
TEAMIN Service overview for customer_20240422.pdf
TEAMIN Service overview for customer_20240422.pdfTEAMIN Service overview for customer_20240422.pdf
TEAMIN Service overview for customer_20240422.pdf
 
リアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライド
リアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライドリアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライド
リアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライド
 
リアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライド
リアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライドリアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライド
リアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライド
 
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学
 
【ゲーム理論入門】ChatGPTが作成した ゲーム理論の問題を解く #3 Slide
【ゲーム理論入門】ChatGPTが作成した ゲーム理論の問題を解く #3 Slide【ゲーム理論入門】ChatGPTが作成した ゲーム理論の問題を解く #3 Slide
【ゲーム理論入門】ChatGPTが作成した ゲーム理論の問題を解く #3 Slide
 

オブジェクト指向入門1

  • 2. オブジェクト指向とは  “Object” は最も汎用的な英単語  認識できるすべてのものはオブジェクトである  要するにほとんど何の意味もない  オブジェクト指向の決定的な定義はない  いろいろな人がいろいろなことを言ってる 2011/2/9 オブジェクト指向プログラミング入門 1 2
  • 3. 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)  純粋なオブジェクト指向環境では,メッセージの引 数はオブジェクトのハンドルである あて先オブジェクト メソッド名 入力引数 出力引数 シグネチャ メッセージ
  • 19. 2011/2/9 オブジェクト指向プログラミング入門 1 19 メッセージにおけるオブジェクトの 役割  メッセージの送信者  メッセージのあて先  別のオブジェクトの中の変数から指されるも の  メッセージの引数から指されるもの method
  • 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];
  • 33. 次回予定  日時:2011年2月16日(水)  場所: LB2  2 F / A 会議室  内容:モジュール 2011/2/9 オブジェクト指向プログラミング入門 1 33