サポンテ 勉強ノート

サポンテの勉強ノート・読書メモなどを晒します。

オブジェクト指向入門以前

はじめに

Java 言語の流行によって広く認知されることになったオブジェクト指向開発ですが、このオブジェクト指向という概念を最初に身につけようとする際に、高い壁があります。

まず、概念自体が難しいこと。次に良質な入門情報がないことです。

そのような中、この記事では入門情報に触れる以前に知っておくと役に立ちそうなアイディアを紹介します。

私自身の経験

少ないではなく「ない」と書きました。実際、今日に至るまで良質な情報に出会ったことはありません。ではそのような良質な情報がない中で、サポンテ自身はどのようにオブジェクト指向という概念を身につけたのでしょうか。

それは「習うより慣れろ」の格言通り、手を動かし、試行錯誤しながら膨大な凡例を積み重ねるうちに、うっすらにじみ出てくる影のようなものから気付きを得るという、なんとも非効率的で古典的な方法でした1

オブジェクト指向の理解は難しい

一旦理解してしまえばなんということはない概念なのですが、どうしても最初はハードルがあります。

概念がわからなければオブジェクト指向プログラミングは叶わず、オブジェクト指向プログラミングを理解していないと概念を理解できないというデッドロックがあります。

オブジェクト指向を理解する前はもちろん、理解してからもオブジェクト指向入門書をたくさん読みましたが、「こんな説明じゃ理解できないだろうな(少なくとも自分は理解できなかったなあ)」という説明ばかりでした。しかし同時に「こう説明するしかないよなあ」という事情も察せられました。

プログラムとは何か

事情は察することができますが、やはり初心者に寄り添っていないという点で適正を欠いています。

数多ある入門書は「オブジェクト指向とは」という章を必ず設けてこの概念の説明に挑戦しています。しかしすべて失敗しています。説明しきれていないか間違っているからです。

一歩下がって「プログラムとは何か」を的確に表現できている入門書があるかというとこちらも少ないのですが、プログラマの皆様、改めて訊かれてパッと答えられますか?

次のように書かれている本に出会うことができました。

コンピュータにさせる仕事を順番に記したもの。

たしか次の本です。

簡潔で、且つ初心者でも確実に理解できる説明になっています。しかも正確です。オブジェクト指向だろうイベント駆動だろうとなんだろうと、この記述から外れている言語はないでしょう。

同じ問いに「オブジェクトにメッセージを送ること」と答えたオブジェクト指向大家がいたという話をどこかで読んだことがあります。この答えは簡潔ですが、知ってる人にしか解らない答えです。道を究めた人が「得たり!」と詠むような内容です。まあ「初心者に説明するには」という質問で出てきた言葉ではないで、ここで挙げるには不適切かもしれません。しかし「プログラムとは何か」という問いに対して考えても的を外していると感じます。

オブジェクト指向をひと言で言うと

それでは元に戻ってオブジェクト指向をひと言で言うとどうなるでしょうか。たいていの入門書には次のように書いてあります。

オブジェクト指向開発とは、現実世界の「もの」をそのままシステム化することである。

残念ですが、この説明はきわめて不正確です。初心者のころ見かけた説明もこうでしたし、今日多く見られる説明も大同小異です。この説明は間違っています。決して「現実世界そのまま」ではありません。もし「そのまま」であるなら、プログラムの中でインスタンスを作れば現実世界でもそれと同じものが即座に発生するはずです。そんなことがあり得るのか?いや、あるはずがない。しかしそう書いてある。非常に混乱しました。この説明で、かなり足止めを強いられました。

技術書籍という、正確さがなにより求められるメディアでこのような表現が溢れていることは不幸以外の何ものでもありません。これは、少なくとも次のように言い換える必要があります。

オブジェクト指向開発とは、現実世界の「もの」の模型をシステム化したものである。

あるいは

オブジェクト指向開発とは、現実世界の「もの」と同じ単位でシステムの部品を構築することである。

これなら正確です。文字数もさほど変わりませんので「紙幅の関係で説明を端折った」と言いわけすることも許されません。

「そんなの当然じゃないか!それくらい解るだろう?!」とお考えでしょうか?だとするとあなたは習熟した者が当然と考えられることが初学者にとってはそうではないという当然のことを忘れています。それくらいが解らないのが初心者です。そのような書籍は「入門書」失格です。「適量」とか書いてあるレシピです2

