広義のプログラム創発:無機体から作られる有機体

2016年07月13日

できるだけわかりやすく説明してみるという実験:サブルーチン

プログラムによって、コンピューターに処理をさせるための手続きを書く。
たとえば下記のような処理Aから処理Fまでの流れがあるとする。
subroutine1
これらのひとつひとつ処理は、ここでは「処理◯」と抽象的に表しているためイメージしづらいかもしれないので、もう少し具体的に処理の内容を例えてみれば、、、

処理A:ユーザーが入力したユーザー名を受け取る
処理B:(受け取った)文字をメモリに記憶する
処理C:その文字をデーターベースに照合し、ユーザーを特定する
処理D:ユーザーが入力したパスワードを受け取る
処理B:(受け取った)文字をメモリに記憶する
処理E:データベースから、該当するユーザのパスワードを取得する
処理B:(取得した)文字をメモリに記憶する
処理F:入力されたパスワードとデータベース上のパスワードが一致するか照合する

ここで、「処理B:文字をメモリに記憶する」という処理が3度登場している。
この共通の処理を何度も書くことはプログラムが冗長になる(長ったらしくなる)し、同じものを何度も書くということは、そこに変更が起こった場合、それらをひとつひとつ全部書き換える必要性が出てくる。

そこで処理Bをひとつにして、処理中の複数の箇所で共通して使おう、という考え方がある。
これを「サブルーチン」という。
ルーチンとは"routine"と書き、英語で「日課」などと訳されるもの。つまりここでは一連の流れ、とでも考えればよい。

「サブ」というぐらいだから、「メイン」があると思うはずだがそのとおり!
処理Aから処理Fまでの大きな流れをここでは「メインルーチン」と呼び、処理Bをサブルーチンにして、共通にしてしまおう、としたものが下記である。
subroutine2
線がちょっとぐちゃぐちゃになってはいるが、処理の流れ自体は冗長性が取り除かれて、すっきりしたものになっている。

ここで、もし処理Bに変更があった場合のことを考えてみる。
「文字をメモリに保存する」という処理が、何らかの事情により「メモリに領域が足りないから今回は毎回ディスクに書き込んでください」ということになった場合。
最初の処理Bを毎回書いていたもの、つまり処理Bをサブルーチンにして共通にしなかったものの場合、プログラム中の3箇所を書き換える必要があった。

プログラムを書き、そして書き換えるのが人間である以上、間違えは起こりうる。人間だもの(by みつを)。
「メモリに保存する」を「ディスクに保存する」に書き換える箇所が3箇所あるのに、最後の1箇所を書き換え忘れた場合、コンピューターはそのプログラム通りに処理を実行する。つまり、3回めの書き込みを(本来意図していなかった)メモリ上に書いてしまうことになる。これによってバグが発生してしまう。

処理Bをサブルーチンとして共通化した場合、このような間違いが起こりにくくなる。
変更は一箇所で行えばよい。
また、処理Aから処理Fまでのメインルーチンの中で「メモリに保存する」という実際の手続きを書く必要があったものを、単に「処理Bを呼び出す」と抽象化して書くだけでよくなり、処理の大きな流れを俯瞰して読みやすくなる。

以上のような理由により、サブルーチンという考え方はプログラムにとって非常に大切な知恵である。 

OLランキングで1位になりたい!賛同していただける方は下記をクリック!
にほんブログ村 OL日記ブログ ドジOLへ

コメントする

名前
 
  絵文字
 
 
広義のプログラム創発:無機体から作られる有機体