状態遷移表とは?
状態遷移表とは、システムの振る舞いを、各状態の遷移毎、また状態とイベントの掛け合わせ毎に表形式で示したものです。
状態遷移表の代表的な表示形式には、次の2つがあります。
状態遷移表の代表的な表示形式には、次の2つがあります。
- 「現在の状態」と「次の状態」を縦軸と横軸で示し、交差する欄に遷移を発生させるイベントを記述する
- 「状態」と「イベント」を縦軸と横軸で示し、交差する欄に、そのイベントが起きたときに「遷移すべき状態」を記述する
ステートマシン図と状態遷移表、それぞれの利点
システムの振る舞いを表す図としては、UMLのステートマシン図(状態遷移図)が代表的です。ステートマシン図と状態遷移表は、共に同様の情報を提供する記法ですが、図と表では見えるものが異なります。それぞれの特長は次の通りです。
- ステートマシン図:システムの全体像、一連の流れを理解しやすい
- 状態遷移表:全ての状態とイベントの組合せを網羅でき、図では見えない、且つ想定しないイベントの対処も確認できる
状態遷移表を使うことで、図では見えない部分を網羅的に洗い出し、設計段階から、抜けや漏れを効率良く防げる利点があります。
状態遷移表を用いて状態遷移を確認する
では、実際に例を見ていきましょう。
これは、一般的なCDプレイヤーの操作画面の振る舞いを表したステートマシン図です。(このステートマシン図の作成方法は、こちら)
また実際にツールを使いたい方は、ページ最後にツールの紹介とサンプル図などのダウンロードリンクがあります。
これは、一般的なCDプレイヤーの操作画面の振る舞いを表したステートマシン図です。(このステートマシン図の作成方法は、こちら)
また実際にツールを使いたい方は、ページ最後にツールの紹介とサンプル図などのダウンロードリンクがあります。
「前状態―後状態」の状態遷移表
この振る舞いを「前状態―後状態」の状態遷移表で表します。
縦軸が現在の状態、横軸が次の状態です。表中のセルには、各状態の遷移時にトリガーとなるイベントが記述されています。
空欄は、現在の状態から次の状態への遷移は想定していない、もしくは定義されていないことを示します。
空欄は、現在の状態から次の状態への遷移は想定していない、もしくは定義されていないことを示します。
では、縦軸が「再生中」、横軸が状態「停止中」のセルを見てみましょう。
イベント「停止ボタンが押された」が割り当てられていて、状態遷移が起きることがわかります。
イベント「停止ボタンが押された」が割り当てられていて、状態遷移が起きることがわかります。
また、この表のセルをひとつずつ調べると、状態遷移の要不要を確認することができます。
例えば、縦軸「一時停止中」、横軸「停止中」のセルを見てみます。何も記述されていないので「一時停止中」から「停止中」へ遷移する処理がないということですが、これが意図的であるか、設計の漏れなのか、を担当者に確認して明確にすることができます。
このように、空欄を一つずつ確認することで、設計から漏れている処理を発見することができます。
例えば、縦軸「一時停止中」、横軸「停止中」のセルを見てみます。何も記述されていないので「一時停止中」から「停止中」へ遷移する処理がないということですが、これが意図的であるか、設計の漏れなのか、を担当者に確認して明確にすることができます。
このように、空欄を一つずつ確認することで、設計から漏れている処理を発見することができます。
「状態―イベント」の状態遷移表
次に「状態」と「イベント」の状態遷移表を見てみましょう。
縦軸に状態、横軸にイベント、表中の欄には、イベントが発生した場合に遷移する先の状態が記述されています。
空欄は、縦軸の状態において、イベントの発生を想定していないことを示しています。
空欄は、縦軸の状態において、イベントの発生を想定していないことを示しています。
例えば「再生中」に、イベント「再生ボタンが押された」が発生すると、状態「一時停止中」へ遷移することがわかります。
この表の各欄を調べると、ステートマシン図では見えないイベントの対処を決めることができます。
たとえば、停止中に早送りボタンが押されたときは、再生位置を次の曲の冒頭に変更し、引き続き停止させておきたかったとします。縦軸の状態「停止中」と横軸のイベント「早送りボタンが押された」の交差するセルをみると、空欄の為、ここの状態遷移が抜けていることが分かります。
たとえば、停止中に早送りボタンが押されたときは、再生位置を次の曲の冒頭に変更し、引き続き停止させておきたかったとします。縦軸の状態「停止中」と横軸のイベント「早送りボタンが押された」の交差するセルをみると、空欄の為、ここの状態遷移が抜けていることが分かります。
また、ある状態において想定しないイベントが起きたときの対応を決めることもできます。
たとえば、停止中に停止ボタンを押しても無視したいとします。このときは、状態「停止中」とイベント「停止ボタンが押された」が交差するセルに「無視する(ignore)」と記述することで定義できます。
たとえば、停止中に停止ボタンを押しても無視したいとします。このときは、状態「停止中」とイベント「停止ボタンが押された」が交差するセルに「無視する(ignore)」と記述することで定義できます。
もうひとつの例として、再生中には、何かのボタンが押されることなしにボタンが離されることはない(そのようなことが起きるのはおかしい)としましょう。このときは「再生中」とイベント「早送りボタンが離された」が交差するセルに「起き得ない(cannot happen、can't happen、CHなど)」と記述します。「起き得ない」と割り当てることで、イベントが発生した際に問題が起きていることが判るようエラーを発生させたり、処理を中断させるなどの対処を設計できます。
いかがでしたか?
このように、状態遷移表を使うことで、ステートマシン図のみでは見えなかった、想定しないイベントや仕様の抜け漏れなどに気付き、対処することができます。
このように、状態遷移表を使うことで、ステートマシン図のみでは見えなかった、想定しないイベントや仕様の抜け漏れなどに気付き、対処することができます。
さっそく、状態遷移表を使ってみましょう
市販のUML用のツールの多くは、ステートマシン図と状態遷移表を双方向に往来できるように作られています。
UMLモデリングツールastah*もその一つです。astah*は、50日間無償でご利用いただけるので、ぜひお試しください。
既にastah*をお使いの方も、状態遷移表をインストールするだけ(無償)で、状態遷移表を自動生成できます。ぜひご活用ください。
UMLモデリングツールastah*もその一つです。astah*は、50日間無償でご利用いただけるので、ぜひお試しください。
既にastah*をお使いの方も、状態遷移表をインストールするだけ(無償)で、状態遷移表を自動生成できます。ぜひご活用ください。