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
なんという簡潔さだろうか!ふるえちゃう。