「疑り深いあなた」はインスタンスをOOPの本質と言われて納得できるのか

私が、なぜオブ本書評で前橋さんの講義「疑りぶかいあなたのためのオブジェクト指向再入門」を OOP じゃない、と言った問題について、神様なんて信じない僕らのために さんで議論になっています。

で、最後のの、前橋さんのコメントを読んで、思ったこと/言いたいことが出て来てムズムズしてしまいました。あぁ、あたしんちに書いてくれたらうれしかったのに。で、Isoparametricさんちの コメント欄にいろいろ書きかけたのですが、例によって肥大化してしまったですし、ちょっとヒトのウチで場外乱闘はどうかな?、と思い直して自宅にてエントリーをば。

ひとつめ、

抽象データ型は、少なくともC++流のオブジェクト指向における重要な構成要素です。というか、抽象データ型の発展形がクラスです(これはかなり一般的解釈だと思います)。
http://d.hatena.ne.jp/sumim/20080415/p1

複数個を前提とした設計はオブジェクト指向で綺麗な設計か? - 神様なんて信じない僕らのために

まず議論の本質じゃないところに しおり風突っ込み。Simulaクルム宮国 の住人になりたい あたしは「これ、どうなんだろうね」と思います。

sumim さんの添削待ちなのですが、もともとクラスは ブロックの発展系として生まれたモノで、生まれの経緯からすると、ADTの発展型とは言えないと思います。そして Simula の段階で ADT とマゼマゼされてたか、というと、よくわかんないけれど、マゼマゼされてなかったと思う、といったところです。(うー、間違ってるんじゃないかと著しく不安になってくる)

...sumimさーーん!(ぉ

もういっこ、

>そのずっとずっと先にオブジェクト指向がある、

「ずっとずっと先」というほど遠くないようには見えませんか。足りないのは継承とポリモルフィズムだけです。

複数個を前提とした設計はオブジェクト指向で綺麗な設計か? - 神様なんて信じない僕らのために


OOP はプログラミングパラダイム ですので、機能である「継承」や「ポリモーフィズム」だけでは足りません。それら使ってこのパラダイムはプログラムをどのような姿に描くのか、を説明する必要があります。

そういう視点では、「ずっとずっと先」なんじゃないかな、と思います。ていうか前橋さん自体もまだまだずっと先(説明するボリュームが大きい)と思っているから、そこまでを説明の範囲に含めなかったとおもいますし、

でも、継承を適切な実例で説明するのはえらく難しい

2008-08-03 - みねこあ

とおっしゃっていること自体「ずっとずっと先」といっちゃって良いほどの難関がまちかまえている、で、実は合意がとれてるのじゃないかしら?と思います。


あいすすとーむっ!

抽象データ型は、「型」というくらいで、複数生成を前提にしています。クラスもしかりです。
Isoparametricさんのおっしゃるように、プログラムによって、「あえて複数生成を前提にしない」ことはあるでしょう。でもそれは「あえてオブジェクト指向を使わない」と言っているのと同じでは。

複数個を前提とした設計はオブジェクト指向で綺麗な設計か? - 神様なんて信じない僕らのために

説明はうまくできないのですが、それは違うと思います。

....Isoparametricさーーん!(ぉ



* * *


前橋さんの講義について、は、実は二つ目のヤツだけなのですが、まーいろいろ脱線しちゃうのが大好きなんだと理解くださいまし(^^;

さて、インスタンスなんて、ブロックにもある概念で、OOPとか抽象データ型とかでポン出 したものではありません。しかしサブルーチンは、「サブルーチンにインスタンスがある」なぁんて言っても「はぁ?」となるくらい、巧みに純粋な演算の箱のふりをしています(そしてそんな理解でも問題が起きにくい)が、OOP ではそうはいきません。凪瀬さんの言葉を借りれば、

Javaの場合はインスタンスというものが掴めないとその先にはどうやっても進めないのでとにかく実習してクリアしてもらう。

インスタンスを理解できない関連で、つれづれ - みねこあ

訳です。ですから、OOPを教える入り口で インスタンスの概念を丁寧に教えることが必要...というのは解る気がいたします。

ですが、OOP に一度挫折した人が それで挫折したとも思えませんし、かりにインスタンスの概念の理解で躓いていたとしても、「なぜ解らなくなるのか」で挙げていたような 解らなくなる理由、(メッセージいってよし、とか。ワンニャーいってよし、とか)とは、はっきり言って結びつかないように思えます。

OOP が解りにくいのは、ワンニャー比喩 とか メッセージ比喩のせいだ
                     ↓
よぉし、パパ、インスタンスとはなにかをおしえちゃうぞ

は、つながりがよくわからんということです。

大事なことだからもう一度言うよ。

そして、「アンチOO」な人は、どう見てもオブジェクト指向を理解しているとは思えない。

こんなことになってしまった原因は、私はやっぱり説明が悪いことに尽きると思います。

オブジェクト指向再入門/はじめに

でわくわくしたのに、

私は、オブジェクト指向の「本質」と呼ぶべきものは、カプセル化でも継承でもポリモルフィズムでもなく、「マルチプルインスタンス」にあると思っています ※2

※2 「それは抽象データ型だ」という意見もあるかもしれませんが、抽象データ型はオブジェクト指向に至るためには必須の概念です。

オブジェクト指向再入門/はじめに

で、ハァ? となります。


誤解しないでいただきたいのは、OOPはどんなものなのか、と言う話じゃ無くって、疑りぶかいあなたのためのオブジェクト指向再入門 にはちょっと構成や表現に問題があるのじゃないか、という話をしたい、ということです。

「抽象データ型はオブジェクト指向に至るためには必須の概念」は間違っていないと思います。もし インスタンスという概念が、OOP理解におけるメジャーな躓きポイントであるなら、まず、そこをクリアにしなくちゃいけない、という学習パスの設定も理にかなっています。


けれども、「マルチプルインスタンスオブジェクト指向の必要条件である」のはそうですが、十分条件ではないです。十分条件を満たさずに「本質である」と言い切ってしまっている点が前橋さんの講義の問題の本質だと思います。

「はしごをかけた」というなら「OOPの本質」なんて言わずにありのまま「OOPへのはしご」だと言えばよかったのに、と思います。