オブジェクト指向
プログラミング入門
ソフトウェア基礎講座 第5回
2011年3月7日
服部健太
2011/3/7
オブジェクトは主体ではない
 オブジェクト技術におけるすべてのもとにな
る基本概念はクラスクラスである
 クラスは可能なデータ構造の集合を現しそれ
らのデータ構造はそのクラスのインスタンスインスタンス
( instance )と呼ばれる
 抽象データ型のインスタンス=数学的要素
 クラスのインスタンス=メモリ上のデータ構造
クラスは(部分的であっても良い)実装を伴う抽象データ型である
定義:クラス
2オブジェクト指向プログラミング入門 5
2011/3/7
クラスとオブジェクト
 オブジェクトは単にクラスのインスタンスの
こと
 クラスはシステムの作成に使われるソフト
ウェアテキスト
 静的な構造
 オブジェクトは実行時のみの概念
 実行時に作成され,操作される
3オブジェクト指向プログラミング入門 5
2011/3/7
メタクラス( metaclass )
 クラスそのものをオブジェクトとして扱うた
めの機構
 メタクラスのインスタンスはクラスである.
 メタクラスの概念を導入している言語では
Smalltalk が有名
 メタクラスを導入すると静的型チェックが困
難になる
 利点よりも問題の方が多いので,本書では扱わな
い
 メタクラスの効果は他の手段によっても代替でき
る 4オブジェクト指向プログラミング入門 5
2011/3/7
「メタ~」について
 「~についての~」のこと
 日本語で「超~」ともいう
 メタデータ
 データについてのデータ
 メタタグ
 タグにつけるためのタグ
 メタ言語
 言語を記述するための言語
5オブジェクト指向プログラミング入門 5
2011/3/7
モジュールと型(クラスの役割)
 モジュールはソフトウェア分解の単位
 ルーチンやパッケージ etc.
 モジュールへの分解はソフトウェアが提供する
サービスとは無関係
 どんなプログラムも 1 つのメインプログラムで書くこと
は可能
 型は特定の動的なオブジェクトの静的な記述
 ソフトウェアの実行中に処理される様々なデータ
要素の静的な記述
 データ(値)を抽象したもの
 すべての型はソフトウェアの実行に直接影響を与
える
6オブジェクト指向プログラミング入門 5
2011/3/7
モジュールと型としてのクラス
 クラスという概念の大きな特徴は,モジュー
ルと型の概念を包括し, 1 つの言語的構造に
併合したこと
 クラスはモジュールであり,型でもある(総
称性がある場合には型のパターン)
7オブジェクト指向プログラミング入門 5
2011/3/7
一様な型体系
 オブジェクト指向の重要な特徴の 1 つは,型
体系が単純で一様( uniform )であること
 整数や実数,論理地,文字などの基本オブジェク
トも,定義済みのライブラリクラス( INTEGER,
REAL, DOUBLE, BOOLEAN, CHARACTER )の
インスタンスとして考えられる
すべてのオブジェクトは何らかのクラスのインスタンスである
オブジェクトの原則( Object rule )
8オブジェクト指向プログラミング入門 5
2011/3/7
一様な型体系の利点
 多くの特殊ケースを設けるよりは 1 つの単純で一律
のフレームワークを使う方がよい
 基本的な型を ADT として記述すること,すなわち
クラスとして記述することは単純で自然なことであ
る
 INTEGER を定義するには,「 + 」や「 <= 」などの演算子
に関する数学的公理を使えばよい
 継承や総称性というオブジェクト指向の機構をすべ
ての型に対して自然に適用できる
 INTEGER , REAL, DOUBLE はより汎用的なクラスである
NUMERIC の継承クラスであると考えることができる
 MATRIX[INTEGER] や MATRIX[REAL] などの総称クラスと
しての MATRIX
9オブジェクト指向プログラミング入門 5
2011/3/7
単純なクラスの例: POINT
x
y
p1
ρ
θ
x
y
rho
theta
POLAR_POINT
CARTESIAN_POINT
rho = sqrt(x*x+y*y)
theta = arctan(y/x)
x = rho*cos(theta)
y = rho*sin(theta)
10オブジェクト指向プログラミング入門 5
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
2011/3/7
属性とルーチン
 クラスにおいては,抽象データ型の関数は特性とな
