コードの品質向上のため、Rubyでデザインパターンを解説した名著である Rubyによるデザインパターン で紹介されているデザインパターンを1つずつまとめており、今回が第6弾です。(毎週1つが目標です!)
前回の記事(イテレータパターンのまとめ)はこちらです。
ysk-pro.hatenablog.com
この本で紹介されているサンプルコードをそのまま使うのは面白くないので、オリジナルのコードで説明しています。
今回は コマンド(Command)パターン についてまとめました。
コマンドパターンとは
処理の内容をオブジェクトに閉じ込めて、実行する際はそのオブジェクトのメソッドを呼び出すパターンです。
処理の内容が書いたオブジェクトのことを、命令という意味の「コマンド」と呼んでいます。
これにより複数のコマンドをキューに入れて順に実行するようにしたり、処理の取り消しなどをシンプルに実装できるようになります。
文章の説明よりも実際のコードを見た方が分かりやすいと思うので、以下のサンプルコードをご覧ください。
サンプルコード
色々なことの勉強方法を出力する簡単なプログラムを考えてみます。(英語とAtCoder(競技プログラミング)の勉強頑張ってます)
コマンドパターンで実装した例がこちらです。
class Command def execute raise 'メソッドが定義されていないよ' end end class EnglishCommand < Command def execute puts 'オンライン英会話レッスンを行う' end end class AtcoderCommand < Command def execute puts '過去問を解く' end end class Study attr_reader :command def initialize(command) @command = command end def do command.execute end end Study.new(EnglishCommand.new).do Study.new(AtcoderCommand.new).do
Studyクラスのインスタンスを作る際に引数として渡しているオブジェクトが「コマンド」です。
Studyクラスのインスタンスを実行すると、コマンドの処理が実行されます。
実行結果は次のようになります。
オンライン英会話レッスンを行う 過去問を解く
ストラテジーパターンとの違い
ここまで読んで、「あれ?ストラテジーパターンと一緒じゃない?」と思った方がいると思います。(僕も思いました。)
(ストラテジーパターンについての記事はこちら)
ysk-pro.hatenablog.com
コマンドパターンとストラテジーパターンには次の違いがあるそうです。(難しい...)
- コマンドパターンは、任意の処理をコマンドとしてオブジェクト化する。そしてそのコマンドをキューに入れたり、複数のコマンドを一括で呼び出したりする場合によく使われる。
おわりに
ここまで読んでいただきありがとうございます。
Rubyによるデザインパターン の中では、様々な例を用いて説明がされていると共に、この記事には書ききれなかった処理の取り消しなどをシンプルに実装しているコードなどが載っているので、ご興味ある方は是非合わせてご覧ください。
- 作者:Russ Olsen,ラス・オルセン
- 出版社/メーカー: ピアソン桐原
- 発売日: 2009/04/01
- メディア: 単行本
また、英語ですがこちらの記事の説明が分かりやすかったです。
refactoring.guru
次回は、アダプターパターン(Adapter)をまとめます。
来週も頑張ります!
(追記)
アダプターパターンについてまとめました!
是非合わせてご覧ください。
ysk-pro.hatenablog.com