Out of Memory

ごめん、忘れてた。

目次

Blog 利用状況

ニュース

2008年7月1日
Microsoft MVP for Developer Tools - Visual C++ を再受賞しました。
2008年2月某日
MVPアワードがVisual C++に変更になりました。
2007年10月23日
blogタイトルを変更しました。
2007年7月1日
Microsoft MVP for Windows - SDKを受賞しました!
2007年6月20日
スキル「ニュース欄ハック」を覚えた!
2006年12月14日
記念すべき初エントリ
2006年12月3日
わんくま同盟に加盟しました。

カレンダー

中の人

シャノン@わんくま同盟北埼玉支部

顔写真

埼玉を馬鹿にする奴は俺が許さん。

基本的に知ったかぶり。興味を持った技術に手を出して、ちょっと齧りはするものの、それを応用して何か形にするまでは及ばずに飽きて放り出す人。

Microsoft MVP for Windows SDK July 2007 - February 2008, Microsoft MVP for Visual C++ February 2008 - June 2009
Microsoft MVP for Windows SDK
July 2007 - February 2008
Microsoft MVP for Visual C++
February 2008 - June 2009

アクセサリ

あわせて読みたい

e-Words

アフィリエイト

記事カテゴリ

書庫

日記カテゴリ

オブジェクト指向を英語的に考える

オブジェクト指向とは何だろうか? よくわからない。
が、読み解く鍵が「オブジェクト」にあることは間違いない。
では、「オブジェクト」とは何だろうか?
とりあえず、英和辞典で調べてみたところ…出て来る出て来る、コンピュータ関連の意味ばかり。
今回は、そのコンピュータ用語としてのオブジェクトの語源を知りたいので、一般的な意味に限定しよう。
オブジェクトの説明でよく聞く「オブジェクト」の訳語としては「もの」というのがある。
しかし、今回はこれではなく、「目的語」と「対象」という意味に焦点を当ててみよう。

「目的語」とは、文章を構成する言葉の一種である。
中学の英語の授業で、「英語はSVO型文法」とか習わなかっただろうか。
SVOとは、Subject(主語)、Verb(動詞)、Object(目的語)の略である。このOが今回のターゲットだ。ちなみに日本語はSOV型文法である。

まずは簡単に、英語の復習から。

英語でもっとも単純な文型は、Oの無いSV型(第一文型)である。
例えば、「He runs.(彼は走る)」。

しかし、SVで完結できないVがある。
例えばdrive(~を運転する)。「He drives.」では「彼は~を運転する」となり、何を運転するのかわからない。
このように、SVで完結できない文に対して、Vを補う役割を持つのがOである。

例えば先の例なら、「He drives a car.(彼は車を運転する)」で意味が通じる文になる。「a car」がOである。
これはSVの後にOが付く、最も一般的なSVO型(第三文型)である。
ちなみに、日本語では「~に」とか「~を」という形になる部分が目的語だ。「彼は車を運転する」なら「車を」という部分があるので「車」が目的語になる。

英語のレッスンは一旦置いといて、これをプログラミング言語で書いてみるとどうなるだろうか?
単純に He.drive( car ); かな?
答えとしてはこれで合っている。けれど、考え方がちょっと違う。
何故なら、「He drives a car.」の「He」はS(主語)であって、O(目的語、オブジェクト)ではないからだ。

すんなり行かない理由は、オブジェクト指向の性質にある。
オブジェクト指向とは、「オブジェクト同士が、メッセージ交換によって協調動作する」という思想だからだ。
オブジェクトとは、メッセージを受けて初めて動くことが出来る受動的なものなのだ。
これは、言い換えれば、「オブジェクトとは、メッセージを送る対象である」とも言える。
そう、「オブジェクト」の「対象」という意味はここにある。

「He drives a car.」では、誰に頼まれたわけでもないのに、彼が能動的に車を運転してしまっている。
余談だが、このように、メッセージを待たなくても能動的に動くことが出来るものを「エージェント」と呼び、オブジェクトではなくエージェントを中心としてプログラムを構築する手法を「エージェント指向」と言う。
オブジェクト指向の次の段階として研究されてはいるが、まだ実用段階ではないようだ。

