xp寺子屋 デザインパターン入門

39
XPJUG関西 / XP寺子屋 1 「デザインパターン入門」 2012.12.21 XP寺子屋

Upload: takepu

Post on 08-Jul-2015

628 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: XP寺子屋 デザインパターン入門

XPJUG関西 / XP寺子屋

1

「デザインパターン入門」

2012.12.21XP寺子屋

Page 2: XP寺子屋 デザインパターン入門

XPJUG / XP関西 寺子屋

2

自己紹介

Page 3: XP寺子屋 デザインパターン入門

XPJUG / XP関西 寺子屋

3

・名前     : 西 丈善(たけぷ~)

・仕事     : 組み込み系

・業界歴    :  20年

・コミュニティ :  XPJUG関西、 PFP関西

・使用言語  :  C, C++

・ SNS     :  Twitter takepu

  FaceBook 西 丈善

・宣伝     : ▼アジャイルラジオ 毎週水曜日公開

            http://www.agileradio.info/

           ▼ XP祭り関西 2013  2013年 4月 27開催

http://www.xpjug.jp

           ▼出張アジャイル社内研修(無料)受付中  

Page 4: XP寺子屋 デザインパターン入門

XPJUG / XP関西 寺子屋

4

アジェンダ

Page 5: XP寺子屋 デザインパターン入門

XPJUG / XP関西 寺子屋

5

アジェンダ

• 基礎確認• デザインパターン概要のご説明• ハンズオン「 ToDoリストを作ろう!」

– ペア決め– #1 イテレータパターン– #2 ファクトリメソッド– #3 メディエーターパターン

• ふりかえり

Page 6: XP寺子屋 デザインパターン入門

XPJUG / XP関西 寺子屋

6

基礎確認

Page 7: XP寺子屋 デザインパターン入門

XPJUG / XP関西 寺子屋

7

オブジェクト指向で知っておきたい事

1. オブジェクト指向って何?2. クラス図の描き方3. クラス図からプログラムへ置換

Page 8: XP寺子屋 デザインパターン入門

XPJUG / XP関西 寺子屋

8

1.オブジェクト指向って何?

• 下記3つの異なる考え方の同音異句– メッセージパッシング– カプセル化– 多態性

• 上記3つを理解できていれば最低合格ライン。

Page 9: XP寺子屋 デザインパターン入門

XPJUG / XP関西 寺子屋

9

2.クラス図の描き方

• 下記3種類が描ければ最低限 OK。– 継承( is a)– 集約 (has a)– 関連 (link)

親クラス

子クラス

クラス A

クラス B

クラス A

クラス B

継承 (is a) 集約 (has a) 関連 (link)

Page 10: XP寺子屋 デザインパターン入門

XPJUG / XP関西 寺子屋

10

3.クラス図からプログラムへ置換

• 継承 (is a)–継承の関係

//---------------------------------------class 親クラス{

… …  };

//---------------------------------------class 子クラス : public 親クラス{

… …  };

親クラス

子クラス

Page 11: XP寺子屋 デザインパターン入門

XPJUG / XP関西 寺子屋

11

3.クラス図からプログラムへ置換

• 集約 (has a)– 集約クラスの責任を持つ

– クラス Aと同時にクラス Bを生成する

//---------------------------------------class クラス B{

… …  };

//---------------------------------------class クラス A{

… …     B BObj;

… …  };

クラス A

クラス B

Page 12: XP寺子屋 デザインパターン入門

XPJUG / XP関西 寺子屋

12

3.クラス図からプログラムへ置換

• 集約 (has a その2 )C++のみ– 集約クラスの責任を持つ– クラス A生成後、クラス Bを生成する場合

– クラス Bを deleteする責務を負う。( C++のみ)

//---------------------------------------class クラス B{

… …  };

//---------------------------------------class クラス A{public : A( ){ P_BObj = new B; } virtual ~A(){ delete P_BObj; }

… …     B* P_BObj;};

クラス A

クラス B

Page 13: XP寺子屋 デザインパターン入門

XPJUG / XP関西 寺子屋

13

3.クラス図からプログラムへ置換

• 関連 (link)– 他のクラスへのアクセスを行う

