オブジェクト指向プログラミングの難しさ

皆さんオブジェクト指向プログラミングって知ってますか?とかアホな質問から始まるこのお話は大抵の人にはなんら役に立たないものなので、その点をご了承頂いた上でお読み頂ければと思います。

まえがき

プログラムを仕事で書くようになってからそろそろ8年が過ぎようとしている筆者ですが、かなり前から気になっていることがあります。それは「オブジェクト指向プログラミング(以下 OOP )の難しさ」です。もちろん OOP の概念等が難しいとか、そういう話ではありません。ここで取り上げるのは世の中に氾濫する「解説書」の類に用いられている用語についての話です。

大抵の人にとって OOP というのは、インスタンスがあってメソッドがあって継承があって…という感じだと思うのですが、インスタンスはオブジェクトと書かれていることもありますし、メソッドはメンバーと書かれているものもあります。とにかく同じモノを意味するのに用語が複数あるという現実がそこにはあります。この説明をこれからプログラミングを勉強しようとする初心者の方が読んだ場合、混乱無く理解出来るとは到底思えないのです。これが OOP の難しさに一役買っているのではないか、という仮説の上で以下の話を進めます。この前提が壊れると本気で意味の無い文章になってしまうのですが…。

インスタンスとオブジェクト

インスタンスというのはクラスを実態化させたものです。このインスタンス instance を英辞郎(http://www.alc.co.jp/)で調べると以下のような説明が出てきます。

instance 【名-1】 場合{ばあい}、事実{じじつ}、(事実{じじつ}を例証{れいしょう}するための)例、事例{じれい}

分かったような分からないような、そんな感じですが要するにクラスという抽象的な存在を実際に使えるように現実化させるとでもいいましょうか。更に英辞郎の説明は続きます。

【名-2】 《コ》インスタンス◆オプジェクト指向言語で、しばしば「オブジェクト」とほぼ同義で用いられる。

出ました!英辞郎に登録されるほどこの2つの言葉は有名で、尚且つ重要ということですね(言いすぎ)。おそらくこれはインスタンスの方が実際の意味を的確に表しているのだと思いますが、OOPOOP たる由縁であるオブジェクト(物)も並行して使われてきた負の遺産と推測します(調べてません^^;)。

メソッドとメンバー

次、メソッドとメンバーです。元々 C 言語には構造体というものがあって、データ構造を表現する為の手法として古くから大変便利に使われてきました。この構造体に属する変数をメンバーと言い、アクセス子として . (ドット) と -> が使われてきました。そして時代は流れ世の中に C++ という新しい言語が出現することになります。C++ は C 言語で使われていた構造体を拡張した(と表現されることの多かった)クラスを使ったプログラミングが可能で、C++ のメソッドへのアクセス子はその歴史的経緯から . と -> が採用されました。もうお分かりですね、というかこちらは火を見るよりも明らかですね。「C 言語を習得してる人に C++ を教える場合、メンバーという言葉を使った方が教えやすかった」とかいろいろ理由は考えられますが、結局こちらも負の遺産と言わざるを得ません。

混乱の世界

かくして同じ意味を持つ(少なくとも同じ物を意味する)複数の用語が利用され続けてきた訳ですが、これが初心者にとって混乱の元になっていることは想像に難くありません。元々日本人にとって頭に入りにくいコンピュータ用語、そこに輪をかけてこの「用語氾濫問題」です(今名付けました)。こんなんじゃ理解しろって言う方が無理ってもんですわ。

もちろん用語を定義した上で説明した方が分かりやすいとは思います。が、「とりあえずこうやっとけ!」で説明して、後で詳しく説明するという方法もあると思うのです。とにかく用語を書かないと(それも最初の方に勉強しようとする人のやる気を削ぐ勢いで書きまくらないと)気が済まない人が多すぎます。そんなに横文字が好きですか?オレは嫌いです。


という訳で、オブジェクト指向プログラミングを解説するのにインスタンスという用語の利用は不要論をここに提唱します(まぁまぁ本気です)。

追記 2005-03-26

小見出し付けて見ました。文章全体がグッと引き締まった気がします。文章は全く変更していないので気のせいなのですが。それにしても、はてなDialyって便利ですね。

あと英次郎は間違ってましたので修正しました…。正しくは英辞郎です。