プログラミングのモジュール化
何か実現したい機能があるとして、それを実現するために特に何も考えずにコードを書いていく。すると、ある程度書いたところで、似たような処理をしていることに気がつく。
ファイル名を指定し、そのファイルを読み込んで、ファイルの一行目を読み込んで、改行を取り除いて別の変数に渡す、といった処理。
その似たような処理を、一つの関数として切り出すことをしてみる。別の場所に共通となる処理を書き込み、もともとの場所にはその関数を呼びだすように書き換える。
モジュール化などと呼ぶ
この作業をするときには、コピペは使えるもののコピペだけでは住まない。「似たような処理」から共通の処理を抜き出す必要がある。その際にちょっと頭を使わなければならない。
これは抽象化と呼べる。
でもって、その関数に適切な名前を与えておくと、後からコードを読むときに非常に楽になる。
たとえば、function X よりも、 function readFileHeader の方がコードがやっていることの意味をとりやすい。
一度関数として切り出しておけば、後からのメンテナンスが劇的に楽になる。似たような処理が3ヶ所あるとして、もし「改行を取り除いていたけども、やっぱり入れておこう」みたいな心変わりが発生したら、切り出しをしていないと、そのすべての箇所で修正が必要になる。しかし、切り出しておけば、関数の中身を書き換えるだけでよい。
同様に、次からその「似たような処理」をするときも、ただその関数を呼びだすだけでよくなる。
以上のような処理は、実際はまったく行わなくてもプログラムの機能に支障はでない。そのプログラムで実現されるものは何も変わっていない。単に内部的に「整理」されただけだ。
この世界では原子を見立てなくても動物は生きている、というのに似ている。
でもって、その整理を一段進めると、関数としてではなく、それを別ファイルに切り出すこともできる。そうすると、もともとのプログラムでは、その別ファイルを読み込むように書き換えなければならなくなる(これもリファクタリング)。その手間と引き換えに、以降自分が作るプログラムすべてで、その関数が利用できるようになる。
再利用可能性を高めるとはこういうこと。
また、そうした関数をある機能や目的に合わせて集め、互いの存在によってエラーが出ないように調整されたものライブラリと呼ぶ。
後になればなるほど、抽象度は上がっていくし、ライブラリでは関数同士の相互作用にも注意を向けなければならない。しかし、そこまでいくとそれは「他の人にも使ってもらえる」ものになる。