構造化

菊池 Blog - 菊池 Blogから。
言葉を替えると、関数の入口や出口を1つ以上できるか?ということである。
以下のプログラム(シミュレーションクラスSimSystemを用いた待ち行列の例)を見て欲しい。

public class 待ち行列
{
  public static Queue 行列 = new Queue();
  public static void サービス開始(通行人 x)
  {
    行列.Enqueue(x);
    if (行列.Count == 1) while (行列.Count > 0)
    {
      通行人 y = (通行人)行列.Peek();
      Console.WriteLine("{0} {1} サービス開始", SimSystem.Now, y.名前);
      SimSystem.Wait(3);
      Console.WriteLine("{0} {1} サービス終了", SimSystem.Now, y.名前);
      行列.Dequeue();
    }
  }
}
public class 通行人
{
  public string 名前;
  public 通行人(string s) {名前 = s;}
  public void 到着()
  {
    Console.WriteLine("{0} {1} 到着", SimSystem.Now,名前);
    待ち行列.サービス開始(this);
  }
}
public class Test
{
  static void Main(string[] args)
  {
    SimSystem.ScheduleAt(2,new SimEvent(new 通行人("その1").到着));
    SimSystem.ScheduleAt(4,new SimEvent(new 通行人("その2").到着));
    SimSystem.Start(100);
  }
}


このプログラムは、そのまま動き、出力は次のようになる。

2 その1 到着
2 その1 サービス開始
4 その2 到着
5 その1 サービス終了
5 その2 サービス開始
8 その2 サービス終了


さて、SimSystem.Waitは、シミュレーション時間上で、指定時間だけ待つ関数である。
結果を見ると、「サービス開始」のSimSystem.Waitで別関数の「到着」に飛び、終わったらSimSystem.Waitの次の行から続いている。これらの関数の入口と出口は1つだろうか?