JavaとUMLで学ぶ オブジェクト指向の考え方 第7章

JavaとUMLで学ぶ
オブジェクト指向の考え方
第7章
2003/7/3
時松 誠治
今日の内容
再利用化

継承

ポリモーフィズム
コンポジション
 継承、コンポジションの利点と欠点
 継承 VS コンポジション
 まとめ

継承とコンポジション
継承とは
is-a関係
 クラスの属性と振る舞い
を継承
 例:A dog is-a mammal
 ホワイトボックス再利用

コンポジションとは
has-a関係
 他のクラスから複合的
なクラスを構築
 例:Car has-an engine
 ブラックボックス再利用

どちらも再利用性を考慮した設計拡張の手段
継承の例(1)
汎化
鳥
飛距離:int
飛ぶ:void
カラス
ダチョウは飛べない!
キツツキ
ダチョウ
特化
突つく:void
穴ほぎ:void
走る:void
継承を使う場合は共通点を洗い出すこと重要
継承の例(2)
鳥
関係が複雑に
飛距離:int
飛ぶ:void
飛ぶ鳥
飛ばない鳥
飛距離:int
飛ぶ:void
カラス
突つく:void
キツツキ
穴ほぎ:void
そもそも飛べる鳥と
飛べない鳥を分ける
必要があるのか?
ダチョウ
走る:void
単純にするか複雑に
するかはシステムへの
要求によって決まる
ポリモーフィズム(多態性)
ポリモーフィズムとは

同じアクセスに対して、オブジェクトごとに異な
る動作をすること
ポリモーフィズムの例
斜体は
抽象○○
RectangleとCircleは
同じ図形
Shape
図形には面積が
あるが、その求め方は
さまざま
#area:double
+getArea:double
Rectangle
Circle
length:double
width:double
radius:double
+getArea:double
+getArea:double
それぞれでgetAreaを
定義する
(オーバーライド)
オブジェクトは
自分自身について
責任をもつ
コンポジション
コンポジションについて
オブジェクトの集合体(もしくはその構築方法)
 集約とコンポジションを区別する場合もある


集約 < コンポジション
自動車
チューブ
エンジン
タイヤ
ホイール
継承の利点
継承の利点は・・・
コードの再利用性が向上
→ 一度書いたコードを何度も書き直す必要がない
 属性、振る舞いの一極集中

→ コードの管理が容易に
 テスト時間の短縮
→ 親クラスをテストする必要がない
 システムの静的解析が容易
→ 保守、拡張が行いやすい
継承の欠点
継承の利点が欠点にも・・・
コードの再利用性が向上
→ クラス階層内のカプセル化が弱められる
 属性、振る舞いの一極集中

→ わずかな変更が多大な影響を及ぼす
 テスト時間の短縮
→ 親クラスの変更により子クラスもテストしな
ければならない
(継承と比べた)
コンポジションの利点と欠点
○ カプセル化に優れる
○ オブジェクト単体の完結性の向上
× システムの構造がわかりにくく
× 実行時の動作速度の低下
継承の代用
Rectangle
委譲(特別な
コンポジション)
を用いる
Window
Windowは四角だから
Rectangleクラスの
サブクラスだ!
Rectangle
Window
四角形に関する部分は
Rectangleクラスに
委譲しよう!
ポリモーフィズムの代用
インターフェースを用いる
<<interface>>
Shape
Shape
Shape
Shape
#area:double
#area:double
+getArea:double
+getArea:double
+getArea:double
+getArea:double
Rectangle
Circle
Rectangle
Circle
length:double
width:double
radius:double
length:double
width:double
radius:double
+getArea:double
+getArea:double
+getArea:double
+getArea:double
継承 VS コンポジション
継承

カプセル化が弱いが、わかりやすい
コンポジション

カプセル化が強いが、わかりにくい
どちらも一長一短。
既存のクラスを用いてコンポジションし、
足りない部分は継承を用いて構築
まとめ
再利用化のメカニズム
継承
 コンポジション

継承の利点と欠点
コンポジションの利点と欠点
継承とコンポジションの融合