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

apachehereというPHPのBuiltin Serverっぽいやつをつくった
apachehereというPHPのBuiltin ServerっぽいやつをつくったapachehereというPHPのBuiltin Serverっぽいやつをつくった
apachehereというPHPのBuiltin ServerっぽいやつをつくったJunichi Ishida
 
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をコンパイルしようKoichi Sasada
 
Tiny server
Tiny serverTiny server
Tiny serverkomem3
 
Server specのご紹介
Server specのご紹介Server specのご紹介
Server specのご紹介Akira Kaneda
 
TypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめTypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめYu Nobuoka
 
意識の低い自動化
意識の低い自動化意識の低い自動化
意識の低い自動化greenasparagus
 
Couch DB in 15minutes
Couch DB in 15minutesCouch DB in 15minutes
Couch DB in 15minutesYohei Sasaki
 
モダン JavaScript における非同期処理 - Promise, async/await -
モダン JavaScript における非同期処理 - Promise, async/await -モダン JavaScript における非同期処理 - Promise, async/await -
モダン JavaScript における非同期処理 - Promise, async/await -Kazunori Hashikuchi
 
Re: WebServer BenchMarking
Re: WebServer BenchMarkingRe: WebServer BenchMarking
Re: WebServer BenchMarkingRyo Tomidokoro
 
コンパイラ指向ReVIEW
コンパイラ指向ReVIEWコンパイラ指向ReVIEW
コンパイラ指向ReVIEWMasahiro Wakame
 
20091119_sinatraを使ってみた
20091119_sinatraを使ってみた20091119_sinatraを使ってみた
20091119_sinatraを使ってみたngi group.
 
テスティングフレームワークに入門してみた - Swift編
テスティングフレームワークに入門してみた - Swift編テスティングフレームワークに入門してみた - Swift編
テスティングフレームワークに入門してみた - Swift編Hisakuni Fujimoto
 
ストリーム処理エンジン「Zero」の開発と運用
ストリーム処理エンジン「Zero」の開発と運用ストリーム処理エンジン「Zero」の開発と運用
ストリーム処理エンジン「Zero」の開発と運用Eiichi Sato
 
LT#7 Hello coffeeしてきた
LT#7 Hello coffeeしてきたLT#7 Hello coffeeしてきた
LT#7 Hello coffeeしてきたShingo Inoue
 
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.jsTanUkkii
 
Javascriptのあれやこれやをまとめて説明してみる
Javascriptのあれやこれやをまとめて説明してみるJavascriptのあれやこれやをまとめて説明してみる
Javascriptのあれやこれやをまとめて説明してみるShunji Konishi
 
たのしいNode.js
たのしいNode.jsたのしいNode.js
たのしいNode.jsishiki-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はどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組みJavaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組みChihiro Ito
 
Operator reading and writing ( Operator SDK 編 )
Operator reading and writing ( Operator SDK 編 )Operator reading and writing ( Operator SDK 編 )
Operator reading and writing ( Operator SDK 編 )ロフト くん
 
「今そこにある危機」を捉える ~ pg_stat_statements revisited
「今そこにある危機」を捉える ~ pg_stat_statements revisited「今そこにある危機」を捉える ~ pg_stat_statements revisited
「今そこにある危機」を捉える ~ pg_stat_statements revisitedUptime Technologies LLC (JP)
 
Kubernetes ときどき Serverless -- cndjp第1回勉強会
Kubernetes ときどき Serverless -- cndjp第1回勉強会Kubernetes ときどき Serverless -- cndjp第1回勉強会
Kubernetes ときどき Serverless -- cndjp第1回勉強会Hiroshi Hayakawa
 
Using docker infrastructure
Using docker infrastructureUsing docker infrastructure
Using docker infrastructureJunya Niwa
 
DVGA writeup
DVGA writeupDVGA writeup
DVGA writeupYu Iwama
 
エンジニアのための勉強会 #5 『Container』
エンジニアのための勉強会 #5 『Container』エンジニアのための勉強会 #5 『Container』
エンジニアのための勉強会 #5 『Container』Naoki Yoshitake
 
Infrakit Docker_Tokyo_meetup
Infrakit Docker_Tokyo_meetupInfrakit Docker_Tokyo_meetup
Infrakit Docker_Tokyo_meetupYuji Oshima
 
Java concurrency in_practice_chap06
Java concurrency in_practice_chap06Java concurrency in_practice_chap06
Java concurrency in_practice_chap06ohtsuchi
 
Weeklycms20120218
Weeklycms20120218Weeklycms20120218
Weeklycms20120218Yoshi Sakai
 
Infrakitの話とk8s+GPUの話
Infrakitの話とk8s+GPUの話Infrakitの話とk8s+GPUの話
Infrakitの話とk8s+GPUの話Yuji Oshima
 
Rubyにおけるトレース機構の刷新
Rubyにおけるトレース機構の刷新Rubyにおけるトレース機構の刷新
Rubyにおけるトレース機構の刷新Koichi Sasada
 
超高速アプリ開発法
超高速アプリ開発法超高速アプリ開発法
超高速アプリ開発法Keiichi SASAKI
 
密着! nibohsiデプロイ 13:00-13:05 - railsアプリのデプロイ事例 -
密着! nibohsiデプロイ 13:00-13:05 - railsアプリのデプロイ事例 -密着! nibohsiデプロイ 13:00-13:05 - railsアプリのデプロイ事例 -
密着! nibohsiデプロイ 13:00-13:05 - railsアプリのデプロイ事例 -Yukihiko SAWANOBORI
 
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