SlideShare a Scribd company logo
1 of 14
Download to read offline
Command パターンのおはなし

     2011年コードの旅




                    1
いいものでありますように…

COMMAND パターン


                2
それってどんなん?

“   要求をオブジェクトとしてカプセル化することによって、異な
    る要求や、要求からなるキューやログにより、クライアントを
    パラメータ化する。また、取り消し可能なオペレーションをサ
    ポートする。



• 現代的な言語基盤ではイベントが似たようなし
                                   ”
  くみになってるよ!
• こうすると…
 • 複数の (Receiver に対する操作) 要求をまとめたり…
 • 実行前までロールバックしやすくなったり…
 • 気になってきました?


                                     3
それってどんなしくみ?
• ざっくりいうとユーザーとみっつのクラスにわかれるよ
• Client
   – コマンド使いたいやつ
      • Command オブジェクトつくって
      • Receiver を設定するよ

• Invoker
   – 操作要求を受けると Command を適切な順によびだすよ
• Command
   – 前処理とかして Receiver に仕事を投げるよ
• Receiver
   – 実際の処理をおこなうよ


                                     4
それってどんなしくみ?




              5
Invoker

INVOKER クラス


              6
それってどんなん?
• a.k.a. “Command Manager”
• ICommand オブジェクトを…
  – undo/redo スタックに追加したり
    • こうすると取り消し操作でつかえるよ
    • あとでおはなしするかも
  – 実行キューに追加したり
    • これでトランザクション処理を実現できるよ
    • これもあとでしゃべるかも
• ICommand ってなに?


                             7
ICommand

COMMAND インターフェース


                   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

More Related Content

What's hot

コンパイラ指向ReVIEW
コンパイラ指向ReVIEWコンパイラ指向ReVIEW
コンパイラ指向ReVIEW
Masahiro Wakame
 
20091119_sinatraを使ってみた
20091119_sinatraを使ってみた20091119_sinatraを使ってみた
20091119_sinatraを使ってみた
ngi group.
 
Javascriptのあれやこれやをまとめて説明してみる
Javascriptのあれやこれやをまとめて説明してみるJavascriptのあれやこれやをまとめて説明してみる
Javascriptのあれやこれやをまとめて説明してみる
Shunji Konishi
 
たのしいNode.js
たのしいNode.jsたのしいNode.js
たのしいNode.js
ishiki-takai
 

What's hot (20)

apachehereというPHPのBuiltin Serverっぽいやつをつくった
apachehereというPHPのBuiltin ServerっぽいやつをつくったapachehereというPHPのBuiltin Serverっぽいやつをつくった
apachehereというPHPのBuiltin Serverっぽいやつをつくった
 
Ansible入門
Ansible入門Ansible入門
Ansible入門
 
Cookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
Cookpad 17 day Tech internship 2017 言語処理系入門 RubyをコンパイルしようCookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
Cookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
 
Tiny server
Tiny serverTiny server
Tiny server
 
Server specのご紹介
Server specのご紹介Server specのご紹介
Server specのご紹介
 
TypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめTypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめ
 
意識の低い自動化
意識の低い自動化意識の低い自動化
意識の低い自動化
 
Clrh 20140301
Clrh 20140301Clrh 20140301
Clrh 20140301
 
Couch DB in 15minutes
Couch DB in 15minutesCouch DB in 15minutes
Couch DB in 15minutes
 
モダン JavaScript における非同期処理 - Promise, async/await -
モダン JavaScript における非同期処理 - Promise, async/await -モダン JavaScript における非同期処理 - Promise, async/await -
モダン JavaScript における非同期処理 - Promise, async/await -
 
Re: WebServer BenchMarking
Re: WebServer BenchMarkingRe: WebServer BenchMarking
Re: WebServer BenchMarking
 
コンパイラ指向ReVIEW
コンパイラ指向ReVIEWコンパイラ指向ReVIEW
コンパイラ指向ReVIEW
 
20091119_sinatraを使ってみた
20091119_sinatraを使ってみた20091119_sinatraを使ってみた
20091119_sinatraを使ってみた
 
テスティングフレームワークに入門してみた - Swift編
テスティングフレームワークに入門してみた - Swift編テスティングフレームワークに入門してみた - Swift編
テスティングフレームワークに入門してみた - Swift編
 
ストリーム処理エンジン「Zero」の開発と運用
ストリーム処理エンジン「Zero」の開発と運用ストリーム処理エンジン「Zero」の開発と運用
ストリーム処理エンジン「Zero」の開発と運用
 
LT#7 Hello coffeeしてきた
LT#7 Hello coffeeしてきたLT#7 Hello coffeeしてきた
LT#7 Hello coffeeしてきた
 
Isomorphic web development with scala and scala.js
Isomorphic web development  with scala and scala.jsIsomorphic web development  with scala and scala.js
Isomorphic web development with scala and scala.js
 
キメるClojure
キメるClojureキメるClojure
キメるClojure
 
Javascriptのあれやこれやをまとめて説明してみる
Javascriptのあれやこれやをまとめて説明してみるJavascriptのあれやこれやをまとめて説明してみる
Javascriptのあれやこれやをまとめて説明してみる
 
たのしいNode.js
たのしいNode.jsたのしいNode.js
たのしいNode.js
 

Similar to Command パターン

Java concurrency in_practice_chap06
Java concurrency in_practice_chap06Java concurrency in_practice_chap06
Java concurrency in_practice_chap06
ohtsuchi
 
fluentd を利用した大規模ウェブサービスのロギング
fluentd を利用した大規模ウェブサービスのロギングfluentd を利用した大規模ウェブサービスのロギング
fluentd を利用した大規模ウェブサービスのロギング
Yuichi Tateno
 

