2-3: クラスとオブジェクト指向

クラスは Javaのようなオブジェクト指向 (Object Oriented)言語の最も基本となる概念です。 クラスの導入でプログラミングの考え方がどのように変化するのか考えてみましょう。


・ クラスは単に形式的に大きな「入れ物」を用意したというわけではありません。 プログラムの構造というどちらかというと形式的な違いだけでなく、 クラスの導入によってさらに重要な意義が生まれます。 クラスの概念の導入によって、 プログラミングに対する考え方自体が大きく変わるからです。
Cはいくつかの関数の集まりでした。 関数はコンピュータに行わせるべき「ひとかたまり作業」に対応します。 つまり Cのプログラムは「いくつかの作業の集まり」と言うことができます。 プログラムはあくまで「人間がコンピュータに直接何か命令する」 という観点で記述されます。 これは、ごく当然のことのように思われるかもしれません。 プログラムの目的はコンピュータに命令を出して仕事をさせることだからです。 事実オブジェクト指向以前のプログラム言語は、 ほとんどが上のような考えに立って設計されています。 このような言語のスタイルを指して「手続き指向」という言い方をすることもあります。
しかしこの手続き指向が、 プログラムを設計していく上で唯一のものの見方ではないのです。 発想を逆転させてみましょう。 コンピュータに処理させたい対象は、 現実の世界に存在するさまざまな物事です。 コンピュータに理解させるためにプログラムを記述するのではなく、 逆に現実の世界の物事をプログラムに反映させる というアプローチも可能ではないでしょうか? これがクラスを導入することのもう一つの重要な意味です。 また、このようにクラスの考え方を中心にプログラムを組み立てていく方式を 「オブジェクト指向(Object Orineted)プログラミング」と呼びます。

・ より厳密に言うならば、 クラスとは現実に世界に存在するもの(思考の産物も含む)を抽象化して 表現したデータの型です。 クラスとして取り扱うことができるのは、 原理的にはどんな存在であってもかまいません。 時計でも象でもウィンドウ上のボタンでもクラスとして表現することが可能です。 目に見える対象に限定されているわけでもありません。 チェスの駒の動きとか為替レートの変動といったものを表すための クラスを定義することもできます。
なお、クラスは現実の世界の存在をそっくり忠実に再現する必要はありません。 通常はプログラムの処理の対象となるのは、ごく限られた情報だからです。 たとえば大学の事務処理で学生を取り扱うような場合を考えてみましょう。 必要な情報として考えられるのは「氏名」、「住所」、「所属学科」、「学籍番号」 などの情報です。「顔写真」の情報もあった方がいいかもしれません。 しかし、 その他の身体的な特徴や個人の趣味や性格などは省略してかまわないでしょう。 つまりクラスを設計するという作業は、 特定の情報や処理の方法を抽出して書類の書式を整えるような作業とも言えます。
ただし、クラスは単なる「データの寄せ集め」ではありません。 データを取り扱うための手続きもその内部に含むことができます。 たとえば生物をシミュレートする目的のクラスでは、 食事をしたり、移動したりという行動をクラスの内部に定義することができます。 たとえばペット育成ゲームの中のキャラクターのようなものをイメージした方が、 より正確なクラスの理解かもしれません。

・ クラスの導入によって、プログラミングの視点が大きく変わります。 問題解決のためにまず現実の存在を抽象化することからスタートします。 そして、その振る舞いも含めてクラスの内部に定義します。 手続き指向のスタイルでプログラムを記述する時、 プログラマはある意味で全知全能の神の存在でなければいけません。 プログラム内で起こりえる全ての出来事を事前に定め、 その1つ1つを直接コントロールします。
これに対してオブジェクト指向のスタイルは、 たくさんの登場人物によって構成される小説や舞台にたとえることができます。 その世界の出来事を決定するのは、登場人物に設定された個性であり、 プログラマが1つ1つ直接手をくだすわけではありません。 舞台監督もしくは演出家にすぎないのです。
現実の社会生活の中では、 私たちは後者のものの見方をとることの方がはるかに多いはずです。 実はオブジェクト指向のスタイルの方が、 現実の問題を記述する方法としてはむしろ自然と言えます。 プログラムを設計する時だけ、 特別なスタイルに固執する理由はどこにもありません。 手続き指向の方が考えやすいという気がするのも、 単に慣れの問題にすぎないでしょう。 オブジェクト指向だから難しいということは決してありません。 むしろオブジェクト指向のプログラミングの方が、 一般に頭を使わなくて済む場合が多いのです。 この発想の転換が「オブジェクト指向のパラダイム・シフト」と呼ばれるものです。

image
手続き指向からオブジェクト指向へ