Software Engineering Lecture 6/12

Software Engineering Lecture 6/12

復習

オブジェクトの振る舞いを表すのには、状態遷移図を使う。

問1

Java で状態遷移を記述するにはどうすれば良いか? 緑、黄、赤と 順に変化する信号機をJavaで記述してみよ。

別にアプレットにする必要もない。(してもいいけど)
public class signalApp
{

    public static void main (String args[]) {
	System.out.println("start");
	red();
    }
    public static void red() {
	System.out.println("red");
	green();
    }
    public static void green() {
	System.out.println("green");
	yellow();
    }
    public static void yellow() {
	System.out.println("yellow");
	red();
    }
}
これは再帰呼び出しと呼ばれる方法になる。簡潔できれいだけれども、 javaのような言語では実用的とはいえない。(何故か?) あるいは状態を表す変数を使えば、
public class signalApploop
{
    static final int red = 1;
    static final int green = 2;
    static final int yellow = 3;
    static int state;

    public static void main (String args[]) {
	int i;
	
	state = red;
	System.out.println("start");
	for(i=0;i<10; i++) {
	    next();
	}
    }
    public static void next() {
	if(state == red) {
	    System.out.println("red");
	    state = green;
	} else if (state == green) {
	    System.out.println("green");
	    state = yellow;
	} else if (state == yellow) {
	    System.out.println("yellow");
	    state = red;
	}
    }
}
などと書くことができる。

問1

この二つの方法の利点と欠点について考察してみよ。



システムの動的振る舞い

オブジェクトは、個々に勝手に動作するのではなく、全体としてある目的を もって協調して動作するべきであろう。個々のオブジェクトの振る舞いの 総和がシステムの振る舞いを決める。これは単純には、個々のオブジェクトの 状態遷移図の積であるはずである。

しかし、それは人間の手に負えないほど複雑なものであるのが普通である。 たとえば、2状態のオブジェクトが10個あったとすると、その積は2^10=1024 の状態を持つ。 したがって、個々のオブジェクトの状態だけでなく、システム全体の振る舞いを 見通し良くするための表現が必要だと考えられる。

そのためにオブジェクトライフサイクル手法では以下のようなさまざまな モデルを工夫している。

これらのモデルは、ある意味でオブジェクトの並列実行を仮定している。 しかし、オブジェクト指向プログラムを普通の逐次型プログラム言語で 記述する時には、なんらかの方法で並列実行をシミュレーションしなくては ならない。そのためには以下のような方法がある。

実際には、最初の方法が一番簡単な実現方法だといえるだろう。 しかし、入出 力処理がともなう場合には、プロセスを分割するかスレッドを使う必要がある。 さらに、スケジューラオブジェクトのプログラムはプロセスモデルを複雑に してしまうことが多い。

問2

この三つの方法の利点と欠点について考察してみよ。