前回、ステート・パターンをRubyで実装してみた。

これを機に、ステート・マシンもちゃんと実装まで学んでおこうとおもう。

ステート・マシンとは

ステート・マシンとは、システムの振る舞いの仕組み。

<p>
  ステートマシン図とは、それをUML記法で表したもの。
</p>

<ul class="org-ul">
  <li>
    <a href="https://ja.wikipedia.org/wiki/%E6%9C%89%E9%99%90%E3%82%AA%E3%83%BC%E3%83%88%E3%83%9E%E3%83%88%E3%83%B3">有限オートマトン - Wikipedia</a>
  </li>
</ul>

ステート・マシンの構成要素

ステート・マシンの構成要素は以下のとおり。

<ul class="org-ul">
  <li>
    状態(State) ・・・なんて定義してよいやら。
  </li>
  <li>
    遷移(Transition)・・・ひとつの状態から別の状態へ移行すること
  </li>
</ul>

<p>
  遷移はさらに以下の3つに分解できる。
</p>

<ul class="org-ul">
  <li>
    イベント(Event) ・・・遷移のきっかけ、トリが
  </li>
  <li>
    ガード(guard) ・・・遷移するための条件(true/false)
  </li>
  <li>
    アクション(Action) ・・・遷移時の動作
  </li>
</ul>

<p>
  以下のように記述する。
</p>

<pre><code>Event[Guard]/Action

<p>
  また、状態に関係する動作をアクティビティという。アクションは遷移に関係する。
</p>

<pre><code>do/Activity

UML図

以下のようなステート・マシンをRubyで実装する。

<div class="figure">
  <p>
    <img src="https://futurismo.biz/wp-content/uploads/wpid-rubytk_state_machine2.png" alt="rubytk_state_machine.png" />
  </p></p>
</div>

<p>
  前回は自分のステータスをもとに振る舞いを変更したけれども、 今回は、別プロセスの状態によって、振る舞いを変えるようにしてみる。
</p>

<div class="figure">
  <p>
    <img src="https://futurismo.biz/wp-content/uploads/wpid-rubytk_state_sequence2.png" alt="rubytk_state_sequence.png" />
  </p></p>
</div></p>

実装