タイトルのままだと某氏に怒られるのでww、「オブジェクト志向プログラミングってなんじゃらほい?」ってことで。なお、タイトルは「指向」を使いましたが、前回のエントリで「志向」の方が正しいような気がしたので、このエントリでは、以後「志向」を使います。
「オブジェクト志向プログラミング」は、1970年代の終わり頃から、新しいプログラミング手法として広まり始めました。ここで注目したいのは、「新しい」というところです。
「新しい」というのは、2種類、あるいはそれ以上の考え方があります。1つは、「今現在」において、発展中であるということ。もうひとつは、ある時点において、何かの代わりとして登場したということです。ここで「新しいプログラミング手法」というのは、それまであったプログラミング手法に変わる手法として登場した、ということです。
「代わり」なのですから、「それまであった」があるわけです。この2つを比較することで、「オブジェクト志向プログラミング」というものがどういうものか、見えてくるのではないでしょうか。
では、「それまであった」ものとは、どんなものでしょうか?私はこれを、「プロセス志向プログラミング」と呼んでいます。この2つを比較します。
その前に、「プログラミング」とは、どのような作業でしょうか。コードを書く。コンピュータにわかるコードを書く。コードを書いてコンパイラに通す。など、返ってきそうです。ところで、「書く」のでしょうか?私も「書く」という言葉を使いますが、気持ち的には「コードを組み立てる」つもりでいます。
私は、「プログラミング」を、「ブロック遊び」にたとえることがあります。レゴとか、積み木でもいいでしょう。ブロックは、すでに形を持っています。その形を組み合わせて、何かを作ります。プログラミングも同じではないでしょうか。我々が使用するコードの大部分は、すでに誰かによって作られたコードの断片です。その断片の組み合わせ方によって、様々な動作を行うアプリケーション プログラムができあがります。
さて、この、「断片を組み合わせる」という作業。この作業の進め方について、「プロセス志向」と「オブジェクト志向」を比較します。しかし、具体的に比較するものがあった方が比較しやすいですから、具体的な例題を考えます。
「ローカル ディスク上の任意の場所にあるファイルを、ローカル ディスク上の任意の場所に移動する」を考えます。「rename や mv で一発じゃない」とは、いわないでください。その中身を考えます。
まず、プロセス志向です。プロセス志向ナントカでは、処理を行う手順を中心に考えます。すると、こんなふうになるかと思います。
移動させるファイルを開く。
移動先にファイルを作る。
移動元から、用意したバッファがいっぱいになるまで読み取る。
移動先に書き込む。
移動元のファイル ポインタが、最後を指すまで繰り返す。
移動元のファイルを閉じる。
移動先のファイルを閉じる。
移動元のファイルを削除する。
これによって、「ファイルの移動をどうやって実現するか」ということが、よくわかると思います。
次に、オブジェクト志向です。オブジェクト志向ナントカでは、処理の手順ではなく、処理を行う何かに注目します。それを「オブジェクト」と呼び、クラスで表します。では、この例題の「何か」とは、なんでしょうか?それを探すところからスタートです。
「オブジェクト志向ナントカ」の本を見ると、たいてい「名詞を探せ」とあります。では、名詞を探してみましょう。次のものが名詞です。
これら全てがクラスになるかというと、違います。これらは「クラス候補」であって、ここからクラスにする必要があるか、選別します。
「ローカル ディスク」は、「ローカル」が「ディスク」を制限するために修飾しているので、「ディスク」だけで良さそうです。しかし、例題には「ローカル ディスク上の任意の場所」と書かれていました。ディスクもまた、「場所」を制限するために修飾しています。よって、「ローカル ディスク」はクラスとはなりません。
「ファイル」は、クラスになるでしょうか。これは、例題で操作される対象です。ですから、クラスとなります。
「場所」は、どうでしょうか。場所は、ファイルがあるところを示すものですから、ファイルの属性と言えるでしょう。しかし、「ローカル ディスク上の」と、制約があります。この制約が守られているかどうかのチェックが必要です。このために、クラスとすることにします。
では、オブジェクト志向プログラミングにおける、「ローカル ディスク上の任意の場所にあるファイルを、ローカル ディスク上の任意の場所に移動する」は、どう表現されるでしょうか。
ファイルのインスタンスを作成する。
ファイルの属性「場所」を、新しい場所に設定する。
これだけです。ただし、ファイル クラスは、属性「場所」が変更されたらどう振る舞わなければならないか、定義されていなければなりません。その定義の中身は、上のプロセス志向ナントカの時と同じです。
あるいは、こういう考え方も出来ます。
このふたつを比べると、「オブジェクト志向プログラミング」の所以がわかるのではないでしょうか。先のものが「どうするか」だけを考えていることに対し、後のものは「何が、どうするか」を考えています。この「何が」が「オブジェクト」であり、「どうするか」よりも「何が」に志向する(意識を向ける)から「オブジェクト志向」なわけです。
こうして、「従来の方法」と、「新しい方法」の違いを比較すると、不便な点も便利な点も、いろいろ見えてくるのではないでしょうか。
と、従来の方法との違いを見る方法を提示したところで、今回はここまで。
投稿日時 : 2008年12月26日 22:33