関連:id:sumim:20040525:p1
いろいろなところ(っても主に はてな 界隈ですが…)で目にするようになったので、買ってみました。
(69 ページ)
ここまできたところで、もう一度多くの入門者にとって紛らわしい概念を区別しておこうと思う。それはクラスとオブジェクトの違いである。
この問題は実は非常に単純である。クラスは型であり、オブジェクトは型のインスタンスである。
《中略》
この区別は、プログラムと実行可能なプログラムの違い、型の型の値の違い、または、もっと一般的な例では、パターンの実現の違いなどとまったく同じである。これを混同する危険は実のところまったくない。この問題の出所の1つは Smalltalk の設計者にある。
ふむふむ。ん?
この問題の出所の1つは Smalltalk の設計者にある。
なに―――――ッ! w
クラスを含めてすべてをオブジェクトとして扱うことに固執してしまったのである。
固執ってあーた…。 orz たまたま、通常の言語設計者とは目先が変わっていて、言語やライブラリそれ自身も“オブジェクト指向”(貴方の言うところのものでも構わない)を用いた設計の対象であっただけの話ってことで、見逃してくれないもんなんでしょうか。
ここで一気に読む気力がなくなりかけましたが、この先に何か良いことも書いてあるかもしれないので、もうちょっと我慢して読んでみることにします。高い本だったし。しくしく。
とりあえず、オブジェクト指向の定義、というか、言語がサポートすべき機能については、当初の予想に違わず、おおまかには、ストラウストラップの「(ユーザー定義型による抽象化手法)+(継承、仮想関数による動的結合)」の“オブジェクト指向”に似ています。
- オブジェクトを基本としたモジュール構造
- データ抽象
- 自動メモリ管理
- クラス
- 継承
- 多相性と動的束縛
- 多重継承と反復継承
…が、本書ではストラウストラップのくだんの論文は引用されていません。
もっとも、メイヤー自身は本書の冒頭で(たとえ話を介してではありますが)「(オブジェクト指向には)学者もまだ適当な説明を与えることはできない」と言い切ってしまっている都合、本書のオブジェクト指向がまったくの“俺”定義であることはさっさと(間接的に)認めてしまっているわけですが…。しかし、上の項目を満足することが“真の”オブジェクト指向への到達だとも言ってしまっていますし、ちょっと分裂症気味のところも。
さいわい(?)彼の“オブジェクト指向”には「メッセージ送信」とかは出てこないので読み続けるには支障ありません。もし「オブジェクトにぃ、メッセージを送信してぇ、メソッドを起動するとぉ…」などと説明したあとに、臆面もなく Smalltalk に上のようなケチを付けていたなら、その時点でこの本は燃やされていたことでしょう(笑)。