– 他クラスの責任は曖昧– クラス A、クラスBは、第3者が生成する。

//---------------------------------------

class クラス B

{

… …  

};

//---------------------------------------class クラス A{

… …  

   B* P_BObj;… …  

};

クラス A

クラス B

Page 14: XP寺子屋 デザインパターン入門

XPJUG / XP関西 寺子屋

14

デザインパターン概要のご説明

Page 15: XP寺子屋 デザインパターン入門

XPJUG / XP関西 寺子屋

15

「デザインパターン」って何?• 「パターン」とは繰り返し使用されるものである。

• 経験を通じて発見された問題解決策である。

• 「デザインパターン」とは、ソフトウェアの設計で適用されるパターンを指す。

• デザインパターンの内、最も有名なのは、 GoF( Gang of Four)が紹介した 23個のパターンである。

• 一般的に、上記 23個のパターンを「デザインパターン」と呼ぶ。

Page 16: XP寺子屋 デザインパターン入門

XPJUG / XP関西 寺子屋

16

GoF(Gang of four)• 下記4人のグループ名。– エリック・ガンマ– リチャード・ヘルム– ラルフ・ジョンソン– ジョン・ブリシディース

http://takeji-soft.seesaa.net/article/34433484.html

Page 17: XP寺子屋 デザインパターン入門

XPJUG / XP関西 寺子屋

17

GoFが発表した 23個のパターン

目的生成 構造 振る舞い

     範囲

クラス ファクトリメソッド アダプター(※) インタープリタテンプレートメソッド

オブジェクト

アブストラクトファクトリービルダープロトタイプシングルトン

アダプター(※)ブリッジコンポジットデコレータファサードフライウェイプロキシー

チェインオブレスオンシビリティコマンドイテレータメディエータメメントオブザーバーステートストラテジービジター

本日ご紹介するパターン : ファクトリメソッド、イテレータ、メディエータ

Page 18: XP寺子屋 デザインパターン入門

XPJUG / XP関西 寺子屋

18

ハンズオン「ToD oリストを作ろう!」

Page 19: XP寺子屋 デザインパターン入門

XPJUG / XP関西 寺子屋

19

ペア決め

Page 20: XP寺子屋 デザインパターン入門

XPJUG / XP関西 寺子屋

20

ペアで最初にやること1.「お名前カード」を作って下さい。

– 自分の氏名を書いて下さい。ハンドル名OK。– 最近あった「良かった事」を書いて下さい。– 1分以内に書いて下さい。

2.カードの内容をペアに教えてあげて下さい。– 発表したら、拍手をお願いします。– 1人1分でお願いします。

3.ペア名を決めて下さい。– 「 GoF」に負けないスゴい名前を期待しています!– 1分でお願いします。

Page 21: XP寺子屋 デザインパターン入門

XPJUG / XP関西 寺子屋

21

準備

• プログラムを実行可能状態にして下さい。

Page 22: XP寺子屋 デザインパターン入門

XPJUG / XP関西 寺子屋

22

仕様

• ToDoリスト仕様– 実行すると、ToDoが入力できます。– ToDoは英字で入力します。– 「 end」と入力すると、プログラムを終了します。

Application

Initial( )Run( )End( )

StringList

Add( )Get( )Length( )

Page 23: XP寺子屋 デザインパターン入門

XPJUG / XP関西 寺子屋

23

#1 イテレータパターン

• 「 end」を入力した時、入力したToDoを一覧表示するプログラムを作成して下さい。

Page 24: XP寺子屋 デザインパターン入門

XPJUG / XP関西 寺子屋

24

#1 イテレータパターン

• イテレーションパターンを使った回答例

Application

Initial( )Run( )End( )

StringList

Add( )Get( )Length( )

StringListIterator

hasNext( )next( )

このクラスにリストの参照インデックスを持たせる事で、クライアント側は参照インデックスという制限から開放される。

Page 25: XP寺子屋 デザインパターン入門

XPJUG / XP関西 寺子屋

25

#1 イテレータパターン

<<interface>>Aggregate

+Iterator( )

ConcreteAggregate

