Upload
akio-nikaido
View
484
Download
2
Embed Size (px)
Citation preview
Command パターンのおはなし
2011年コードの旅
1
COMMAND パターン
いいものでありますように…
2
それってどんなん?
3
要求をオブジェクトとしてカプセル化することによって、異なる要求や、要求からなるキューやログにより、クライアントをパラメータ化する。また、取り消し可能なオペレーションをサ
ポートする。
“ ”
• 現代的な言語基盤ではイベントが似たようなしくみになってるよ!
• こうすると… • 複数の (Receiver に対する操作) 要求をまとめたり…
• 実行前までロールバックしやすくなったり…
• 気になってきました?
それってどんなしくみ?
• ざっくりいうとユーザーとみっつのクラスにわかれるよ
• Client – コマンド使いたいやつ
• Command オブジェクトつくって
• Receiver を設定するよ
• Invoker – 操作要求を受けると Command を適切な順によびだすよ
• Command – 前処理とかして Receiver に仕事を投げるよ
• Receiver – 実際の処理をおこなうよ
4
それってどんなしくみ?
5
INVOKER クラス
Invoker
6
それってどんなん?
• a.k.a. “Command Manager”
• ICommand オブジェクトを…
– undo/redo スタックに追加したり
• こうすると取り消し操作でつかえるよ
• あとでおはなしするかも
– 実行キューに追加したり
• これでトランザクション処理を実現できるよ
• これもあとでしゃべるかも
• ICommand ってなに?
7
COMMAND インターフェース
ICommand
8
それってどんなん?
• Invoker 向けに API を定義
– Invoker と Receiver を仲介
– おもに保持している Receiver.Action (任意のメソッド) をよびだすメソッドが定義される
• あと設定も…
– 実装では前処理を行ったりすることもある
• Receiver ってなんだっけ?
9
RECEIVER クラス
Receiver
10
それって(略)
• ターゲット オブジェクトとも…つまり Receiver
オブジェクトに対してコマンドが実行される
• Receiver.Action がよびだされると…
– 実際にコマンドのメイン処理がはいる
• しゃべってるだけじゃわかりにくいですよね?
– ソースコードみていきましょう!
– 主役:やる夫 (左)
11
デモやるよ
12
まとめ
• つまり…
– (コマンドの実行) 要求そのものをオブジェクトにしちゃう
• そうすると…
– いいとこ
• 最初に言ってたトランザクション処理とコマンド履歴の実装がちょっと楽になる
• ICommand オブジェクトはコマンドに関する設定を一時的に保持する空間として便利
– いくないとこ
• 使うべきか見極めるのがめんどくさい
• ICommand.Execute の引数が抽象的になりすぎて実装で困る!
13
文献
• Command pattern - Wikipedia, the free encyclopedia
– http://en.wikipedia.org/wiki/Command_pattern
• デザインパターン第11回「Commandパターン」 -
Bug Catharsis
– http://d.hatena.ne.jp/zecl/20071008/p1
• Skeleton of GOF's Design Pattern
– http://www002.upp.so-
net.ne.jp/ys_oota/mdp/Command/index.htm
• 2ch全AAイラスト化計画
– http://riceballman.fc2web.com/AA-
Illust/Data/NyusokuDeYaruo.html
14