構造化
菊池 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つだろうか?