Stateパターン

組み込み系で重宝するのが,このStateパターン.組み込み系ではハードウェアの状態に応じて動作をするプログラムを書く必要があるので,状態に応じて何らかの分岐処理を実現する必要がある.

ここでは簡単なCDプレーヤを考えてみる.

表 1 CDプレイヤーの遷移表
ボタン 機能
Play or Pause 再生/一時停止
Stop 停止

状態遷移図

複数の状態と入力によってどのように遷移するのかを表したものとして状態遷移図がある.

state_transition.png

この例では playflagpauseflag で状態を保持しているが,このようにフラグを使いはじめると,プログラムを拡張するたびに際限なくフラグが増えていって,すぐに手が負えなくなる.そしていつの間にかモンスターメソッドになってしまう.

このコードの問題点は,まず3つ以上の状態をフラグで管理している点にある. フラグを使って良いのは2つの状態を管理する場合のみ である.状態が3つ以上ある場合はフラグではなく列挙体を使わなければならない.

状態遷移表

状態と入力の組み合わせを網羅するには,状態遷移図より状態遷移表を書いたほうが良い.

表 2 状態遷移図
イベント / 状態 アイドル(ST_IDLE) 再生中(ST_PLAY) 一時停止中(ST_PAUSE)
停止(EV_STOP) 無視 アイドルへ アイドルへ
再生 / 一時停止(EV_PLAY_PAUSE) 再生へ 一時停止へ 再生へ