簡潔さは力なり!Rubyでステートパターン(State Pattern)を実装する

Rubyでステートパターンを勉強したので、その学習メモです。

サンプルは前回の記事を発展させたもの。

ステート・パターンとは

状態遷移をわかりやすく実装するためのパターン。

各状態をクラスで定義する。各状態は、抽象的なスーパークラスのサブクラスになる。

Spec

以下のような仕様を実装したい。

停止中に再生ボタンをクリックと動作中を表示
停止中に停止ボタンをクリックとなにも表示しない
動作中に再生ボタンをクリックと一時停止を表示
動作中に停止ボタンをクリックと停止を表示
一時停止中に再生ボタンをクリックする動作中を表示
一時停止中に停止ボタンをクリックする停止中を表示

状態は、停止中、一時停止中、実行中の3つ。この3つをクラスにする。

実装比較

普通の実装

if文が多いですね。

ここで、さらにBoot中、Shutdown中なんて2つの状態追加がはいったらなかなか死ねます。

パターン適用後

感動のボイント

感動のポイントをアピール。自分はここに感動した。


  def start
if (@status == OFFLINE)
  @status = ONLINE
  @textValue = "動作中"
  return
end

if (@status == ONLINE)
  @status = SUSPEND
  @textValue = "一時停止中"
  return
end

if (@status == SUSPEND)
  @status = ONLINE
  @textValue = "動作中"
  return
end

end

def stop

if (@status == ONLINE)
  @status = OFFLINE
  @textValue = "停止中"
  return
end

if (@status == SUSPEND)
  @status = OFFLINE
  @textValue = "停止中"
  return
end

end



def start
@status = @status.start
end

def stop @status = @status.stop end


なんという簡潔さだろうか!ふるえちゃう。