関数とサブルーチンをうまく作れるかによって、プログラミングのスピードや効率が大きく変わってきます。
この記事では、関数とやサブルーチンの解説と、その効果、関数やサブルーチンを作る上で気を付けておきたい点について解説したいと思います。
この内容を理解することによって、後々プログラミングが楽になりますので、是非ご一読下さい。
プログラムはブロック単位で積み上げていくもの
プログラムを作る際、ただ単純に処理をダラダラと書いてしまうと、コード量が増えた時にメンテナンスがしづらくなります。
例えば、バグを修正しようとした時、もしくは機能拡張をしたくなった時、 何千や何万行のプログラムの中から該当箇所を見けようとすると、上から順に全て目を通さなければなりません。
業界では、「自分が作ったプログラムも、3カ月経ったら他人が作ったものと同じ」という事がよく言われています。
時間が経過すると自分自身で忘れてしまうので、他人が作ったプログラムを調べるのと同じ労力が必要になる意味です。
だから、1つのまとまった処理に対して、更にいくつかに分割(ブロック化)し、それぞれのブロックで処理が完結することが推奨されています。
次はブロック化のサンプルですが、プログラム自身に特に意味はありません。
まとまった数行単位の処理を、改行を入れて見やすくしているというイメージです。

何度も登場する処理は外出しする
この時、同じような処理が何度も登場することに気づいたら、どうしますか?
例えば、次のようなサンプルでは、顧客名簿1と顧客名簿2を読み込んで画面に出力していますが、①と②は読み込むファイル名以外はほとんど同じです。

もし、こんな箇所が数十か所もあるとしたら、毎回似たような事を書けばいいや!と思うでしょうか?
何度も登場する処理は外出しする
同じような処理が何度も登場すると、プログラムの量が膨れ上がります。
このプログラム例では、”大阪市”というキーワードを含む住所だけ画面に出したいのに、悲しい事にファイルを読むという本質的ではない部分のプログラムが多くなるため、全体がぼやけてしまいます。
本質と関係ない部分は、メインとなる処理手順から極力排除したいものです。
もし、下記のように外出しできたら、本来やりたい処理がスッキリ見えてきますよね。

関数とは、引数と戻り値を持つ外出しプログラムのこと
では、外出ししてみましょう。
外出しするとしても、呼び出す側からは、顧客名簿1と2のどちらを読めばいいのか指定できなければいけませんね。
また、読み込んだ顧客名簿を受け取る必要もあります。
ということは、共通処理を呼ぶときに、変更の可能性があるデータを渡して、そのデータを使って処理を行い、結果を返してくれるものがあれば良い訳です。
すなわち、これが関数です。
数学の関数と同じく y=F(x) という風に、値を渡して結果をもらうのです。
この時、関数に渡す値を「引数」、関数から返される値を「戻り値」と呼びます。

では、先ほどのプログラムを関数を使って書き直してみましょう。

如何でしょう?
だいぶスッキリしましたね。
このように関数を使うと、プログラム構造がスッキリとして、何をするプログラムかが把握しやすくなります。
汎用的に作った関数は自分の資産になる
関数化したことでプログラムが見やすく、且つプログラム量を減らすことができました。
読み込み対象となるファイルが何個あっても、ファイル1個につき2行書いてあげれば済んでしまいます。
かなり生産性の効率になりましたね。
でも、1つ問題点があります。
今のままだと ”大阪市” を含む住所を取り出すことしか出来ません。
これって、今回の用途では問題ありませんが、別のプログラムでそのまま使えませんよね。
そこで、”東京都” や ”京都” など、”大阪市”以外の住所でも取り出せるように考えてみましょう。
答えは、キーワードを引数として指定できるように関数を書けば良いのです。

どうでしょう。
これで他のプログラムにも使える様になりました。
この関数は、住所録に限らず「読み込んだファイルの中に、指定したキーワードが含まれる行を取り出す」というものになります。
そう考えると色々と応用ができそうですね。
このように、より汎用的に関数を考えていって、それを蓄積していくことで、自分の資産になっていきます。
複雑な処理も外出しすれば効果抜群
さて、ここまでは共通化という観点で関数化してきました。
共通化ではなく、その時だけ必要な処理であっても、それが複雑なものであれば、関数化する価値はあります。
プログラムは全体の流れの中で記述していくため、ダラダラをプログラムを書いてしまうと、変数名が被ったり、同じ名前の変数を使いまわすことで思わぬ箇所に影響してしまうことがあります。
そんな時は、積極的に関数化しましょう。
関数を作るのに、引数や戻り値は必須ではありません。
単にまとまった処理を呼ぶだけのために関数が使えるのです。
値を返さない関数のことを「サブルーチン」と呼んだりしますが、関数は共通化という目的以外に、複雑な処理を外出しすることで、プログラムがスッキリするだけではありません。
変数名が被ったり、他の部分に影響を与えるリスクを排除してくれるメリットもあります。
まとめ
- 何度も登場する(共通する)処理は関数化する
- 汎用的に関数を作ることで、他のプログラムにも利用できる
- 汎用的な関数は自分の資産になる
- 今回専用の処理でも、複雑であれば関数化することのメリットは大きい
ということになります。
常に関数化を意識していると、関数化を前提にしたプログラムを書けるようになります。
汎用的な関数は自分の資産として役に立ちますので、どんどん作っていきましょう。