状態遷移図・状態遷移表の書き方(基本編)
https://blog.goo.ne.jp/xmldtp/e/10c5e3d633b701a006bb4d615135a11d
で書いたことは、一般的なケース。実際には、以下のような状況がある。
その場合にどうやって状態遷移表を書くかについて
■ケース1:IF文で、プログラムを呼び出しているところがない。
Web系などである。フレームワークを使うとこうなるので、多くのケースはこちらに属する。
onClick()等(フレームワークの場合なんとかAction等)の関数が並び、IF文に分かれていない。
この場合、状態遷移を表す変数すらない時がある。
関数、メソッドのみが並んでいて、何かのタイミングでこれらの関数が起動されるというもの。
★この場合、onClick関数1つ、Actionメソッド1つを1イベントとすると書きやすい※
そして、状態遷移だが、状態を保持する関数がある場合は簡単だけど、ない場合がある。
ない場合、1つの状態ならばいいんだけど、そう考えにくい場合もある
(画面系のフレームワークで、イベントを処理したあと、正常終了なら他画面に遷移することが、
プログラムのほかに記述されているケース。struts等がこのケースにあたる)
★状態変数がない場合、上記で見つかったイベントを2つずつ取り出し(そのイベントをA,Bとする)
Aのイベント終了後(ないしはイベント処理実行中に)、ほかのイベントを経ないでBのイベントが実行できる場合
→AとBは同じ状態
Bのイベントを実行するにはCのイベント(例えば「戻る」ボタンクリック)を経ないと実行できない場合
→AとBは違う状態
と見なして、状態を分けることができる。
●この結果、画面の場合は、画面ごとに1状態となる。
(エラー画面も1状態か?とかはビミョーだけど)
※イベントは一般的には、外部割込みであり、外部割込み時の処理関数は別関数として書き、イベント登録時に
処理関数(のアドレス)も登録するようにしているから
■ケース2:状態変数が2つ(以上)ある
(1)2つの状態変数の組み合わせで、1つの状態の場合と、
(2)全く独立している(=無関係な)場合と
(3)ある変数のときに、さらに詳細に状態をとるとき
が考えられる。(1)のときは、その組み合わせが1状態となる。まとめるときは
SW-1 開始 | 動作中 | 終了
SW-2 ON | OFF | ON | OFF | ON | OFF
のような感じで、まとめていく
(2)は変数ごとに別々の図にする。
(3)は、(1)のケースと(2)のケース2通りある。
例えば上記の例で、ON OFFは、動作中しか関係ない場合
SW-1 開始 | 動作中 | 終了
SW-2 | ON | OFF |
というのもありだし
表1
SW-1 開始 | 動作中 | 終了
とし、別の表で
表2(動作中のとき)
ON | OFF
とするのもあり(実は(1)の場合でも、別の表にすることがある。
(2)のケースで(1)の書き方をすると、印刷できないくらい広がることがある)
■for,while文があり、何か回っているが、状態を表す変数やイベントを表す表が見つからない
この場合、テーブルがあることがある。そのテーブルがすでに状態遷移表になっている。
テーブルのある項目が受け取ったものの一部と一致していたら、そのテーブルに書いてある
処理を実行するという形になっている。上述の「ある項目」を探し、それらがイベント、状態になる。
とりあえず、思いついたのは、こんなかんじ。
https://blog.goo.ne.jp/xmldtp/e/10c5e3d633b701a006bb4d615135a11d
で書いたことは、一般的なケース。実際には、以下のような状況がある。
その場合にどうやって状態遷移表を書くかについて
■ケース1:IF文で、プログラムを呼び出しているところがない。
Web系などである。フレームワークを使うとこうなるので、多くのケースはこちらに属する。
onClick()等(フレームワークの場合なんとかAction等)の関数が並び、IF文に分かれていない。
この場合、状態遷移を表す変数すらない時がある。
関数、メソッドのみが並んでいて、何かのタイミングでこれらの関数が起動されるというもの。
★この場合、onClick関数1つ、Actionメソッド1つを1イベントとすると書きやすい※
そして、状態遷移だが、状態を保持する関数がある場合は簡単だけど、ない場合がある。
ない場合、1つの状態ならばいいんだけど、そう考えにくい場合もある
(画面系のフレームワークで、イベントを処理したあと、正常終了なら他画面に遷移することが、
プログラムのほかに記述されているケース。struts等がこのケースにあたる)
★状態変数がない場合、上記で見つかったイベントを2つずつ取り出し(そのイベントをA,Bとする)
Aのイベント終了後(ないしはイベント処理実行中に)、ほかのイベントを経ないでBのイベントが実行できる場合
→AとBは同じ状態
Bのイベントを実行するにはCのイベント(例えば「戻る」ボタンクリック)を経ないと実行できない場合
→AとBは違う状態
と見なして、状態を分けることができる。
●この結果、画面の場合は、画面ごとに1状態となる。
(エラー画面も1状態か?とかはビミョーだけど)
※イベントは一般的には、外部割込みであり、外部割込み時の処理関数は別関数として書き、イベント登録時に
処理関数(のアドレス)も登録するようにしているから
■ケース2:状態変数が2つ(以上)ある
(1)2つの状態変数の組み合わせで、1つの状態の場合と、
(2)全く独立している(=無関係な)場合と
(3)ある変数のときに、さらに詳細に状態をとるとき
が考えられる。(1)のときは、その組み合わせが1状態となる。まとめるときは
SW-1 開始 | 動作中 | 終了
SW-2 ON | OFF | ON | OFF | ON | OFF
のような感じで、まとめていく
(2)は変数ごとに別々の図にする。
(3)は、(1)のケースと(2)のケース2通りある。
例えば上記の例で、ON OFFは、動作中しか関係ない場合
SW-1 開始 | 動作中 | 終了
SW-2 | ON | OFF |
というのもありだし
表1
SW-1 開始 | 動作中 | 終了
とし、別の表で
表2(動作中のとき)
ON | OFF
とするのもあり(実は(1)の場合でも、別の表にすることがある。
(2)のケースで(1)の書き方をすると、印刷できないくらい広がることがある)
■for,while文があり、何か回っているが、状態を表す変数やイベントを表す表が見つからない
この場合、テーブルがあることがある。そのテーブルがすでに状態遷移表になっている。
テーブルのある項目が受け取ったものの一部と一致していたら、そのテーブルに書いてある
処理を実行するという形になっている。上述の「ある項目」を探し、それらがイベント、状態になる。
とりあえず、思いついたのは、こんなかんじ。