データベースと状態遷移表
前に、俺が考える2次元の表の例としてこんなのを書いた。
本1 | 本2 | 本3 | |
---|---|---|---|
定価 | 1,000 | 2,000 | 3,000 |
古本屋での売値 | 200 | 1000 | 700 |
オークションでの価格 | 300 | 500 | 10000 |
これはあんまり例が良くなかったな。
俺が漠然とデータベースっぽいものが必要かなあと思っているのは、考えてみれば状態遷移表のようなものだ。
状態A | 状態B | 状態C | |
---|---|---|---|
イベントa | 動作1 | 動作1 | 動作2 |
イベントb | 動作3 | 動作4 | 動作2 |
イベントc | 動作1 | 動作1 | 動作5 |
でも結局同じか? イベントと状態のどっちを軸にするかで違うけど、横軸に属性、縦軸にインスタンスが並んだ表と解釈できるか。状態ごとの動作を属性としてもったイベントオブジェクトを作るか、イベントごとの動作を属性として持った状態オブジェクトを作る。
ただ、なんかしっくりこないのは、軸の取り方によって属性の種類になったりオブジェクトになったりしてしまうことだ。
まあ、それは仕方ないのか?
縦軸と横軸を等価に扱える表を、言語に移し変える時でも軸に優劣をつけてネストさせなければならない。
if(状態==A){
if(イベント==a)動作1
if(イベント==b)動作3
if(イベント==c)動作1
}
とするか
if(イベント==a){
if(状態==A)動作1
if(状態==B)動作3
if(状態==C)動作1
}
とするか。
もちろん配列があればそれを使うという手はあるのだけど。
話を戻して、仮に巨大な状態遷移表があってそれをデータベース化したいとなったらどうなるか。
さっきのはやっぱりちょっと違うかな。いや、結局同じか? たぶん、こうなるかな。
イベント名 | 状態A | 状態B | 状態C | |
---|---|---|---|---|
インスタンス1--> | イベントa | 動作1 | 動作1 | 動作2 |
インスタンス2--> | イベントb | 動作3 | 動作4 | 動作2 |
インスタンス3--> | イベントc | 動作1 | 動作1 | 動作5 |
あるいは
状態 | イベントa | イベントb | イベントc | |
---|---|---|---|---|
インスタンス1--> | 状態A | 動作1 | 動作3 | 動作1 |
インスタンス2--> | 状態B | 動作1 | 動作4 | 動作1 |
インスタンス3--> | 状態C | 動作2 | 動作2 | 動作5 |
横軸の項目を一つ増やして、状態遷移表で縦軸になっていた項目を横軸に含める。
状態とイベントを同じように扱えないのがしっくりこないけど……
あっ、分かった。こうじゃねえや。
状態 | イベント | 動作 | |
---|---|---|---|
インスタンス1--> | 状態A | イベントa | 動作1 |
インスタンス2--> | 状態A | イベントb | 動作3 |
インスタンス3--> | 状態A | イベントc | 動作1 |
インスタンス4--> | 状態B | イベントa | 動作1 |
インスタンス5--> | 状態B | イベントb | 動作4 |
インスタンス6--> | 状態B | イベントc | 動作1 |
インスタンス7--> | 状態C | イベントa | 動作2 |
インスタンス8--> | 状態C | イベントb | 動作2 |
インスタンス9--> | 状態C | イベントc | 動作5 |
こうだ。
これなら状態もイベントも同じように扱える。
そうか、マス目1つ1つをインスタンスにするのか。見た目の表の形に囚われてたな。これなら軸が3つ以上になっても問題ないし。まあ、見た目は分かりづらいけど。