Software Engineering Lecture 9/5
Software Engineering Lecture 9/5
夏休み前の復習
- 関数型言語の意味
- Common LISPのプログラム
- Object Life Cycle
- 情報モデル、状態モデル、プロセスモデル
3次元化学シミュレータの構築
状態モデル
オブジェクトは、いつも同じような動作をするわけではない。あるメッセージを
受け取った後には、異なる振る舞いをするのが普通である。例えば、
- 電子レンジの扉を開ける
- 食品を入れる
- 扉を閉める
- スィッチを入れる
- 加熱中
- 加熱終了
- 扉を開ける
- 食品を出す
- 扉を閉める
という操作を考えよう。この時、同じ「スィッチを入れる」という操作でも
扉が開いている時には、加熱が始まってしまってはいけない。関数型言語では
本当は、そういうことはない。同じ入力ならば、同じ出力を返すのが関数
なはずである。このように、同じ入力でも違った動作をすることを、オブジェクト
が状態を持つという。
しかし、オブジェクトはまったく予想できない動作をするわけではない。この
場合でも、この一連の動作は一種のループになっていて、ループの各点では
同じ動作をすると期待される。このようなループがオブジェクトライフサイクル
を構成する。
「扉を閉める」「スィッチ」などがオブジェクトの状態を変えるきっかけ
である。これらを「イベント」と呼ぶのが普通である。オブジェクトの状態は
イベントによって変わる、あるいは、オブジェクトの状態を変えるものが
イベントである。
この(個々の)オブジェクトの振る舞いを表すのには、状態遷移図を使うのが
普通である。例えば、一番簡単な例として電灯の状態遷移図を書いてみよう。
- 問1
電子レンジの振る舞いを表す状態遷移図を記述してみよ
化学反応では、分子同士が単純に衝突しても反応が起きるわけでは
ない。分子が励起状態になって初めて反応が起きる。励起状態は、
壁に衝突したり紫外線を当てたり、他の容易に起きる反応によって
生じる。励起状態は半減期があり、例えば数マイクロ秒で半数の分
子の励起状態は終了する。
- 問2
励起状態を考慮した場合の分子のライフサイクルを状態遷移図で
記述してみよ。
3次元化学シミュレータでも大半のオブジェクトのライフサイクルは単純な
ものであることに注意しよう。従って、すべてのオブジェクトのライフサイクルを
記述する必要はない。ごく一部を記述するので十分なはずである。
システムの動的振る舞い
オブジェクトは、個々に勝手に動作するのではなく、全体としてある目的を
もって協調して動作するべきであろう。個々のオブジェクトの振る舞いの
総和がシステムの振る舞いを決める。これは単純には、個々のオブジェクトの
状態遷移図の積であるはずである。
しかし、それは人間の手に負えないほど複雑なものであるのが普通である。
たとえば、2状態のオブジェクトが10個あったとすると、その積は2^10=1024
の状態を持つ。
したがって、個々のオブジェクトの状態だけでなく、システム全体の振る舞いを
見通し良くするための表現が必要だと考えられる。
そのためにオブジェクトライフサイクル手法では以下のようなさまざまな
モデルを工夫している。
- オブジェクト通信モデル
情報モデルにそってイベントがどのように流れるかを記述する
- 通信パターン
オブジェクトの通信はランダムに起きるのではなく、通常は決まった
パターンで起きる。例えば、 イベント駆動処理、上位駆動パターン、
下位駆動パターン、制御スレッドなどである。制御スレッドは特に
リアルタイム処理では重要である。
- アクションデータフローダイアグラム(ADFD)
Yourdon, Constantine, DeMacro によって導入されたオブジェクトの
相互通信を単位と図的に表現するための形式。
これらのモデルは、ある意味でオブジェクトの並列実行を仮定している。
しかし、オブジェクト指向プログラムを普通の逐次型プログラム言語で
記述する時には、なんらかの方法で並列実行をシミュレーションしなくては
ならない。そのためには以下のような方法がある。
- スケジューラオブジェクトが、並列動作するオブジェクトに順次にイベントを
送り、次々に動作させる。
- OSが提供するプロセスを使い、プログラムを分割して、プロセス間通信を
使って並列動作を実現する。この場合、分割したプロセスの間でのオブジェクト
の参照は必ずプロセス間通信を経由する。
- 単一プロセス内のスレッドと呼ばれる並列実行を利用する。この場合は、
メモり空間は共有されているので、オブジェクトの参照は自由である。
ただし、同じオブジェクトのメソッドが同時に動作する場合には、自分で
排他制御をおこなう必要がある。
実際には、最初の方法が一番簡単な実現方法だといえるだろう。 しかし、入出
力処理がともなう場合には、プロセスを分割するかスレッドを使う必要がある。
さらに、スケジューラオブジェクトのプログラムはプロセスモデルを複雑に
してしまうことが多い。
- 問3
この三つの方法の利点と欠点について考察してみよ。
Prev
Next
Kono's home page