kagamihogeの日記

kagamihogeの日記です。

オブジェクト指向プログラミング入門

本書の最大の特徴は、コンピュータサイエンスの学生向けの教科書として書かれている点。まえがきにも書かれているのだけど、大学 3,4 年から修士 1 年向けレベルの教科書として書かれている。俺も一応情報系の学生の端くれだけど、その点から見てこの本はかなり良くまとまっていると思う。俺のように伝統的(という表現が適切かどうかは分からないけど)なソフトウェア工学を学んできた人間にとっては、本書はオブジェクト指向プログラミングの入門として実に良い教科書になる可能性が高い。

ソフトウェア工学の学生向けの教科書として良くできてるな、と印象に残った部分の一つは事例研究にエイトクイーンを設けていること。少なくともウチの大学ではこのテのシミュレーション系の問題を手続き的に解くやり方はミッチリ学ばされる。ただ、俺はそのテの問題を、オブジェクトの連続を持ってしてモデルの表現を行う、という、オブジェクト指向プログラミングの手法で解くやり方は学ばなかったので、本書のそういった工夫はかなり新鮮に映った。

ただ一点注意があるとすると、本書はやや古い本に属すること。Java が最新の言語として書かれてたりするし。なのでそこんとこは気を付けないといけないけど、内容そのものは今読んでも遜色ないし、得られるものは多いと思うんであまり気にしなくてもいいかもしれない。動的言語の可能性についても触れているしね。


さて。それでは本書を読むことで得られた、俺が OOP について間違って理解してたりそもそも理解していなかったことの振り返りタイム。もちろん、ここに書いたこともまだまだ間違っている可能性もあることに注意してください。

オブジェクト指向プログラミングは一つのアイデア

実際のところ、OOP というのはプログラミングを行う上での一つのアイデアでしかない。いやまぁ「でしかない」と言うほど小さなものじゃないのも確かなのだけど。俺が理解していなかったのは、考え方としての OOP とその実装としてのプログラミング言語の差。たとえば、J2EE 界隈に見られるよくある仕様と実装の差、みたいな感じ? 仕様の話なのか、実装の話なのかの区別が出来ていなかった、と言えばいいのかな。OOP のアイデアを機械の上で実行可能な状態に持っていくには様々なギャップを乗り越えないといけない(特にメモリ周り)んだけど、そのギャップについてよく分かっていなかったように思う。

本書では、ある OOP のアイデアがあるプログラミング言語ではどのように実装されているか、という議論がしばしば行われる。Smalltalk, Objective-C, C++, Java... と、文法も良く知らん言語で比較研究されている箇所を読んでいる内にふと気付いた。誰かが OOP について話す時に、概念として論じているのか、ある言語での特性について語っているのか、ある言語上で OOP をどのように実践すべきかを話しているのか、それともマーケティングの都合上ただ単にオブジェクトオブジェクト連呼しているだけなのか、がゴチャマゼになっていたなぁ、と。どうもそのことが俺の OOP の理解の妨げになっていたように思う。

継承

継承についてもやっぱり同じで、Java だと extends と implements という 2 種類の実装に相当するわけだけど、アイデアとしてはもうちょっと広い代物なことを分かっていなかった。本書では「7.3 継承の形態」で継承のカテゴリを 8 つ紹介しているのがその証左。まーこの分類の妥当性やワザワザ分類する意味あんのか、ってことはまた別で考える必要があるだろうけど。ただ、少なくとも俺は本書で継承について新たな視点が得られたと思う。

俺は継承って使いこなすの難しいよなぁ、と思っていて、なりすまし継承にご用心 - kagamihogeのblog みたいなエントリを書いたりもしてるんだけど。本書では、

プログラマが複数のクラス宣言の間を行ったり来たりしなければならない問題は「ヨーヨー問題」と呼ばれています[Taenzer 1989]

第 9 章 ソフトウェア再利用の仕組み 9.3 組み立てと継承の比較 P.211 より抜粋

って書かれてて、あー俺が悩んでたことって既に 20 年前に議論されてたんだーとか思って苦笑してみたり。まぁでもそれってすなわち古い文献から学べることはある、ってことでもあるよね。

クラス、インスタンス、オブジェクト

俺はどーにも動的言語って一口に括られるプログラミング言語の価値がわからなかったんだけど、なんとなくだけどその良さが分かってきた気がする。本書の第 20 章クラス再考ではそのものズバリな「20.4 クラスは必要か」という節があって、クラス抜きのオブジェクト指向言語の可能性について論じている。他、オブジェクトとメッセージの関係について触れてる箇所を読んだりしていると、静的に型を決めるのではなく、動的に解決すればいいじゃん、という手法の良さも段々と分かってきた気がするし、確かにそっちの方が OOP として自然なような気がしないでもない。

この本読んだあと Squeak をちょろっとさわってみて、理屈じゃなくて直感的にあぁなるほどと思ったし。アラン・ケイ(だっけ?)が「従来のプログラミングに慣れた大人より子供のほうがオブジェクト指向を直感的に理解する」みたいなことを言っていたような気がするんだけど、今はその気持ちがなんとなくわかった気がする。まぁ少なくとも、クラス = データ構造 + 手続き、という昔の理解のままでは、今の理解に至れなかったであろうことは確かだろう。



うーん……なんつーか、オブジェクト指向プログラミングの海はまだまだ広大だなーって思う一冊でした。

オブジェクト指向プログラミング入門

オブジェクト指向プログラミング入門

  • 作者: ティモシイ・A.バッド,Timothy A. Budd,羽部正義
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 2002/12
  • メディア: 単行本
  • 購入: 3人 クリック: 195回
  • この商品を含むブログ (41件) を見る