オブジェクト指向設計とは・・・

オブジェクト指向設計とは・・・
オブジェクト指向を理解する鍵
„
„
„
„
„
カプセル化(情報隠蔽)
抽象化(クラスとオブジェクト)
階層的構造化(継承と集約)
メッセージ
ポリモーフィズム
オブジェクト指向設計 資料(1)
2
カプセル化(情報隠蔽)
„
オブジェクト内へのアクセスはメソッドのみ
„
„
„
情報隠蔽によりオブジェクト内のデータへ外部から直
接アクセスすることを避ける。
オブジェクトはデータ構造とそのデータ構造に唯一ア
クセスできるメソッドから構成できる。
メソッド公開の範囲を制御
„
„
外部に公開する情報は必要最低限に留め、他のクラ
スとの独立性を高める。つまり、再利用度を高めるこ
とができる。
インタフェースと実装を分離し、インタフェースのみ公
開、実装情報を隠蔽できる。
オブジェクト指向設計 資料(1)
3
抽象化
„
„
„
どの単位でソフトウェアを作れば
良いのか?
世界にどれだけ違うものがあるの
か分類
同じ種類のオブジェクトにまとめ、
より少ない種類に分類できればソ
フトウェアはコンパクト
„
無数のモノの中から類似しているも
のを抜き出して一つの概念として捉
えること。捉えた概念にはできる限り
正確な名前をつける
オブジェクト指向設計 資料(1)
4
階層的構造化(継承と集約)
„
„
オブジェクトを組み合わせて再利用する仕組み
継承
„
„
„
„
上位で共通部分を汎化
共通部分を引き継ぎ、追加・変更(特殊化)
親子関係という蜜な関係→カプセル化に反する
集約
„
„
„
インスタンスを組み合わせる構造設計
コンテナ(入れ物)とコンポーネント(部品)の組み合わせ
持ってる関係
オブジェクト指向設計 資料(1)
5
メッセージ
„
„
„
個々のオブジェクトのメソッドを起動する仕組み
メッセージの送り先オブジェクト名.起動するメ
ソッド(引数の並び)
オーバーライド
„
„
スーパークラスで定義したメソッドのサブクラスでの
再定義
オーバーロード
„
同じ名前のメソッドで引数の異なるメソッドは異なる
オブジェクト指向設計 資料(1)
6
ポリモーフィズム(多様性)
„
„
異なるクラスをまとめ
て扱うことができる
同じメソッド名のメソッ
ドを実装しておけば、
„
„
同じ形式のメッセージ
で異なるクラスのメソッ
ドを実行
起動先オブジェクトは
実行時に確定する(動
的結合)
Object.メソッドA 親
メソッドA
Object=a
Object=b
a
メソッドA
オブジェクト指向設計 資料(1)
b
メソッドA
7
ポリモーフィズム
インスタンス生成
インスタンスA
クラスA
クラス変数(static)
インスタンス変数
new
COPY
インスタンス変数
クラスメソッド(static)
インスタンスメソッド
インスタンスメソッド
※ シングルトンパターン
オブジェクト指向設計 資料(1)
8
ポリモーフィズム
インスタンスは共通の型で・・・
„
共通の型のインスタンスとして
扱う
public Entry add(Entry entry)
directory.add(entry);
return this;
}
public int getSize(){
…
Entry entry = (Entry)it.next();
size += entry.getSize();
…
オブジェクト指向設計 資料(1)
9
Composite パターン
rootdir
getSize
bindir tmpdir usrdir
bindir
getSize
vi latex
vi
latex
getSize
getSize
size
size
tmpdir
getSize
usrdir
getSize
Yukidir ..
yukidir
getSize
diary.html composite.java
Diary.html
getSize
オブジェクト指向設計 size
資料(1)
Composite.java
getSize
size
10