構造化プログラミング

 さらにプログラムの仕組みについて見てみましょう。

イベントドリブンなプログラム
 このKAB−studioのホームページを見てください。完全に読み込まれた時点で、JAVAスクリプトのプログラムは終了しています。
 でも、右上の「メニュードロップダウン」からページを選択すると――あーら不思議、他のページに移動しましたね。
 この仕組みは「ドロップダウンからひとつ選択する>関連づけされた関数が実行される>関数が他のページをブラウザに読み込ませる」という手順で行われます。そしてこれこそが「イベントドリブン」なのです!

 イベントドリブン。「イベント」はevent、出来事とか催し物とかそういう意味です。ここでは「選択する」ことが「出来事」になるわけです。「ドリブン」はdrivendriveの受身形です。「ドライブ」は分かりますね、車を運転したり、ディスクを回したり、そういう「動かす」ことを意味します。
 つまり「イベントドリブン」とは、「何か起きることによって動かされる」ということです。この例に置き換えれば「メニューを選択することで関数が実行される」となるでしょう。

 昔のプログラムは、単に計算をするだけのものでした。でも、今は「視覚的にわかりやすいもの」が求められています。分かりやすいということはアクションをすれば反応してくれるということでしょう。最小化ボタンを押せば最小化する、ドラッグすれば選択される、こういうことに対応したプログラムを書くとき、イベントドリブンは非常に分かりやすく作ることができます

 ウィンドウズプログラミングをC言語で行う場合、普通のプログラムをベースにしてイベントドリブンなプログラムを作ることになります。これはちょっと大変ということで、Visual C++を使いC++言語の機能を使うことで「普通のプログラム」の部分を覆い隠しています。さらにVisual BasicやDelphiでは、完全と言っていいほど消し去っています。そして、こういったイベントドリブンへの流れはJAVA系にしっかりと受け継がれています。
 もちろん、CGIなどを見れば分かるとおり、イベントドリブンでないプログラムもなくなることはありません。これからは、イベントドリブンなプログラムとそうでないプログラム、両方をマスターする必要があるでしょう。

行ったり来たり分かれたり
 関数を使った場合には、基本的に流れは一方通行です。その流れを変える予約語が言語にはあります。

 ifは「もし、**なら」のような形で流れを変更させることができます。例えばある変数が1なら右へ、0なら左へ、のような形です。
 for一定回数繰り返すことができます。例えば「同じ文字を3回表示したい」という場合に便利です。
 whileは「もし**なら繰り返す」というifとforを足したようなものです。「結果がマイナスになるまで計算する」といった時に使います。

 この3つが基本です。そして、これだけあれば十分です。これらを駆使してプログラムの方向を変更していってください。でもバックだけはできません
 これらの予約語は、どの言語でも基本的に同じです。しっかり憶えておきましょう。ただ、実は細かい部分が結構違います。特にPascal系は特殊な部分があるので、その辺の違いをチェックしておいてください(特にfor)。

ネストとその深さ
 上のみっつのうちifとforを使ってみた例です(言語はJAVAスクリプト)。

function TestFunc( p_i )
{
	for( iF1 = 0; iF1 <= 9; iF1++ )
	{
		if( iF1 == p_i )
		{
			document.write( "いっしょ!!" );
		}
		else
		{
			document.write( "いっしょじゃない!?" );
		}	
	}

	return iF1;
}
	

 特に意味のない関数です。この関数、{}(中カッコ)がいっぱいありますね。必ず、{があれば}があります。プログラムはこの単位の塊でできています。これを「ネスト」と呼びます。訳すと「巣」とかいう意味になります。
 見れば分かるとおり、ネストには必ず最初に何かがあります。関数名だったり、ifだったり、そういういわゆるネストのタイプがあって、「このネストの範囲はこういう意味なんですよ」みたいなことを宣言しているわけです。
 その範囲を分かりやすくするためにタブを使うと見やすくなります。エディタによっては自動的にタブを挿入してくれるものもありますし、数行まとめてタブを入れる機能があったりもします。エディタをチェックしてみましょう。
 ネストを作る時の注意点は、ネストを交差することはできないということです。例えば

function TestFunc( p_i )
{
	for( iF1 = 0; iF1 <= 9; iF1++ )
	{
		if( iF1 == p_i )
		{
			document.write( "いっしょ!!" );
		}
		else
		{
			document.write( "いっしょじゃない!?" );
	}
		}	//ここが交差してます。

	return iF1;
}
	

 こんなことしても、最初の例と同じように解釈されます。要するにムリって事ですね。
 これはとても重要なことです。関数から関数を呼び出すと、感覚としては元の関数の中に、呼び出した関数のコードが展開されるみたいな感じです(実際には違います)。また、if等のその他のネストも、他のネストに含まれています。つまり、どんなネストも何らかのネストに含まれ、最終的にはすべてのネストがエントリーポイントの関数のネストに包まれているということです。

 こういったプログラムの組み方を構造化プログラミングと呼びます。ネストという単位を組み合わせ内包していくことでプログラムが構成されているわけです。
 こういったプログラムの組み方はとても重要です。関数で触れましたが、基本的にパッケージ化することが必要です。関数の中でするべき事は関数の中だけで行う。forのループで繰り返し行いたいことは、その中だけで済ませる。こんな感じでプログラムを組んでいくと、ミスが少なくなるでしょう。

 このネストは、C言語系とJAVA系は{から}です。Pascal系はbeginからendです。Visual Basic系はちょっと特殊で、上で書いた「ネストのタイプ」で始まり、そのネストのタイプごとの「閉じる単語」を使う必要があります。ForからNextDo WhileからLoopIfからEnd Ifといった感じです。

「構造化」の大切さ
 まとめです。プログラムは一行ずつ上から下へと流れていき、関数を渡っていきます。ここで、流れに対してふたつの見方をしてみましょう。
 ひとつは一貫した流れ。最初から最後まで、一直線にすべての道筋をたどるもの。
 もうひとつは、関数ごとの流れ。「この関数の中ではこう流れる」という風に、ひとつひとつ区別して考えるもの。
 このふたつの見方がバランスよくできることが、大切です。これはつまり、プログラムの中に適度に関数が存在するということです。

 前に説明したように、プログラムは計算をするものです。そのため、データ(つまり変数)の管理を重要視するべきです。
 そういった考えから、変数を関数の中に閉じこめて管理を楽にすることが大事になってきます。これが、何度も言っているようにパッケージ化の意味です。
 もうひとつ、パッケージ化には意味があります。扱うデータは、プログラムの仕組みや実現したい内容が変われば当然変わるでしょう。もし、このデータを扱う部分が多ければ、それだけ修正するのが大変になります。
 そういったことを防ぐためにもパッケージ化は重要です。同じ事をしているコードを減らすことで、管理を楽にするわけです。

 これは関数だけに言えることではありません。ifやwhileのネストにも意味があります。繰り返しや分岐をうまく組み込むことによって、同じ事をするコードを減らすことができます。
 このように、ネストをうまく使うことで、プログラムをダイエットさせ、分かりやすくすることができるのです。

 次回は、さらにデータを分かりやすくするため、変数の発展形について見ていきましょう。

(C)KAB-studio 1998 ALL RIGHTS RESERVED.