More Related Content Similar to XP寺子屋 デザインパターン入門 (20) XP寺子屋 デザインパターン入門3. 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
▼出張アジャイル社内研修
5. XPJUG / XP関西 寺子屋
5
アジェンダ
• 基礎確認
• デザインパターン概要のご説明
• ハンズオン「 ToDo リストを作ろう!」
– ペア決め
– #1 イテレータパターン
– #2 ファクトリメソッド
– #3 メディエーターパターン
• ふりかえり
7. XPJUG / XP関西 寺子屋
7
オブジェクト指向で知っておきた
い事
1. オブジェクト指向って何?
2. クラス図の描き方
3. クラス図からプログラムへ置換
8. XPJUG / XP関西 寺子屋
8
1.オブジェクト指向って何?
• 下記3つの異なる考え方の同音異句
– メッセージパッシング
– カプセル化
– 多態性
• 上記3つを理解できていれば最低合格ラ
イン。
9. XPJUG / XP関西 寺子屋
9
2.クラス図の描き方
• 下記3種類が描ければ最低限 OK 。
– 継承( is a)
– 集約 (has a)
– 関連 (link)
親クラス
子クラス
クラス A
クラス B
クラス A
クラス B
継承 (is a) 集約 (has a) 関連 (link)
10. XPJUG / XP関西 寺子屋
10
3.クラス図からプログラムへ
置換
• 継承 (is a)
– 継承の関係
//---------------------------------------
class 親クラス
{
… …
};
//---------------------------------------
class 子クラス : public 親クラス
{
… …
};
親クラス
子クラス
11. XPJUG / XP関西 寺子屋
11
3.クラス図からプログラムへ
置換
• 集約 (has a)
– 集約クラスの責任を持
つ
– クラス A と同時にクラ
ス B を生成する
//---------------------------------------
class クラス B
{
… …
};
//---------------------------------------
class クラス A
{
… …
B BObj;
… …
};
クラス A
クラス B
12. 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
13. XPJUG / XP関西 寺子屋
13
3.クラス図からプログラムへ
置換
• 関連 (link)
– 他のクラスへのアクセスを行
う
– 他クラスの責任は曖昧
– クラス A 、クラスBは、第3
者が生成する。
//---------------------------------------
class クラス B
{
… …
};
//---------------------------------------
class クラス A
{
… …
B* P_BObj;
… …
};
クラス A
クラス B
15. XPJUG / XP関西 寺子屋
15
「デザインパターン」って何?
• 「パターン」とは繰り返し使用されるものである。
• 経験を通じて発見された問題解決策である。
• 「デザインパターン」とは、ソフトウェアの設計で
適用されるパターンを指す。
• デザインパターンの内、最も有名なの
は、 GoF ( Gang of Four )が紹介した 23 個のパ
ターンである。
• 一般的に、上記 23 個のパターンを「デザインパ
ターン」と呼ぶ。
16. XPJUG / XP関西 寺子屋
16
GoF(Gang of four)
• 下記4人のグループ
名。
– エリック・ガンマ
– リチャード・ヘルム
– ラルフ・ジョンソン
– ジョン・ブリシディー
ス
http://takeji-soft.seesaa.net/article/34433484.html
17. XPJUG / XP関西 寺子屋
17
GoF が発表した 23 個のパター
ン
目的
生成 構造 振る舞い
範
囲
クラス ファクトリメソッド アダプター(※) インタープリタ
テンプレートメソッド
オブジ
ェクト
アブストラクトファクト
リー
ビルダー
プロトタイプ
シングルトン
アダプター(※)
ブリッジ
コンポジット
デコレータ
ファサード
フライウェイ
プロキシー
チェインオブレスオンシビ
リティ
コマンド
イテレータ
メディエータ
メメント
オブザーバー
ステート
ストラテジー
ビジター
本日ご紹介するパターン : ファクトリメソッド、イテレー
タ、メディエータ
20. XPJUG / XP関西 寺子屋
20
ペアで最初にやること
1.「お名前カード」を作って下さい。
– 自分の氏名を書いて下さい。ハンドル名OK。
– 最近あった「良かった事」を書いて下さい。
– 1分以内に書いて下さい。
2.カードの内容をペアに教えてあげて下さい。
– 発表したら、拍手をお願いします。
– 1人1分でお願いします。
3.ペア名を決めて下さい。
– 「 GoF 」に負けないスゴい名前を期待しています!
– 1分でお願いします。
22. XPJUG / XP関西 寺子屋
22
仕様
• ToDo リスト仕様
– 実行すると、ToDoが入力できます。
– ToDoは英字で入力します。
– 「 end 」と入力すると、プログラムを終了し
ます。
Application
Initial( )
Run( )
End( )
StringList
Add( )
Get( )
Length( )
23. XPJUG / XP関西 寺子屋
23
#1 イテレータパターン
• 「 end 」を入力した時、入力したToD
oを一覧表示するプログラムを作成して
下さい。
24. XPJUG / XP関西 寺子屋
24
#1 イテレータパターン
• イテレーションパターンを使った回答例
Application
Initial( )
Run( )
End( )
StringList
Add( )
Get( )
Length( )
StringListIterator
hasNext( )
next( )
このクラスにリス
トの参照インデッ
クスを持たせる事
で、クライアント
側は参照インデッ
クスという制限か
ら開放される。
25. XPJUG / XP関西 寺子屋
25
#1 イテレータパターン
<<interface>>
Aggregate
+Iterator( )
ConcreteAggregate
+Iterator( ) : Iterator( )
<<interface>>
Iterator
+hasNext( )
+next( )
ConcretetIterator
- aggregate
+hasNext( ) : bool
+next( ) : Object
<<Create>>
26. XPJUG / XP関西 寺子屋
26
#1 イテレータパターン
• イテレーションパターンのメリット
– オブジェクトの取得方法が統一化できる
– 参照方法を変更しても、クライアントの変更が
不要
27. XPJUG / XP関西 寺子屋
27
#2 ファクトリメソッド
• クライアントがイテレーターにリストを
わざわざ登録するので、クライアントが
イテレーターとリストの依存関係を知っ
ておく必要がある。
• クライアントが依存関係を意識しなくて
も良い構造に変更せよ。
28. XPJUG / XP関西 寺子屋
28
#2 ファクトリメソッド
• ビルダーパターンを使った回答例
Application
Initial( )
Run( )
End( )
StringList
Add( )
Get( )
Length( )
GetIterator( )
StringListIterator
hasNext( )
next( )
リストにイテレー
タ生成メソッドを
付ける。
イテレータにリス
トの
ポインタを渡す事
で、
依存をリストに閉
じ込める。
29. XPJUG / XP関西 寺子屋
29
#2 ファクトリメソッド
Application StringList StringListIterator
GetIterator( )
new StringListIterator ( this )
return( StringListIterator のポインタ )
return( StringListIterator のポイン
タ )
30. XPJUG / XP関西 寺子屋
30
#2 ファクトリメソッド
Client DataObjectFactory DataObject
DBDataObjectFileDataObject
<<Create>>
<<Create>>
31. XPJUG / XP関西 寺子屋
31
#2 ファクトリメソッド
• ファクトリメソッドのメリット
– 関数の呼び出しでオブジェクトを取得できる
– クライアント側は、取得したオブジェクトの
振る舞いを意識する必要が無い
32. XPJUG / XP関西 寺子屋
32
# 3 メディエータパターン
• 複数の関数からリストにアクセスする場
合を考える。
• リストを参照する場合、イテレーターを
使用するものとする。
• あるリストから「リセット」を実行する
と、他の全てのリストの参照位置をリス
トの先頭にセットする構造に変更せよ。
33. XPJUG / XP関西 寺子屋
33
# 3 メディエータパターン
• メディエータパターンを使った回答例
Application
Initial( )
Run( )
End( )
StringList
Add( )
Get( )
Length( )
GetIterator( )
AllReset( )
StringListIterator
hasNext( )
next( )
AllReset( )
Reset( )
StringListIteratorList
Add( )
Get( )
GetLength( )
<<Create>>
34. XPJUG / XP関西 寺子屋
34
# 3 メディエータパターン
Application StringListIterator#1 StringListStringListIterator#2
ResetAll( )
ResetAll( )
Reset ( )
Reset ( )
35. XPJUG / XP関西 寺子屋
35
# 3 メディエータパターン
<<interface>>
Mediator
ConcreteColleagueA
<<interface>>
Colleague
+buildPart( )
ConcreteColleagueBConcreteMediator
36. XPJUG / XP関西 寺子屋
36
# 3 メディエータパターン
• メディエータパターンのメリット
– Collegue オブジェクトの結合度を下げることが
できる
– オブジェクト間の協調が理解しやすい