オブジェクト指向とは何か

「オブジェクト指向とは何か」この根源的な問いの答えはなかなか難しいものです。ここではその難しく哲学的な問題に真っ向から挑んでみたいと思います。

自律とは

コンピュータが命令をしなくても勝手に動くことを「自律」と呼びます。人間 の命令に従うのではなく、コンピュータが自分で判断し自分で自分の行動を決 めるのです。

オブジェクト指向では「どう動かすべきか」ではなく「どう動くか」を考えま す。コンピュータは「人間が動かすもの」ではなく「勝手に動くもの」と考え ます。

コマンドラインとGUI

また昔話になりますが、その昔、BASICという言語(今のVisual Basicとは別物) がありました。またLISPという言語もありました。これらの言語は、人間が逐 次入力した命令を実行することから「インタプリタ型」と呼ばれました。 こうした純粋な形でのインタプリタ型言語は現在ではほぼ絶滅していますが、 昔はコンピュータに命令を一つ一つ与えていって実行させることができました。

BASICの時代には、PRINT "バカ" などとやって、コンピュータに「バカ」と表 示させて遊んだものでした。BASICでは、コンピュータに「バカと表示しろ」 と命令するとコンピュータはその命令の通りに「バカ」と表示しました。それ が何だかうれしかったのです。そして、それをいちいち人間がやるのは面倒だ からその手順を記憶させて、さらにgoto文で好きな場所に飛ぶことができるよ うにして……と発展させてプログラムにしていました。

RUN(走れ)と入力すると、入力したプログラムが順次実行されました。そうし ながら、プログラマは自分がコンピュータに手でいちいち入力しているところ を想像していました。Breakキーを押すとそれは止まり、CONT(続けろ)を実行 すると続きが始まりました。

BASICでは、すべての操作はコンピュータへの命令でした。RUN(走れ)もCONT (続けろ)もLIST(コードを表示しろ)もそうです。そして、コンピュータは命令 を実行したら OK(終わりましたご主人様) と返事して、次の命令を待ちます。

これはMS-DOSでもUnixでもある意味同じです。プロンプト(=入力を促すもの) を出して、ご主人様からの命令をひたすら待ちます。そして命令されたことを して、またひたすら待ちます。これがコマンドラインの考え方です。

コマンドラインでは、コンピュータは常に部屋の隅に立っていて、ご主人様の 命令を待つ存在でした。ウィンドウシステムではこの考え方が変わりました。 ウィンドウシステムでは人間が何もしなくても常に何やら動いています。メー ルが来ると「メールが来ました」と知らせてくれますし、時間になると勝手に ウィルススキャンやハードディスクの掃除を始めます。コマンドラインがメイ ドだとすると、ウィンドウシステムは秘書に相当します。

ユーザの命令と作成者の命令

コマンドラインとウィンドウシステムで、コンピュータの本質は何も変わって いません。単に人間側の見方が変わっただけです。

コマンドラインは「何もしないで命令を待つ」と書きましたが、これも本当に 何もしていないわけではありません。「待つ」という行動をしています。逆に、 ウィンドウシステムも実際は命令を待って行動しているだけです。ただ命令の 出所がご主人様だけではなく、「メールが来たからお知らせしろ」「時間が来 たからウィルススキャンをしろ」とあちこちから出されるだけです。

本質的な変化はコンピュータやプログラムではなくユーザ側にあります。コマ ンドラインでは、命令を出す人間はコンピュータの動作をすべて把握していま した。コンピュータは人間が命令したことしかしません。それに対して、ウィ ンドウシステムではユーザはコンピュータが裏で何をしているのかを把握して いません。コンピュータの本質は変化していないので、コンピュータは結局誰 かが命令したことしかできません。違って見えるのはだれがその命令を出した かです。コンピュータを使う人が出したものではなく、ソフトウェアを作った 人が出したものであるということです。

ユーザから見れば、「近頃のコンピュータは俺が命令しないことを勝手にやる」 と思っているでしょう。まるでコンピュータが自分でものを考えて自分勝手に 実行しているように見えるかもしれません。しかし実際はそれらはシステムの 作成者(例えばマイクロソフト)が命令したものなのです。

自律システムとは

「命令もしないのに自分で勝手に実行する」ことを自律と呼びます。しかしこ れは本当にコンピュータが自分勝手に行動しているのではありません。コン ピュータは事前に受けた命令の通りに動いています。コンピュータがどんな命 令を受けているのかを知らないから、あたかも勝手に行動しているように見え るだけです。

プログラムはその都度ユーザから命令をもらうのではなく、あらかじめ命令書 の束をソフトウェアという形でもらいます。命令書には「○○の時は××せよ」 という条件と命令の組が事細かに書かれています。例えば「メールが来たらお 知らせしなさい」とか「スタートボタンが押されたらメニューを表示しなさい」 というようにです。このようにすれば、ユーザから命令をいちいち受けなくて もコンピュータは動作させられます。コンピュータに命令するには、コンピュー タにどのように命令したらよいかを知らなくてはなりません。今のコンピュー タはそんなことを知らなくても使えるようにできています。

コマンドラインとウィンドウシステムでは、ユーザの命令の意味合いも変わっ ています。コマンドラインで「del a.txt」と打つとファイルが削除されます。 これは直接「ファイルを削除しろ」と命令したことにあたります。これに対し て、ウィンドウシステムではファイルをゴミ箱に放り込むことでファイルが削 除されます。これは「ご主人様がファイルをゴミ箱に放り込んだよ。きっとい らないんだろうなぁ。消しちゃっていいかなぁ」とコンピュータが判断して (実際には「ファイルがゴミ箱に入れられたら、ご主人様の意図を察してファ イルを消去しなさい」という命令に基いて)、ファイルが消去されます。そし て、実際には消さないで、もしもの時のためにとっておきます。

