オブジェクト指向開発〜動的分析その2/高度な状態管理

状態について詳しく。

より詳細な状態の把握

例えばCDプレーヤーの場合、『早送りボタン』を「押し続けている間」早送り操作が行われる。このような、ボタンを押している間だけ状態が変わるという事をどの様に表現すればいいのか。これは、他の状態同様に表現する事が出来る。
「押し続けている間」状態は保持されるが、イベントが起きるのは一瞬。その間にイベントが発生し続ける訳ではない事に注意。イベントには時間がないため、時間がかかるようであれば、それはイベントでなく状態として切り出されるべき。

自己遷移

CDプレーヤーの『次曲ボタン』の場合、「再生」から「再生」に状態遷移すると考えられる。この場合、状態は変化しないと言えるか。この時は、遷移元と遷移先が同じであるだけ痔、状態遷移自体は行われている。このような状態遷移を、『自己遷移』と言う。
状態遷移が行われない場合は『内部動作』と呼ばれ、再生中に『ランダム再生モード』に設定する様な場合がこれに当たる。

入退場動作

自己遷移と内部動作の違いを理解するために、入退場動作を知る必要がある。家に上がるときには靴を脱ぐ様に、ある状態に移る際に必ずある動作をしなければならない場合がある。ある状態に入る際に必ず行われる動作を「入場動作」と言い、ある状態から抜ける際に必ず行われる動作を「退場動作」と言う。
自己遷移はあくまで遷移であり、その遷移時には作業を中断し、一度状態の外に出て再び入ってくる事になる。つまり、必ず入退場動作が行われる。一方、内部動作は、あくまでその状態の内部で何かが行われるにすぎない。つまり、入退場動作は行われない。
入退場動作はこれらの判断のためにある訳ではないが、十分な判断材料にはなる。

状態の入れ子

CDプレーヤーの場合、電源OFFやトレー排出という状態に遷移するためにはあらゆる動作を即中止し、強制的にその状態に遷移する事になる。このような状態を遷移図に取り入れると、図が複雑になる。このような時に便利なのが、状態の入れ子。ハレル図では、状態をグループ化する事が出来る。
例えば、「停止中」「再生中」「一時停止中」などの状態は、トレーが収納されていなければ、イベントもおこらず遷移もしない。つまり、これらは「トレーが収納されている」状態としてまとめる事が出来る。
状態は全て同じレベルに存在している物ではなく、小さな状態を大きな状態が含むという様に階層化している。状態の入れ子で、大きな状態を『スーパー状態』と呼び、それに含まれる小さな状態を『サブ状態』と呼ぶ。スーパー状態の性格は、全てのサブ状態にも適用される。注意すべき事として、状態の遷移元がスーパー状態であっても、再び戻る時の遷移先は低レベルのサブ状態であるという事。
状態の遷移について必ずしも論理的にきれいに割り切れる訳ではない。あくまで、ユーザーにとってどの状態に遷移するのが一番都合いいかが大きく影響する。 AM/FMラジオの場合で、音源のステレオ/モノラルを切り替えられるとする。FM状態でステレオからモノラルに状態遷移した後で、更にAM状態に遷移し FM状態に戻った場合、ステレオとモノラルのどちらに戻れば良いか。これは明確に決めるのではなく、最後の状態を履歴として保持しそれを図に表現する事が良い。

並行した状態

CDプレーヤーの場合、「リピートモード」を「停止中」に設定する事が出来る。この場合、リピートモードという状態を持つ事になる。この事から、1つのクラスの中に、複数の並行した状態の変化が存在する事がわかる。これは、ごく自然な事であり、これを自然であると受け止められる事が重要。

条件付き状態遷移

エラー処理などを考えると、その時の条件によっては同じイベントが起こっても遷移する先が変わる、あるいはイベント自体が無視されるという事がある。ハレル図ではこのような場合を記述する方法が用意されていて、これが『条件付き状態遷移』。

静的分析との関係

静的構造は、動的モデルとは別次元の問題である様に見えつつも、実は非常に強い関連がある。

入退場動作/内部動作
入退場動作や内部動作は、原則として操作として扱われる。ただし、これらは基本的にクラス内部からのみ呼ばれる事が多い。そのため、publicではなくprotectedとして扱う。
状態の入れ子
状態の変化を1つの属性として扱う事は、状態の入れ子があるばあい良い方法ではない。スーパー状態の中の状態遷移を1つの状態系列と考えて1つの属性を割り当て、それとは別にその外の状態遷移を別の系列と考えて1つ割り当てる。
並行した状態
状態の入れ子同様に、それぞれの状態系統ごとに1つの属性で状態を管理する。

動的分析によって得られた結果は、あくまでも静的要素の一部でしかない。状態図は、ある状態からある状態へと遷移していくという流れが1つの次元で閉じている、『有限状態』の管理のための物。

プロフィール

このブログ記事について

このページは、koshigoeが2005年12月16日 21:53に書いたブログ記事です。

ひとつ前のブログ記事は「広告、広告、広告ってさ…」です。

次のブログ記事は「writelyは筆が進む」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。