「疑り深いあなた」はインスタンスを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へのはしご」だと言えばよかったのに、と思います。

くまさんに質問するつもりで整理してみる

なんかぐちゃぐちゃになってしまいました。sumimさん、ごめんなさい。

質問に出す前に、くまさんを目の前においてエントリーを書いてみよう。(くまさんは、実はいないから アリア社長に代理でいてもらおう)


いったい何がしたかったの?

オブジェクト指向でなぜ作るのか、や、憂鬱本を dis りたい。(ぉ
このとき、「こういうのもOOPなんだよ」と、なんでも OOP 化が邪魔になる。

(うわ、イビルだ)

もうちょっと具体的に

構造化定理を満たすもの(= 三大制御構造のみで書いてあるプログラム)を「構造化プログラミング」と定義すると、駄目なプログラムもその許容範囲に入ってきてしまう。

幸い、ダイクストラ先生は、三大制御構造のみを使うことを「ツール」と位置づけ、実際に構造化された良いプログラムを書くにはどうすればよいかを、「構造化プログラミング論」の中で丁寧に説明されている。上の定義は嘘800だと安心して言える。

で、「ユーザー定義型を使ったプログラム」「継承で差分をくくりだしたプログラム」というのは、「構造化定理を満たしたプログラム」と同様、駄目なプログラムもその許容範囲に入ってきてしまう。

これを切りたい。

実は、OO「P」ってそういうモノだと思わない? 良いか悪いかは「D」が決めるのでは?

sumim さんとコメントを交わしてそう思い始めた。

デザインパターン」とか「責務分散協調系」とかは OOD なんじゃないかって。というのも、今回のパターンは、

えんどう

擬人論とか責務とかが全く出てこないことに納得がいきません。
ここで論じられている事は実装上のことだから、でしょうか?

sumim

ここで、挙げておられる「擬人論」や「責務」はどなたの発案のものでしょうか。
えんどうさんは、オブジェクト指向の説明に、よくこれらの考え方を引用されておられますよね?

えんどう

出典は分かりませんが、ごく一般的な考え方だと思っていました。
特に「責務」(responsibility)はオブジェクト指向設計で頻繁に使われる用語です。

えんどう

その後ちょっと思い出してみたのですが、かつて影響を受けた青木淳さんの「オブジェクト指向分析設計入門」を久しぶりに読んでみたら青木さんは「擬人化」という用語を使っていました。
http://www.sra.co.jp/people/aoki/IntroductionToOOAOOD/

sumim

OODA のお話でしたか。OODA は比較的時代も新しく、発案者や背景も明らかで、引用も正しく行なわれている場合も多いので、ここでは扱っておりません。つまるところ、最初に書いていただいたように「ここで論じられている事は実装上のことだから(「擬人論」や「責務」については言及がない)」ということで片付けてしまってよいように思いますが、いかがでしょう。

オブジェクト指向の概念の発明者は誰ですか?(改訂版) - Smalltalkのtは小文字です

と同じモノなんじゃないかと思い始めたから。


それで納得した?

いーえ。

だって、そんなん「この部品だけをつかってプログラムしてください」であって、全然エンジニアリングじゃないんだもん。こういうのは良いモノつくれてナンボでしょう。

目的のない手段に意味がないもの。

実は、OO「P」ってそういうモノだと思わない? 良いか悪いかは「D」が決めるのでは?

その質問はさっき聞いた。


なぜ Simula にこだわったの? シムーンが好きだから?

シムーンは好きだけれど、そうじゃない。多分二つ。

「なぜオブ本」ようなので、発生学的なアプローチとして、「いわゆるモジュール(広域変数とルーチンのペア)」を強くして「クラス」になったよ、言うけれど、事実はそうでないということ。「ストラウストラップ/メイヤー派」は Smalltalk を認めてい無くって、Simula だけを認めているけれど、そのSimulaであったって、実際そうじゃないじゃん。というマニア心を満たす話をしたかっただけ。

ただ、メイヤー先生の定義の「モジュール」だと「ブロック」も「モジュール」だから全然無問題なんだけれどね。先生たちが悪い(悪くない)、というのじゃなくって、そういう説明をしても足下があやういよ、というオレ系論者への主張。(しかし、「発生学」じゃないよ、単なるわかりやすい説明だよ、こういう見方をしているんだよ、と言われると、今度はあたしの足下がロストする。おそろしや)

もう一つは、Simula じゃなくって、「階層的プログラミング構造」という Dahl/Hoare の論文を読んで。

これは現在の間口がバカみたいに広い OOP からすると OOP であるように見えるけれど、実は 「抽象データ型派」と あまりよく繋がらない(つながりがあまり見えてこない)と言う点が気になったから。

Simula からは 継承の部分だけ「いただきます」して来て、別から引っ張ってきたADT とくっつけたという印象を受けた。(ただ、継承の部分は「部分だけ」というのはあまりに大きい)

後者はたんなるミスリードかもしれない。

実はストラウストラップは「オレオレ」といいたい?

言ったら袋だたきかな、と思うけれど実は言いたいw

後々エライ影響が出る ADT の追加をしている以上、もう発明したといって過言ではないとおもう。Smalltalk みたいに「クラスとオブジェクトだけ借りてきたけど、オイラが作ったよ。ルーツはオレだ」のほうがいいと思う。

それは妄言じゃないの

妄言の可能性はとても高いと我ながら思う。資料的裏付けが何もないモン。Simla しらないし、書けないし。だから「階層的プログラミング構造」を読んでも実は あんまり理解できてなかったり。

9割方妄想で出来ている見解だとおもう。我ながら妄想力が豊かすぎる。しかし、非常に危険なことに、ふとした拍子につい「ぽろっ」と口をついて出てきそうだ。

なるべく早い段階で「バカ」って言われた方が傷は浅いので、あわよくば誰かに「妄言です」と切り捨てられて[これはひどい] タグをつけて欲しいと願っているが、自分で調べろ、といわれたら、ぐぅの音もでない。

いったい何がしたかったの?

オブジェクト指向でなぜ作るのか、や、憂鬱本を dis りたい。(ぉ
このとき、「こういうのもOOPなんだよ」と、なんでも OOP 化が邪魔になる。

(うわ、イビルだ)

もっと清純派を主張すると、dis りが不適切かどうかを判断したいと思っている。

sumim さんは “オブジェクト指向”の本質 - Smalltalkのtは小文字です で、

この三系統のOO、各々の本質を把握できていれば、それらの混成ということで、ほとんどのOOPLの機能や立ち位置、世にはびこる“俺OOP”の中身…はスッキリ説明できるはずです。

とおっしゃっているが、混ぜて良いなら、「都合良く混ぜるのがオレOOP」なので、すべてを肯定しなくてはならないのか、と極論を思ってしまう。

はっきり言って「混ぜるな危険」ではないのか?

混ぜても安全な組み合わせは 限られているのではないのか?

OOP ってなんなのか?

「OO(OOP)とは何か?」については、ネタが割れてしまえばそんなに複雑なものではない

というけれど、OOPOOP でないもの(偽OOP,オレオレOOP) を振り分ける方法が、正直全然わからない ...orz

それでいいのだ? オレオレでもいいじゃん。

いいのだ、したいけれど。その結果デスマーチで踊るのは私だから絶対「いいのだ」したくない。

同じ言語の同じ言語機能に注目しても、利用者が採用するパラダイムによってその見え方(見なし方)や、それをどう扱うのが正しいかはまったく違うものになってしまいます。ここらへんのところは了解いただけていますか?

了解いただけている...と思う。

私はC++ を使うのだけれど、C++ は、デザインパターン と Modan C++ Design 以降、なんかすっかり別世界になってしまった。あたしゃ浦島気分でしたわさ。

しかし、旧世界(パラダイム)と言われるのが「ストラウストラップのOOP」だと思うが、じゃあ新世界(パラダイム)は何の「OOP」なのかな。

※ただし、Modan C++ Design で変わった世界はちょっと横においとこう

実は、OO「P」ってそういうモノだと思わない?両方とも「D」がつくし。で、結局パラダイムって「D」なんだよ

うーーーーーーーーーん。


そこが 落としどころみたいに見えてきたけど、それは生理的に気持ち悪いからイヤ。

直接反論が出来ないのだけれど、

でも、そうね、じゃあ今、目の前に かわいい新人君がいます。C++ で開発してます(デザインパターンとか机においてあるチームです)。Javaでもいいですよ。彼に OO「P」 を教えるとき、OOP とはどんなモノだ、と教えればいいのだろう?

ストラウストラップ先生の?ケイの?

どちらも間違っているように思える。

カモノハシ本みたいなの、て教えればいいんじゃない?タイトルに「プログラミング」ついてるし

だからさ、それは sumimさん テンプレート に当てはめるとしたらどこなのさ?

▼データ型にこだわるOO
▼メッセージングにこだわるOO
▼オブジェクトと委譲のみからなるOO

メッセージングか?メッセージングか?Little な Smalltalk の御仁ですし。それともコイツもDなのか?


そんなこと僕が知るか!

あたしだってしらないよっ!




・・・もう寝ます。明日考えよう。