くまさんに質問するつもりで整理してみる
なんかぐちゃぐちゃになってしまいました。sumimさん、ごめんなさい。
質問に出す前に、くまさんを目の前においてエントリーを書いてみよう。(くまさんは、実はいないから アリア社長に代理でいてもらおう)
もうちょっと具体的に
構造化定理を満たすもの(= 三大制御構造のみで書いてあるプログラム)を「構造化プログラミング」と定義すると、駄目なプログラムもその許容範囲に入ってきてしまう。
幸い、ダイクストラ先生は、三大制御構造のみを使うことを「ツール」と位置づけ、実際に構造化された良いプログラムを書くにはどうすればよいかを、「構造化プログラミング論」の中で丁寧に説明されている。上の定義は嘘800だと安心して言える。
で、「ユーザー定義型を使ったプログラム」「継承で差分をくくりだしたプログラム」というのは、「構造化定理を満たしたプログラム」と同様、駄目なプログラムもその許容範囲に入ってきてしまう。
これを切りたい。
実は、OO「P」ってそういうモノだと思わない? 良いか悪いかは「D」が決めるのでは?
sumim さんとコメントを交わしてそう思い始めた。
「デザインパターン」とか「責務分散協調系」とかは OOD なんじゃないかって。というのも、今回のパターンは、
えんどう
擬人論とか責務とかが全く出てこないことに納得がいきません。
ここで論じられている事は実装上のことだから、でしょうか?sumim
ここで、挙げておられる「擬人論」や「責務」はどなたの発案のものでしょうか。
えんどうさんは、オブジェクト指向の説明に、よくこれらの考え方を引用されておられますよね?えんどう
出典は分かりませんが、ごく一般的な考え方だと思っていました。
特に「責務」(responsibility)はオブジェクト指向設計で頻繁に使われる用語です。えんどう
その後ちょっと思い出してみたのですが、かつて影響を受けた青木淳さんの「オブジェクト指向分析設計入門」を久しぶりに読んでみたら青木さんは「擬人化」という用語を使っていました。
http://www.sra.co.jp/people/aoki/IntroductionToOOAOOD/
オブジェクト指向の概念の発明者は誰ですか?(改訂版) - Smalltalkのtは小文字ですsumim
OODA のお話でしたか。OODA は比較的時代も新しく、発案者や背景も明らかで、引用も正しく行なわれている場合も多いので、ここでは扱っておりません。つまるところ、最初に書いていただいたように「ここで論じられている事は実装上のことだから(「擬人論」や「責務」については言及がない)」ということで片付けてしまってよいように思いますが、いかがでしょう。
と同じモノなんじゃないかと思い始めたから。
それで納得した?
いーえ。
だって、そんなん「この部品だけをつかってプログラムしてください」であって、全然エンジニアリングじゃないんだもん。こういうのは良いモノつくれてナンボでしょう。
目的のない手段に意味がないもの。
実は、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)とは何か?」については、ネタが割れてしまえばそんなに複雑なものではない
というけれど、OOP と OOP でないもの(偽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なのか?
そんなこと僕が知るか!
あたしだってしらないよっ!
・・・もう寝ます。明日考えよう。