る
 クラスのインスタンスに適用可能な操作となる
 ある特性は空間によって表現される
 ある情報をそのクラスのすべてのインスタンスに関連付け
ることによって表現される
 属性属性( attribute )と呼ばれる
 ある特性は時間によって表現される
 そのクラスのすべてのインスタンスに適用される計算(ア
ルゴリズム)を定義することによって表現される
 ルーチンルーチン( routine )と呼ばれる
 ルーチンは結果を返すファンクションと返さないプロシー
ジャに分類できる
12オブジェクト指向プログラミング入門 5
2011/3/7
統一形式アクセス
 p1 という点を操作するときには, p1 の内部
的な表現がデカルト座標か極座標か気にせず
に済むようにしたい.
 属性とファンクションを明示的に分けることは適
切か?
 その属性がメモリによって実装されているか
,計算によって実装されているかにかかわら
ず, 1 つの表記でアクセスできる.
 例: p1.x
13オブジェクト指向プログラミング入門 5
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
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
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
2011/3/7
顧客と供給者
 クラスを使う 2 通りの方法
 そのクラスから継承する
 そのクラスの顧客( client )になる
 この定義では, a は C の属性かファンクションか
もしれないし, C のルーチンのローカルなエン
ティティか引数かもしれない
 さきの例では,クラス POINT は REAL の顧客で
ある
S はクラスとする. a: S という形式の宣言を含むクラス C は S の顧客
( client )であるという.また, S は C の供給者( supplier )であるという
.
定義:顧客と供給者
17オブジェクト指向プログラミング入門 5
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
2011/3/7
単一ターゲットの原則
 特性呼び出しと伝統的なプロシージャの違い
 オブジェクト指向形式の特性呼び出しでは,ある
オブジェクトをターゲットとして選び,他の引数
は補助的な地位に追いやられる
オブジェクト指向におけるすべての操作は,その操作の実行時における現在
のインスタンスという特定のオブジェクトに対するものである.
単一ターゲット( Single Target )の原則
translate(p1, 4.0, -1.5)
すべての引数が同
等に扱われている
19オブジェクト指向プログラミング入門 5
2011/3/7
モジュールと型の識別
 クラスはモジュールであると同時に型である
 モジュールはソフトウェアの一部を構成する
関連する機能の集まりである.
 モジュールが型ならば,そのモジュールの中
のすべての操作はその型の特性のインスタン
スに対するものである.
クラス POINT を 1 つのモジュールとして見たとき,このクラスによって提
供される機能は型として見たときのクラス POINT のインスタンスに対して
使用できる操作にほかならない.
モジュールと型の融合がどのように行われるか
20オブジェクト指向プログラミング入門 5
2011/3/7
Current の役割
 あるルーチンに対するすべての呼び出しは,特定の
ターゲットに対するものである
 ルーチンのテキスト上に現れるすべての特性名をその特定
のターゲットに対して適用されるものとして扱う
 p1.translate(4.0,-1.5) という呼び出しにおける, translate
の本体の中のすべての x の記述は「 p1 の x 」を意味する
 Current とは「現在の呼び出しのターゲット」であ
る 
F1 ● ルーチン呼び出しの一部として実行する以外の方法で実行される呼び
出し  
  要素は絶対にない.
F2 ● すべての呼び出しにはターゲットが 1 つある.
特性呼び出しの原則
21オブジェクト指向プログラミング入門 5
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
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
2011/3/7
選択的エクスポートと情報隠蔽
 特性の顧客による利用を制限する
class S feature
f …
g …
feature {A, B}
h …
feature {NONE}
i …
end
完全に開示する
顧客のアクセスを制限する
非公開にする
24オブジェクト指向プログラミング入門 5
2011/3/7
自分自身にエクスポートする
indexing
note: “ ”このままでは正しくない
class T feature
x: T
my_routine is do … print(x.secret) … end
feature {NONE}
secret: INTEGER
end
 secret は非公開なので, x.secret は無効
 解決方法:
