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

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