Similar to Command パターン (20)

Javaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組みJavaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組み
 
Openshift 20191128
Openshift 20191128Openshift 20191128
Openshift 20191128
 
Operator reading and writing ( Operator SDK 編 )
Operator reading and writing ( Operator SDK 編 )Operator reading and writing ( Operator SDK 編 )
Operator reading and writing ( Operator SDK 編 )
 
Openshift 20191121
Openshift 20191121Openshift 20191121
Openshift 20191121
 
「今そこにある危機」を捉える ~ pg_stat_statements revisited
「今そこにある危機」を捉える ~ pg_stat_statements revisited「今そこにある危機」を捉える ~ pg_stat_statements revisited
「今そこにある危機」を捉える ~ pg_stat_statements revisited
 
Kubernetes ときどき Serverless -- cndjp第1回勉強会
Kubernetes ときどき Serverless -- cndjp第1回勉強会Kubernetes ときどき Serverless -- cndjp第1回勉強会
Kubernetes ときどき Serverless -- cndjp第1回勉強会
 
Using docker infrastructure
Using docker infrastructureUsing docker infrastructure
Using docker infrastructure
 
DVGA writeup
DVGA writeupDVGA writeup
DVGA writeup
 
Dockerとdev ops
Dockerとdev opsDockerとdev ops
Dockerとdev ops
 
エンジニアのための勉強会 #5 『Container』
エンジニアのための勉強会 #5 『Container』エンジニアのための勉強会 #5 『Container』
エンジニアのための勉強会 #5 『Container』
 
Infrakit Docker_Tokyo_meetup
Infrakit Docker_Tokyo_meetupInfrakit Docker_Tokyo_meetup
Infrakit Docker_Tokyo_meetup
 
Java concurrency in_practice_chap06
Java concurrency in_practice_chap06Java concurrency in_practice_chap06
Java concurrency in_practice_chap06
 
Docker勉強会
Docker勉強会Docker勉強会
Docker勉強会
 
Weeklycms20120218
Weeklycms20120218Weeklycms20120218
Weeklycms20120218
 
Infrakitの話とk8s+GPUの話
Infrakitの話とk8s+GPUの話Infrakitの話とk8s+GPUの話
Infrakitの話とk8s+GPUの話
 
Rubyにおけるトレース機構の刷新
Rubyにおけるトレース機構の刷新Rubyにおけるトレース機構の刷新
Rubyにおけるトレース機構の刷新
 
超高速アプリ開発法
超高速アプリ開発法超高速アプリ開発法
超高速アプリ開発法
 
密着! nibohsiデプロイ 13:00-13:05 - railsアプリのデプロイ事例 -
密着! nibohsiデプロイ 13:00-13:05 - railsアプリのデプロイ事例 -密着! nibohsiデプロイ 13:00-13:05 - railsアプリのデプロイ事例 -
密着! nibohsiデプロイ 13:00-13:05 - railsアプリのデプロイ事例 -
 
20170124 linux basic_2
20170124 linux basic_220170124 linux basic_2
20170124 linux basic_2
 
fluentd を利用した大規模ウェブサービスのロギング
fluentd を利用した大規模ウェブサービスのロギングfluentd を利用した大規模ウェブサービスのロギング
fluentd を利用した大規模ウェブサービスのロギング
 

Command パターン

  • 1. Command パターンのおはなし 2011年コードの旅 1
  • 3. それってどんなん? “ 要求をオブジェクトとしてカプセル化することによって、異な る要求や、要求からなるキューやログにより、クライアントを パラメータ化する。また、取り消し可能なオペレーションをサ ポートする。 • 現代的な言語基盤ではイベントが似たようなし ” くみになってるよ! • こうすると… • 複数の (Receiver に対する操作) 要求をまとめたり… • 実行前までロールバックしやすくなったり… • 気になってきました? 3
  • 4. それってどんなしくみ? • ざっくりいうとユーザーとみっつのクラスにわかれるよ • Client – コマンド使いたいやつ • Command オブジェクトつくって • Receiver を設定するよ • Invoker – 操作要求を受けると Command を適切な順によびだすよ • Command – 前処理とかして Receiver に仕事を投げるよ • Receiver – 実際の処理をおこなうよ 4
  • 7. それってどんなん? • a.k.a. “Command Manager” • ICommand オブジェクトを… – undo/redo スタックに追加したり • こうすると取り消し操作でつかえるよ • あとでおはなしするかも – 実行キューに追加したり • これでトランザクション処理を実現できるよ • これもあとでしゃべるかも • ICommand ってなに? 7
  • 9. それってどんなん? • Invoker 向けに API を定義 – Invoker と Receiver を仲介 – おもに保持している Receiver.Action (任意のメソッド) をよび だすメソッドが定義される • あと設定も… – 実装では前処理を行ったりすることもある • Receiver ってなんだっけ? 9
  • 11. それって(略) • ターゲット オブジェクトとも…つまり Receiver オブジェクトに対してコマンドが実行される • Receiver.Action がよびだされると… – 実際にコマンドのメイン処理がはいる • しゃべってるだけじゃわかりにくいですよね? – ソースコードみていきましょう! – 主役:やる夫 (左) 11
  • 13. まとめ • つまり… – (コマンドの実行) 要求そのものをオブジェクトにしちゃう • そうすると… – いいとこ • 最初に言ってたトランザクション処理とコマンド履歴の実装が ちょっと楽になる • ICommand オブジェクトはコマンドに関する設定を一時的に保持す る空間として便利 – いくないとこ • 使うべきか見極めるのがめんどくさい • ICommand.Execute の引数が抽象的になりすぎて実装で困る! 13
  • 14. 文献 • 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