feature {NONE} のかわりに feature {T} とすればよ
い
25オブジェクト指向プログラミング入門 5
2011/3/7
システムの実行
 いったいどこから実行がはじまるのか?
 1つのオブジェクトが作られ,生成プロシージャが開始される
 ルートオブジェクトはシステムのルートクラスと呼ばれる特定
クラスのインスタンスである
 生成プロシージャはルートクラスに含まれるプロシージャの 1
つである
オブジェクト指向ではソフトウェアシステムの実行は次の 2 つのステップか
ら成り立っている.
 ●その実行のルートオブジェクト( root object )と呼ばれる特定のオブ
ジェクトを
  作成する
 ●生成プロシージャ( creation procedure )と呼ばれる特定のプロシー
ジャをその
  オブジェクトに適用する
定義:システムの実行
26オブジェクト指向プログラミング入門 5
2011/3/7
システム
 システムの組み立てに必要な 3 つのこと
 クラスの集合 CS .そのシステムのクラスセットと呼ばれ
る
 CS の中のどのクラスがルートクラスか
 そのルートクラスのどのプロシージャがルート生成プロ
シージャか
 意味のあるシステムを作るためには,ルートクラス
が直接あるいは間接に必要とするクラスすべてが
CS に含まれていなければならない
そのシステムのクラスセットの中にルートクラスが必要とするすべてのクラ
スが含まれている場合にのみ,システムは閉じている.
定義:システムクロージャ
27オブジェクト指向プログラミング入門 5
2011/3/7
メインプログラムとどこがちがう
の?
 伝統的なメインプログラムでは,次の無関係な概念
を融合していた
 実行を開始する場所
 システムアーキテクチャの一番上(トップ)の,あるいは
,根本的な要素
 処理の開始時点がシステムの重要な要素である必然
性はまったくない
 例:オペレーティングシステムにおけるブート手続き
 システムの最も重要な属性は,それに含まれるクラ
スの集合と,それらクラスの個々の機能と,クラス
間の属性
 システムの進化に合わせて簡単に変更できなくてはならな
い
28オブジェクト指向プログラミング入門 5
2011/3/7
システムを組み立てる
 組み立てツールにとって必要な情報
 ルートクラスの名前
 ユニバース( universe ).ルートが必要とするクラスのテ
キストを含むファイルの集合
 これらはクラステキストには記述できない
 本書( Eiffel )では Lace と呼ばれる制御言語を用
いる
system painting root
GRAPHICS(“painting_application”)
cluster
base_library: “librarybase”;
graphical_library: “librarygraphics”;
painting_application: “userapplication”
end
29オブジェクト指向プログラミング入門 5
クラスの見つけ方
 要求仕様書の記述にある名詞に注目する
 The elevator will close its door before it moves to another
floor
 ELEVATOR, DOOR, FLOOR がクラスになる
 残念ながら,この方法はほとんど役に立たない
 明らかなクラスしか見いだせないばかりか余計なクラスも含む
 無駄なクラスを避ける
 DOOR というクラスは本当に必要だろうか?
 ELEVATOR の中にドアを開け閉めするコマンドを用意すれば済
むかもしれない
 新しいクラスが必要か?
 何階かという概念を表すのには整数でも十分?
 整数の属性には含まれない重要な操作がある場合や利用で
きる操作を制限したい場合, FLOOR クラスは妥当かもし
れない
2011/3/7 30オブジェクト指向プログラミング入門 5
システム分析
 「実世界をそのままモデル化すること」では
ない
 構築中のソフトウェアにとって意味のある部
分をモデル化すること.
2011/3/7 31オブジェクト指向プログラミング入門 5
次回予定
 日時: 2011年3月17日(木)13:
00~
 場所: LB  2 F / A 会議室
 内容:オブジェクト
2011/3/7 オブジェクト指向プログラミング入門 5 32

オブジェクト指向入門5