もう一つ「そのまま」という言葉には「だからオブジェクト指向という概念の理解は平易である」と誤解されかねない雰囲気があります。これも習熟した者が犯しがちなミスです。習熟した者が既に身につけた概念を理解するのが平易であるのは当然だということを忘れています。そこに至るまでの道を初学者はこれから歩み始めるのだということを忘れています。

犬猫オブジェクト批判

オブジェクト指向入門書にありがちで、且つよく批判される説明方法に、通称「犬猫オブジェクト」というものがあります。これはものの特徴を抽象化する方法の説明で、よく用いられる比喩です。サポンテもこの説明は「百害あって一利無し」と思っています。プログラミングで使うことが希な概念を説明に用いることは毒にしかなりません。犬猫オブジェクトは、オブジェクト指向に習熟した人間が「あっ、この考え方って犬猫の関係に似てるじゃん。オレ気がついちゃったかも。オレ天才!」などと独り悦に入ってひけらかしている説明です。これから学習しようとする人間に対して、習熟してからでないと理解ができない説明を疲労するという逆説。愚かです。

しかし前述の「模型をシステム化」「同じ単位でシステムの部品を作る」といったことを忘れずに臨めば、それほど恐れることはなくなるのかもしれません。しかし犬猫オブジェクトが登場する書籍は往々にして「そのまま」などという説明があったりするので厄介です。システムで犬や猫をそのまま作ることはありません(できません)。システムで扱うのは犬や猫の「名前」だったり「種類」「年齢」「ブリーダーの名前」などの、あくまでも「ユーザーが欲しい情報」や「所作の模倣」つまりは特徴を抽出した「模型」に過ぎません。どうか安心してください。

オブジェクト指向が何を指すか

もう一つ、入門以前に知っておくと役に立ちそうな「気付き」を紹介しておきます。

それは「『オブジェクト指向開発』と『オブジェクト指向言語』は違うアイディアである」ということです。これをハッキリと書いている説明してくれている書籍も少ないので、初学者の方は混同することが多いでしょう。

皆さんが「オブジェクト指向」を学び始めるのは、おそらくはオブジェクト指向言語の学習開始と同時ではないでしょうか。オブジェクト指向言語を用いずにオブジェクト指向開発をするということはできますが、かなりマニアックな領域です。たいていは同時に学び始めることになるでしょう。

このとき「オブジェクト指向開発という概念を学んでからオブジェクト指向言語に着手するべし」としている書籍もありますが、これには賛否がありますし「そんなに時間をかけたくない。同時にできるなら同時に済ませたい」という気持ちもあるでしょう。

そのようなわけで、この二つを混同したまま学習を始めることになってしまうのですが、今、自分は何を学習しているのかというところで混乱があると、身につくものも身につきません。これらの違いは明確に意識しておいたほうが良い。

オブジェクト指向開発とは__上記の繰り返しになりますが__現実世界の「もの」と同じ単位でシステムの部品を構築する手法のことで、オブジェクト指向言語とは、それを容易に表現できることを目指したプログラミング言語のことです。

書籍には、単に「オブジェクト指向」としか書かれていない場合があります。ですので「これはオブジェクト指向開発について言っているのか、それともオブジェクト指向言語についてなのか」と切り離して考えながら読むことは、理解の助けになるでしょう。

おわりに

オブジェクト指向の概念は難解です。膨大な凡例を積み重ね、ぼんやりしたものの中に少しずつ形が見えてきます。非効率で古典的な方法と冒頭に書きましたが、ある程度はそうするしかないかもしれません。簡単に理解できるなどと謳っている書籍は警戒した方が良いでしょう。

ですが、もしこの記事を読んだあとでオブジェクト指向に対する警戒感が薄れていたり、書籍を読み進めるのが楽になっていたりすれば幸いです。


  1. 同じような方法では、書籍をたくさんかき集めて多読することがあります。一発でOKな良質な情報はなくても、同じような説明を繰り返し読むことでおぼろげな概念がだんだん形になっていきます。しかしそんなに経済的余裕のある人ばかりではないでしょう。
  2. レシピ本に書かれた「適量」が分らず、ナツメグを多量に使用し病院に送られることになったというニュースがありました。「ナツメグ中毒」などで検索すると見つかるでしょう。レシピ本も「適量(0〜0.2g程度)」などと書くべきだと思います。少なくとも入れすぎると危険な食材については。