アルゴリズムとプログラミング

アルゴリズムとプログラミング
(Algorithms and Programming)
第4回:オブジェクト指向の考え方
•オブジェクト指向的な問題解決法とは
•UML (Unified Modeling Language)
•オブジェクトの設計図:クラス
•クラスとインスタンス
•オブジェクト指向3大原則
継承
カプセル化
ポリモーフィズム
講義資料等: http://www.pe.titech.ac.jp/~watanabe/lecture/ap/index-j.html
オブジェクト指向とは?
これまで(オブジェクト指向以前):
コンピュータ(CPU)が扱えるデータ型と演算
をまず考え、人間が解決したい問題をそれ
に合わせて解釈し直し、プログラム言語に変
換する。
機械中心主義
オブジェクト指向プログラミングの理想
人間が解決したい問題から、その問題を解く
ために必要となる概念(対象)を抽出し定義
する。問題解決はその“対象“への”操作”に
対象=
帰着。機械の都合は2の次。
オブジェクト
人間中心主義
問題設定例1:猫をメインキャラク
ターとするペット育成シミュレーショ
ンソフトの開発
この課題では、猫キャラクターが
重要な鍵を握る
猫
どんな属性に
注目するか
属性=観察す
べき特性
猫
顔デザイン
毛の色
体重
どんな振る舞
いをするか
猫オブジェクトの定義
猫
観察すべき特性
顔デザイン
毛の色
体重
独特の振る舞い
鳴く()
食べる()
遊ぶ()
属性
(attribute)
操作
(operation)
オブジェクト = 属性 + 操作
これらを定義する作業を
モデリングという
オブジェクトの設計図=クラス
猫
クラス名
猫
猫
顔デザイン
毛の色
体重
顔デザイン
毛の色
体重
属性
鳴く()
食べる()
遊ぶ()
操作
これらは全てクラス図
オブジェクトの生成
設計図(クラス)の属性と操作に値を与えて
具体化したもの=オブジェクト
インスタンス化するという
3つの記法:どれも可
ミケ:猫
顔デザイン
毛の色:三色
体重:2400g
オブジェクト図
オブジェクト名:クラス名
:クラス名
オブジェクト名
クラスとオブジェクトの関係
猫
クラス(設計図)
顔デザイン
毛の色:
体重:
オブジェクト
属性と操作に
具体的な値を
与えて生成
された実体
クロ:猫
ミケ:猫
トラ:猫
顔デザイン
毛の色:黒色
体重:1500g
顔デザイン
毛の色:三色
体重:2400g
顔デザイン
毛の色:トラ柄
体重:3000g
クロ:猫 オブジェクトは猫クラスのインスタンスである
クラスの階層構造
動物
汎化
一般的
抽象的
脊椎動物
スーパークラス
哺乳類
矢印の向きは
汎化する向き
相対的な階層関係
クラス図
サブクラス
猫
個別的
具体的
オブジェクト図
クロ:猫
ミケ:猫
トラ:猫
顔デザイン
毛の色:黒色
体重:1500g
顔デザイン
毛の色:三色
体重:2400g
顔デザイン
毛の色:トラ柄
体重:3000g
特化
オブジェクト指向の表記法
UML (Unified Modeling Language) :
統一されたモデリングの方法論と表記法
クラス図
オブジェクト図
ユースケース図
ステートチャート図
シーケンス図
アクティビティ図
コラボレーション図
コンポーネント図
配置図
Java言語と直接の関係はないが
オブジェクト指向用語や概念の
標準であり、Java言語にも基本部分が
取り入れられている。
世の中を、これらのチャート図を
用いて表現(モデリング)し、最終段階
でJavaのクラスやオブジェクトの関係
として設計、プログラムを作成し、
問題を解決する。
クラス同士の関係
関連(association)
えさをあげる
猫
人間
じゃれる
クラス同士の関係
ロール(role)
えさをあげる
人間
飼い主
ペット
猫
クラス同士の関係
多重度
(multiplicity)
人間
表記法 0..3 0から3まで
1..*
1以上
1,5,7 1か5か7
1
猫から見て飼い主としての人間が1人で
あることが保証された状況をモデリング
しかし、家族の複数名が飼い主と見なせ
る可能性を考慮すれば → 1..*
自転車
1
1..*
猫
飼い主は猫を複数飼うことができる
一般に0も許せば → 0..*
2
車輪
クラス同士の関係
限定子(qualifier)
1
人間
1
えさをあげる
名前
複数の猫を名前で限
定することで、多重度
を1対1にできる
猫
クラスが別のクラスで構成
集約(aggregation)
ゾウ
動物園
キリン
ライオン
部分要素が集まり全体を構成
クラスが別のクラスで構成
コンポジション集約(composition)
天板
机
脚
部品だけでは意味をなさない場合
オブジェクト指向3原則:継承
猫クラスは、哺乳類クラスを継承している
スーパークラス
哺乳類
すべての属性と
操作を受け継ぐ
体重
食べる()
母乳で育てる()
例外無し!
矢印の向きは
汎化する向き
サブクラス
猫クラス
独自の属性
猫クラス
独自の操作
UML表記
猫
体重
毛の色
食べる()
母乳で育てる()
鳴く()
遊ぶ()
哺乳類から継承した属性
哺乳類から継承した操作
省
略
可
継承と集約の区別
哺乳類
継承: is-a 関係
(猫は哺乳類である)
(ゾウは動物園である)
犬
集約: has-a 関係
猫
人
動物園
ゾウ
キリン ライオン
オブジェクト指向3原則:カプセル化
クラス図
猫
顔デザイン
毛の色
体重
鳴く()
食べる()
遊ぶ()
属性
(attribute)
操作
(operation)
カプセル化
他のクラスの属性や操作
と厳格に区別するための
しくみ。
カプセル化の実現:
可視性(visibility)
猫
顔デザイン
毛の色
体重
鳴く()
食べる()
遊ぶ()
属性
それぞれがどの範囲から見えるかを定義
(可視性のレベル)
操作
private: 同クラスからのみ参照可能(-)
protected: 継承関係にあるクラス
からも参照可能(#)
public: 全てのクラスから参照可能(+)
可視性の表記(ー,#,+)
乗り物
-スピード
#スピードを変える()
#スピードを表示する()
飛行機
-高度
#離陸する()
#着陸する()
#高度を表示する()
全てサブクラスへ継承される
飛行機クラスでは、継承していても
スピード属性を参照できない。
→ スピードを表示する()操作を使う
抽象クラス:オブジェクトを生成できないクラス
乗り物
-スピード
#スピードを変える()
#スピードを表示する()
飛行機
-高度
#離陸する()
#着陸する()
#高度を表示する()
クラス名をイタリックにすると
抽象クラス
乗り物クラスのインスタンスは
存在しないことが保証される
飛行機クラスでは、依然として
スピードを表示する()操作は必須
であり、乗り物クラスは使われる。
オブジェクト指向3原則:ポリモーフィズム
(多態性:オブジェクトは1つだが複数の形を持っていること)
乗り物
飛行機
ジェット機
ジェット機クラスのインスタン
スを、乗り物オブジェクトとして
扱うことができる。
自動車
プロペラ機
ジェット機は飛行機でも
あり、乗り物でもある
ジェット機クラスのインスタン
スに対する操作を、乗り物に
対する操作として記述できる
このような記述の仕方に
どんなメリットがあるの?
乗り物
#動力を始動する()
飛行機
自動車
#動力を始動する()
ジェット機
#動力を始動する()
#動力を始動する()
プロペラ機
#動力を始動する()
操作名は同じだ
が、実際の操作
内容はそれぞれ
異なる
ジェット機クラスのインスタンスを生成する
:ジェット機
このインスタンスを乗り物オブジェクトと見なす
(乗り物オブジェクト変数に格納する)
:乗り物
変数名:乗り物1
動力を始動する()メッセージを送る
乗り物1.動力を始動する()
乗り物オブジェクトの操作が呼び出
されるように記述されているが、自動
的にジェット機オブジェクトに対する
操作が呼び出される
この記法は、ジェット機に限ら
ず、プロペラ機にも自動車にも、
将来的に追加される乗り物に
もそのまま変更なく使える。
上位概念(スーパークラス)オブジェクトに対する操作と
して記述しておくと、サブクラスの細かい修正や追加な
どに対して強いプログラムになる(保守性が高い)
ジェット機クラスのインスタンスを生成する
:ジェット機
このインスタンスをジェット機オブジェクト変数に格納する)
:ジェット機 変数名:ジェット機1
動力を始動する()メッセージを送る
ジェット機1.動力を始動する()
この記法では、プロペラ機や自動車、さらには将来的に
追加される乗り物に対しては、そのままでは使えない。
ポリモーフィズムのまとめ
ポリモーフィズム(polymorphism)の意味:
1つのオブジェクトが複数の形を持つ ← 継承により実現
ポリモーフィズムの活用の仕方:
上位概念(スーパークラス)への操作として表現する
(プログラムを記述する)
その効果:
サブクラスの細かい修正や追加などに対して強い
(保守性が高い)プログラムになる
オブジェクト指向プログラミングの有効性!
まとめ
•オブジェクト指向的な問題解決法とは
•UML (Unified Modeling Language)
•オブジェクトの設計図:クラス
•クラスとインスタンス
•オブジェクト指向3大原則
継承
カプセル化
ポリモーフィズム