第5章 関数と手続き


☆ 総目次へ ★ 第4章目次へ ★ 前節へ ★  次節へ ☆
 5-1  モジュール(1)-つのボタンからなるプログラム- 
 5-2  モジュール(2)-つのボタンですます-
 5-3  モジュール(3)-押せないボタンはいらないのか-
 5-4  モジュール(4)-構造のはっきりしたプログラム-
 5-5  モジュール(5)-Button1Button2は本当にいらないのか-
 5-6  モジュール(6)-プログラムの構造-
 5-7  モジュール(7)-モジュールを作ろう-
 5-8  関数(1)-値を返すモジュール-
 5-9   関数(2)-絶対値関数を使う-
 5-10 関数(3)-関数を使う-
 5-11 関数(4)-Random関数-
 5-12 ローカル変数とグローバル変数
 5-13 ローカル変数とグローバル変数
 第5章の構成
学習内容とねらい

この章では、関数について学習します。
特定の処理を行うコードの集まりを関数と呼びます。だらだらと長いプログラムはわかりにくいだけでなく、不具合が発生したときにも、それがどこで発生したのかを見つけにくくなります。プログラムが長くなってきたら、できるだけ処理のまとまりを関数にして、すっきりとしたコードを書くことができます。
Delphiプログラミングのテキストのこの章では、『モジュール』という言葉がよく使われていますが、この言葉はあまりメジャーに使われません。C++Builderの参考書を見てもわかりますが、『モジュール』という用語は扱われていません。C++Builderのプログラムは関数のかたまりであると理解しておいてもいいと思います。しかし、間違っては使われていないので、本テキストでも扱います。

  関数の必要性 

 関数をどんなときに使うのかピンとこないかもしれません。Buttonコンポーネントをクリックしたときの処理は、全部そのイベントハンドラに書けばいいじゃないか、という気がします。
下記のプログラムは、Button1をクリックしたときのイベントハンドラを表しています。そして、1つの処理を『モジュール』といいます。
 変数の宣言から始まって、処理内容は大きく3つに分けられます。確かにここに全ての処理を書いても間違いではありません。しかし、これが本当にC++Builderのコードで書かれていて、しかも、とても長いプログラムだったら・・・。Button1OnClickイベントでどんな処理が行われているのか、プログラムをじっくり読まなければわかりません。
図5-1


下記のプログラムは並べ替えの部分を関数にして独立させたものです。こうすると、並べ替えの処理の部分が、その関数を呼び出す命令文の1行だけですみます。そこにコメントを書いておけば、イベントハンドラの処理の内容が、ひと目でわかります。
図5-2
☆ 総目次へ ★ 第4章目次へ ★ 前節へ ★  次節へ ☆



関数を使うメリットは、コードを読みやすくするだけではありません。図5-1のように、並べ替えの処理をButton1のイベントハンドラに記述すると、そこで並び替えの処理はできません。もし、Button2をクリックしたときにも同じ並べ替えを実行したい場合は、Button2OnClickイベントにも同じコードを記述しなければなりません。つまり、またっく同じコードが重複して、あちこちに存在することになってしまいます。
 同じコードがプログラムのあちこちに存在すると、不具合があったときに、それを直すのが大変です。一方は直したけれど、他の部分で直していなかったという勘違いにもつながります。図5-2のように、重複する部分を関数にしておくと、修正はその部分だけですみます。もちろん、Button2からも、この関数を実行できます。

  値を関数と返さない関数  

C++Builderの関数には「値を返す関数」と「返さない関数」の2種類があります。例えば、Dateという関数は、システムの現在の日時を調べて、その結果を返します。
しかし、ShowMessageという関数は、指定した文字列をダイアログボックスに表示する処理を行いますが、処理の結果として返す値は何もありません。また、Delphiでは「値を返すもの」を「関数と呼び、値を返さないもの」を「手続きと呼びます。しかし、C++Builderではどちらも、総称して「関数」と呼びます。これも2つの言語の違いとなります。
これから、自分で作る関数も同じなので、処理の結果を返すように作成するか、返す必要がないのか、良く考えて作成しましょう。