+Iterator( ) : Iterator( )

<<interface>>Iterator

+hasNext( )+next( )

ConcretetIterator

- aggregate

+hasNext( ) : bool+next( ) : Object

<<Create>>

Page 26: XP寺子屋 デザインパターン入門

XPJUG / XP関西 寺子屋

26

#1 イテレータパターン

• イテレーションパターンのメリット–オブジェクトの取得方法が統一化できる–参照方法を変更しても、クライアントの変更が不要

Page 27: XP寺子屋 デザインパターン入門

XPJUG / XP関西 寺子屋

27

#2 ファクトリメソッド

• クライアントがイテレーターにリストをわざわざ登録するので、クライアントがイテレーターとリストの依存関係を知っておく必要がある。

• クライアントが依存関係を意識しなくても良い構造に変更せよ。

Page 28: XP寺子屋 デザインパターン入門

XPJUG / XP関西 寺子屋

28

#2 ファクトリメソッド

• ビルダーパターンを使った回答例

Application

Initial( )Run( )End( )

StringList

Add( )Get( )Length( )GetIterator( )

StringListIterator

hasNext( )next( )

リストにイテレータ生成メソッドを付ける。イテレータにリストのポインタを渡す事で、依存をリストに閉じ込める。

Page 29: XP寺子屋 デザインパターン入門

XPJUG / XP関西 寺子屋

29

#2 ファクトリメソッドApplication StringList StringListIterator

GetIterator( )new StringListIterator ( this )

return( StringListIteratorのポインタ )

return( StringListIteratorのポインタ )

Page 30: XP寺子屋 デザインパターン入門

XPJUG / XP関西 寺子屋

30

#2 ファクトリメソッド

Client DataObjectFactory DataObject

DBDataObjectFileDataObject<<Create>>

<<Create>>

Page 31: XP寺子屋 デザインパターン入門

XPJUG / XP関西 寺子屋

31

#2 ファクトリメソッド

• ファクトリメソッドのメリット– 関数の呼び出しでオブジェクトを取得できる– クライアント側は、取得したオブジェクトの振る舞いを意識する必要が無い

Page 32: XP寺子屋 デザインパターン入門

XPJUG / XP関西 寺子屋

32

# 3 メディエータパターン

• 複数の関数からリストにアクセスする場合を考える。

• リストを参照する場合、イテレーターを使用するものとする。

• あるリストから「リセット」を実行すると、他の全てのリストの参照位置をリストの先頭にセットする構造に変更せよ。

Page 33: XP寺子屋 デザインパターン入門

XPJUG / XP関西 寺子屋

33

# 3 メディエータパターン

• メディエータパターンを使った回答例

Application

Initial( )Run( )End( )

StringList

Add( )Get( )Length( )GetIterator( )AllReset( )

StringListIterator

hasNext( )next( )AllReset( )Reset( )

StringListIteratorList

Add( )Get( )GetLength( )

<<Create>>

Page 34: XP寺子屋 デザインパターン入門

XPJUG / XP関西 寺子屋

34

# 3 メディエータパターンApplication StringListIterator#1 StringListStringListIterator#2

ResetAll( )ResetAll( )

Reset ( )

Reset ( )

Page 35: XP寺子屋 デザインパターン入門

XPJUG / XP関西 寺子屋

35

# 3 メディエータパターン

<<interface>>Mediator

ConcreteColleagueA

<<interface>>Colleague

+buildPart( )

ConcreteColleagueBConcreteMediator

Page 36: XP寺子屋 デザインパターン入門

XPJUG / XP関西 寺子屋

36

# 3 メディエータパターン

• メディエータパターンのメリット– Collegueオブジェクトの結合度を下げることができる– オブジェクト間の協調が理解しやすい

Page 37: XP寺子屋 デザインパターン入門

XPJUG / XP関西 寺子屋

37

ふりかえり

Page 38: XP寺子屋 デザインパターン入門

XPJUG / XP関西 寺子屋

38

最後までお付き合い頂き、ありがとうございます。

Page 39: XP寺子屋 デザインパターン入門

XPJUG / XP関西 寺子屋

39

参考文献

• 独習デザインパターン C++