銀行員からのRailsエンジニア

銀行員からのRailsエンジニア

銀行員から転身したサービス作りが大好きなRailsエンジニアのブログです。個人で開発したサービスをいくつか運営しており、今も新しいサービスを開発しています。転職して日々感じていること、個人開発サービス運営のことなどを等身大で書いていきます。

【Rubyによるデザインパターンまとめ6】コマンドパターン

コードの品質向上のため、Rubyデザインパターンを解説した名著である Rubyによるデザインパターン で紹介されているデザインパターンを1つずつまとめており、今回が第6弾です。(毎週1つが目標です!)

前回の記事(イテレータパターンのまとめ)はこちらです。
ysk-pro.hatenablog.com

この本で紹介されているサンプルコードをそのまま使うのは面白くないので、オリジナルのコードで説明しています。

今回は コマンド(Command)パターン についてまとめました。

f:id:ysk_pro:20191214214952p:plain

コマンドパターンとは

処理の内容をオブジェクトに閉じ込めて、実行する際はそのオブジェクトのメソッドを呼び出すパターンです。

処理の内容が書いたオブジェクトのことを、命令という意味の「コマンド」と呼んでいます。

これにより複数のコマンドをキューに入れて順に実行するようにしたり、処理の取り消しなどをシンプルに実装できるようになります。

文章の説明よりも実際のコードを見た方が分かりやすいと思うので、以下のサンプルコードをご覧ください。

サンプルコード

色々なことの勉強方法を出力する簡単なプログラムを考えてみます。(英語と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によるデザインパターン の中では、様々な例を用いて説明がされていると共に、この記事には書ききれなかった処理の取り消しなどをシンプルに実装しているコードなどが載っているので、ご興味ある方は是非合わせてご覧ください。

Rubyによるデザインパターン

Rubyによるデザインパターン

また、英語ですがこちらの記事の説明が分かりやすかったです。
refactoring.guru

次回は、アダプターパターン(Adapter)をまとめます。

来週も頑張ります!

(追記)
アダプターパターンについてまとめました!
是非合わせてご覧ください。
ysk-pro.hatenablog.com