さて、彼に車を運転して欲しければ、そのようにメッセージを送らなければならない。
つまり、He.drive( car ); に対応する文章は、「彼は車を運転する」ではなく「彼に(メッセージを送って)車を運転させる」でなければならない。
主語を省略せずに言えば「私は彼に車を運転させる」となるのが正しい。
この場合は「彼に」と「車を」があるので、「彼」と「車」が目的語…というわけにはいかない。

「私は彼に車を運転させる」という文章を英語に直すと、「I have him drive a car.」になる。
「I have」がSとVで「私は~させる」となる。これは主語と使役動詞。
「him」が「彼に」で目的語。
では「drive a car」は? これはまとめて「補語(Complement)」という扱いになる。
使役動詞を伴う文は、SVOに加えてCが必要なSVOC型(第五文型)である。
オブジェクト指向でのメソッド呼び出しはほとんどの場合、オブジェクトを使役するので、「I have ~」で始まるSVOC文型になると言えるだろう。
考えてみれば、「彼」は「車を運転しろ」というメッセージを送る「対象」、つまり「オブジェクト」なのだが、「車」はメッセージの一部なので「対象」ではない。ということは「オブジェクト」ではない(※)。つまり「目的語」でもない、ということになる。
このように、「目的語」と「対象」という意味は繋がっていることがわかる。
「He drives a car.」という英文の「a car」は目的語だったが、この文はそのまま「He.drive( car );」にならないという点に注意して頂きたい。

※実際のプログラミング上では「車オブジェクト」であることが多いだろうが、「He.drive( car );」という文だけを見れば、car にはメッセージを送っていないので、オブジェクトである必要は無い。

先ほど「ほとんどの場合」と書いた。ということは、例外があるということだ。
「I have him drive a car.」をプログラミング言語風に書くとどうなるだろうか。
直感的に考えれば「I.have( him, drive, car );」かな。
メソッド名であるdriveが引数になっているあたり、リフレクションぽいものを感じさせるコードになった。

さて、このメソッド呼び出しのおかしい点を見つけられた方は、この記事をよく読んでいる方だ。
どこがおかしいのかと言うと、序盤でダメだと言った「主語のオブジェクト化」が起きてしまっている点だ。I は英文上は主語なのに、プログラミング言語だとオブジェクトになってしまっている。
「He drives a car.」をそのまま「He.drive( car );」とするわけには行かなかった。これは「I have him drive a car.」という使役型として考えることで解決した。
しかし、今度はそうは行かない。自分を使役することは出来ないからだ。
実際にやろうとしてみると、「私は私に『彼に車を運転させる』をさせる」というまどろっこしい文になるばかりでなく、「私は」の部分が再帰的になり、スタックオーバーフローを起こす結果となってしまうだろう。

この問題も、解決できないことは無い。
この「I」というオブジェクトは、C++やC#ならば「this」、VB.NETならば「Me」と呼ばれるものである。
一般に、thisやMeは省略することが出来る。
つまり、先のメソッドであれば、「have( him, drive, car );」と書いても動くはずだ。
これで、コード中に「I オブジェクト」は無くなった。

このように、自分自身のメソッドを呼び出す場合、「自分自身を使役する」という面倒くさい方法を使う必要は無い。
にもかかわらず、thisやMeといった特殊なオブジェクトが提供され、「this.have( ... );」などというように書くことが出来るようになっているのは、単純に他のオブジェクトを使役する場合との構文の一貫性を保つためであると考えられる。
I オブジェクトだけは例外的に、使役構文にならないというわけだ。
考えてみればこれは当然だ。
「I.have( ... );」というコードが実行されようとしているとき、自分自身は既に動いているからだ。
彼を動かすときは彼にメッセージを送る必要があったが、自分自身は既に動いている。ということは、既に誰かからのメッセージを受け取って使役されている立場になるわけだ。
自分で自分を使役しないのは、既に誰かに使役されているからである。

なお、長々と説明してきたが、当然、実際にプログラムを組む上では「this.have( ... );」などと書く必要は無く、「He.drive( car );」でいいという点にはご注意を。
しつこいようだが、「He drives a car.」と「He.drive( car );」が一対一に対応しないということを示しただけである。

special thanks to Tin-Guish.com

投稿日時 : 2007年1月22日 0:45

Feedback

No comments posted yet.
タイトル  
名前  
Url
コメント