オブジェクト指向開発〜動的分析その1/状態

クラスの状態。

グローバル変数

C言語でグローバル変数が問題になるのは、それを管理する方法が確立されていないから。オブジェクト指向では、クラスのデータメンバというグローバル変数に似た性質の変数が登場する。これが問題にならないのは、データメンバの管理方法が確立されているから。

状態

世の中に存在するほとんどは、状態とその変化を持っている。クラスが現実に存在する物をプログラム化したものだとすれば、当然状態を持つ事になる。この状態の管理がオブジェクト指向では重要になってくる。
多くのメンバ関数は、データメンバのその時の値によって動作を変える。メンバ関数に同じ引数を与えても、その時のデータメンバによって異なる結果が返ってくる。
インスタンスの状態を抜きにして、そのメンバ関数の仕様を記述する事は本当は出来ない。どのような場合にどの操作が有効で、それがどのような結果になるのかを管理しなければならない。これが状態の管理。
C言語では、グローバル変数が状態を表す役割を果たしていた。C言語でグローバル変数を扱う場合は、この管理方法が必要になる。

状態の管理の実際

状態の管理は、『状態遷移図』を使って行う。
1つの状態には必ずその状態に存在している時間がある。逆に、状態から別の状態への移行には時間がかからない(と考える)。状態にとどまる時間がわずかであったり、無視できる物である場合、それは状態として認めない。モノは必ず1つの状態に属する。また、同時に複数の状態に属する事は無い。
モノはある出来事をきっかけに、ある状態から別の状態に変化する。これが『状態遷移』。あるものの状態が、何をきっかけに、どのようにして変わっていくかという事を分析する事が、状態遷移図を利用した状態の管理。

状態遷移図のプログラムへの応用

状態の分析は、動的分析の一部。主に、クラスの実装(メンバ関数)に反映される。オブジェクト指向開発では、クラス内部の変化を状態として捉える。経験則から、状態図があるのとないのとでは、コーディング/デバッグにかかる時間が全く違うと言われている。
状態は、そのクラスが今どの状態下を示す1つのデータメンバとなる。イベント(状態遷移)はメンバ関数になる。

プログラム部の定義

状態遷移図に登場するイベントは複数登場する事はよくある。これは、図に登場する複数の状態のうち、いくつの状態がイベントを受け止める事が出来るかということを意味する。例えば、ミュージックプレーヤーの再生と一時停止という2つの状態は、停止というイベントを受け止める。つまり、停止というイベントが2つ登場する事になる。
状態図がきちんと書けていれば、それをプログラムの状態エラーのチェックコードに直接変換する事が可能。このように状態を管理する事で、状態に関わるエラーは完全に一掃する事が出来る様になる。

状態の変化の実装

イベントによって状態が遷移する先、そして遷移の元の状態に注目する。まず、イベントが指し示す状態に注目する。同じイベントによって発生する遷移でも、元の状態によっては遷移先が異なる場合がある。
状態の変化をプログラムに実装する際、それをシステマティックに行い、機械的、直接的にプログラムコードに変換する事が出来る。それによって、『再現性が無いバグ』が発生する可能性自体が激減する。

プロフィール

このブログ記事について

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

ひとつ前のブログ記事は「フィードリーダーの表現とか機能とか」です。

次のブログ記事は「RSS+SSE仕様をようやく読んだ」です。

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