今や、人間がコンピュータに示すのは「命令」ではなく「意図」です。命令と いうのは、それで何が起こるのかを命令する人自身が把握していなくてはなり ません。しかし今やほとんどのユーザはコンピュータが実際に何をしているの かを知りません。ファイルを「消す」とは実際にはどういうことなのかを(驚 くほど多くの)一般人は知りません。ただ「目ざわりなものがデスクトップか ら消えて便利」くらいに思っています。コマンドラインを使う人は、ファイル やディレクトリ、ドライブの概念を把握しています。ファイルを作るとどうな るか、ファイルを消すとどうなるかをわかって使っています。しかし今の人達 はそれをわかっていないまま使っています。だから「ファイルを消しちゃった んだけど何とかならない?」とか「ディスクがいっぱいになってますって言わ れたんだけど何でだろう?」というような質問がやってきます。

イベント

昔のコンピュータはユーザが動作に責任を持っていました。ユーザはコンピュー タを理解していて、自分がコンピュータに出した命令の結果がどうなってもそ れはユーザの責任でした。今ではそうではありません。ユーザがどんな無茶な 命令をしたとしても、ユーザが不満に思わないようにしなくてはなりません。

コンピュータは命令を理解し実行するシステムから、「こういう場合にはこう 動く」という行動規則を実行するシステムになりました。これを反応(リアク ティブ)システムと呼びます。命令を上から順に実行していくシステムから、 その場に応じて行動を変えるシステムに変わったのです。

コンピュータの実行単位はコマンドからイベントになりました。コマンドは人 間が呼び出しますが、イベントは状況に応じて勝手に実行されます。コマンド は順番に処理され、一つのコマンドが終わるまでは次のコマンドは実行されま せんが、イベントはそんな悠長なことは言っていられません。状況は刻々と変 わり、イベントはコンピュータがどんな状態かということとは無関係にやって きます。

コマンド処理は終わるまで待たなくてはなりませんでしたが、イベント処理は 終わるまで待つ必要はありません。イベントは出しさえすればあとは勝手に処 理されます。コマンド処理と違って実行の順番もあまり関係ありません。複数 のイベントが発生した時は、どのイベントからどう実行されるかはわかりませ ん。逆に言えば、それは気にしなくても勝手によいようにしてくれます。

コマンドは命令文ですが、イベントは何かが起きたことを示す普通の文です。 そして、命令にあたるものはすべて「要求」という形に変換されます。「ウィ ンドウを閉じろ」という命令は「ウィンドウを閉じるように要求された」とい う要求として扱われます。命令は即座に実行しますが、要求は都合によって拒 否したり後回しにしたりします。TPOに応じてそれを判断するのはコンピュー タ自身です。

自律オブジェクト

今までは、システム全体の自律について考えてきました。ウィンドウシステム が全体として状況に反応するシステムだとして見てきました。自律の単位をシ ステム全体ではなく、オブジェクト単位にまで細かくした考え方が自律オブジェ クトです。

自律オブジェクトとは、オブジェクトそれぞれが自律しているということです。 オブジェクトそれぞれが状況に応じて勝手に動作をします。状況に応じてイベ ントが発生し、それがオブジェクトに通知されます。

自律オブジェクトの典型的なものがウィンドウシステムです。ウィンドウが閉 じられたとかマウスがクリックされたといった状況に対して、何をすべきかを 記述します。その中で他のウィンドウを閉じると、そのウィンドウにも「閉じ る」イベントが発生します。あるオブジェクトのイベント処理で別のオブジェ クトのイベントを発生させることを「メッセージパッシング」とも言います。

イベントやメッセージの考え方はこのように従来からある関数呼び出しの考え 方とは異なるものです。関数呼び出しは相手の実行が終了するまで待っていま すが、イベントやメッセージでは(概念的には)相手を待つことはしません。そ して、関数呼び出しでは呼び出しの前提条件や順番などが決められていますが、 イベントやメッセージはそれらは決まっていません。適当に投げればあとはそ のオブジェクトが処理してくれるようにしなくてはなりません。

まとめ

オブジェクト指向の考え方では、オブジェクトは独立かつ自律して動作してい ます。それぞれのオブジェクトは周りの状況に応じて動作をします。オブジェ クトを使う側からすれば、そのオブジェクトがどんな風に動作するかというこ とは知る必要がありません。

これは以前例に挙げた「宣言的」の考え方とも通じるところがあります。オブ ジェクトを目的に応じて設定しておけば、後は何もしなくても勝手に必要な動 作をしてくれます。「ここのセルは合計である」と設定さえすれば、どこのセ ルがどう変わってもオブジェクトが勝手に処理してくれるのです。ユーザはい ちいち命令を出す必要がありません。

プログラムは一般に肥大化するとだんだんスパゲッティ化してきます。プログ ラムの複雑さは順列組み合わせ的に増えていきます。しかしオブジェクト指向 では、複雑さはオブジェクトの数に比例してしか増えていきません。オブジェ クトは自分のことは自分で処理しますから、相手がいくつあろうが、相手がど んな種類であろうが関係ありません。あらかじめどんな状況にあっても正しく 動作するように作られていますから、それをどう組み合わせても問題なく動作 するのです。

人間はすべてを把握する必要はありません。クラスライブラリの使い方を把握 すればいいだけです。好みの動作をするようにオブジェクトを設定し、オブジェ クト同士をつなぎ合わせるだけで、あとはすべて勝手に実行してくれるのです。