K.Maebashi's BBS

ご自由に書き込んでください。雑談も可。
テスト書き込みの類はテスト用掲示板にどうぞ

[日付順表示] [日付順インデックス] [スレッド順インデックス]

新規投稿 | 開設者ホームページへ戻る | ヘルプ

[1109] なぜわからなくなってしまうのか?の本質(笑)
投稿者:Glory
2008/06/19 15:17:39

管理人さん&読者の皆さん、こんにちは。 この前、会社の新人研修でオブジェクト指向(Java)を学びました。 例題は「車」・・・このサイトの予想通り。ご多分に漏れずなかなか理解できずにいます。 いろいろなオブジェクト指向関連のサイトや本を読みあさって勉強していると、筆者それぞれに 思い入れがあって、解説の仕方や考え方が異なることに気付きます。「実は簡単」とか「これだけ 覚えればOK」という内容をよく目にしますが、私のような初心者にとっては、それでさえ 理解できなかったりします。そのうえ更に「よくある○○という説明は間違い、誤解をうむ、 オブジェクト指向ではない」などと説明されると、卓袱台を引っくり返されたような感覚すら。 結局どれが”正”なんだ?と。お互いに自分の説明こそが正しいという立場で主張するわけですから (当たり前ですが)、初心者は余計に混乱し、根気がないと挫折します。 オブジェクト指向に対する根本的なモノの考え方は同じなのかもしれませんが、投稿・掲示板でも 意見が分かれるように、統一見解がないことこそが”なぜわからなくなってしまうのか?”の一番の 原因なのかもしれません。研修の講師の方も仰っていました。「わからないときは先輩に 訊いた方がよい、ただしその相手を間違えるとヘンな設計になる(笑)」。なんとなく分かるような 気がします。どうもベテランのJava開発者=オブジェクト指向を理解している人ではないようです。 本当は誰もが認めるバイブル的な教本があるとよいのですがねぇ・・・。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1110] Re:なぜわからなくなってしまうのか?の本質(笑)
投稿者:774RR
2008/06/19 16:56:11

新人君 (大学では情報技術をやってなかった君) を見ていると やはり[マルチプルインスタンス]にてつまづいているようだ。 http://kmaebashi.com/programmer/object/othello.html 同じ種類のモノが、複数個!という概念が理解できた後でないと 同じ性質だけど、違う種類! (基底クラス→派生クラス) の理解は危うい。 と思うのであった。 マルチプルインスタンスが理解できても static という罠が待ち構えている。 Java の Double クラスの public static Double valueOf(String s) が ああ、そういうことねーと納得できるかどうか こりゃいったいなにがいいたいんぢゃろと困るか その辺にわかるわからないの境目がありそうな気がする俺ちゃんであった
[この投稿を含むスレッドを表示] [この投稿を削除]
[1111] Re:なぜわからなくなってしまうのか?の本質(笑)
投稿者:こくぼ
2008/06/19 19:26:57

オブジェクト指向のごちゃごちゃが気になったら、とりあえずこのページを見ておくと良いと思います。 http://d.hatena.ne.jp/sumim/20040525/p1
[この投稿を含むスレッドを表示] [この投稿を削除]
[1114] Re:なぜわからなくなってしまうのか?の本質(笑)
投稿者:(ぱ)こと管理人
2008/06/21 02:32:07

Gloryさん、こんにちは。 >例題は「車」・・・このサイトの予想通り。ご多分に漏れずなかなか >理解できずにいます。 車ですか…これもよく使われる例かと思いますが、やっぱりたとえ話はよくないと 思います。 >そのうえ更に「よくある○○という説明は間違い、誤解をうむ、 >オブジェクト指向ではない」などと説明されると、卓袱台を引っくり返された >ような感覚すら。 >結局どれが”正”なんだ?と。お互いに自分の説明こそが正しいという立場で主張する >わけですから(当たり前ですが)、初心者は余計に混乱し、根気がないと挫折します。 すみません、一部加担しています。(_o_) >オブジェクト指向に対する根本的なモノの考え方は同じなのかもしれませんが、 >投稿・掲示板でも意見が分かれるように、統一見解がないことこそが >”なぜわからなくなってしまうのか?”の一番の原因なのかもしれません。 [1111]でこくぼさんが挙げておられるページのように、また、 http://practical-scheme.net/trans/reesoo-j.html こちらでも「オブジェクト指向というものが動く標的であるため、オブジェクト指向の 熱心な支持者はこのメニューのうちの適当なサブセットを気まぐれに選んで、 それを以って他の言語はオブジェクト指向ではないと説得しようとする。 」 と言われているように、定義がちゃんと定まったものではないとは思います。 >本当は誰もが認めるバイブル的な教本があるとよいのですがねぇ・・・。 たとえばBertrand MeyerさんのOOSC(Object-Oriented Software Construction)は かなり多くの人がバイブルと認めると思いますが(少なくとも静的型OO支持者であれば)、 それでも「あの本の継承の使い方は…」という留保をつける人が多いんじゃないかと 思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1115] Re:なぜわからなくなってしまうのか?の本質(笑)
投稿者:(ぱ)こと管理人
2008/06/21 02:48:48

>新人君 (大学では情報技術をやってなかった君) を見ていると >やはり[マルチプルインスタンス]にてつまづいているようだ。 >http://kmaebashi.com/programmer/object/othello.html この「マルチプルインスタンス」という言葉は別に私の造語ではなく、 http://kmaebashi.com/programmer/object/intro.html にも書いたようにC++ FAQにあった言葉を使ったのですが、上のページを私が書いた 時点では、「マルチプルインスタンス オブジェクト指向」でGoogleしても 0件でした。 それが今では258件だか出ます(私のページやそれに対する言及も多いですが)。 うちのページの影響だと思っても、自意識過剰じゃないですよね。きっと。たぶん。 プロトタイプベースまで含めるとまた話がややこしくなりますが、 クラスベースのOOに関する限り、複数のインスタンスが作れるという概念は 基本だと思うんですよね。あまりに基本すぎるせいか、入門書とかでは 飛ばされてしまっていたわけですが。 新人君がなにもかもstaticなプログラムを書いたら「オブジェクト指向的じゃない!」 と怒るくせに。 >マルチプルインスタンスが理解できても static という罠が待ち構えている。 しかもJavaの場合実行がすべてpublic static void main()から始まるために、 本当の入門者がいきなり罠にはまるという…
[この投稿を含むスレッドを表示] [この投稿を削除]
[1116] Re:なぜわからなくなってしまうのか?の本質(笑)
投稿者:(ぱ)こと管理人
2008/06/21 02:55:11

>オブジェクト指向のごちゃごちゃが気になったら、とりあえずこのページを見ておくと良いと思います。 >http://d.hatena.ne.jp/sumim/20040525/p1 ページの紹介ありがとうございます。 # 以前何度か読んで、そのたびに「手続きによる抽象化」について調べようと思いつつ # 忘れていたらいつの間にか追記がついていた。あれ? というわけで、Javaの勉強をするのなら、「メッセージ」という言葉を多用している 入門書はひとまず避けておけ、と(ぉぃ 逆に言えばうちのページ http://kmaebashi.com/programmer/object/index.html はC++/Java流OO限定ですね。そういうわけで当時の掲示板でのバトルの末 「言語としてはJavaを使用します。」という文言を先頭のページに持ってきた、 という経緯はあるんですが、もうちょっとでかでかと書いてもよかったかも。 まあ当時は依怙地になっていたかと思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1117] Re:なぜわからなくなってしまうのか?の本質(笑)
投稿者:sumim
2008/06/21 15:48:56

># 以前何度か読んで、そのたびに「手続きによる抽象化」について調べようと思いつつ ># 忘れていたらいつの間にか追記がついていた。あれ? すみません(汗)。 当時はまだリスコフの抽象データ型(カプセル化)について理解があさく、 ユーザー定義型に手続きを含むか、含まないかで、それぞれを OOP(あるいは、 手続きによる抽象化。PDA)とするか、ADT(クック独自定義の抽象データ型) とするかという分類はとてもクールに思えて必要以上に持ち上げてしまいました。 その後、リスコフは、手続きを型に含むか含まないかは抽象データ型の実現方法の バリエーションにすぎない(それぞれにメリット・デメリットがある…)と書いてある のを見つけて、追記にように認識を改めた次第です。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1118] Re:なぜわからなくなってしまうのか?の本質(笑)
投稿者:Glory
2008/06/21 16:41:02

返信下さった皆さん、ありがとうございます。興味深く読ませて頂きました。 新人はさしたる仕事もなく、昨日もオブジェクト指向のサイトを転々としておりました。 やはり「猫」の例はヘンですよね。現実世界を模しているならば「鳴けとメッセージを送ると 鳴く」というよりは「腹が減ると鳴く」の方がピッタリでしょう。つまり完全自律型、プログラムで いったら暴走に近いかも・・・。 プログラミングは少々かじったことがあるのですが(学校の実習レベルです)、無理矢理 現実世界に例えるよりはこんな感じの説明の方がイメージに合っていると思います。  継承:共通処理(親)をベースとして差分を子に付け加える。ライブラリをincludeするのと逆の発想。  隠蔽:見せたくない処理はlocal変数、local関数にて実装する。  多態性:引数に基づき、サブルーチン側でif~elseで処理分岐する。またはincludeを変える。  マルチプルインスタンス:サブルーチンをメインの実行状況によって任意に(動的に)増やせる。  オブジェクト指向:これら個々の処理を分離して薄皮でくるみ、モノとして捉える。 わかってないとお叱りを受けそうですが、「犬・猫」よりはそれっぽい(笑)気がします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1119] Re:なぜわからなくなってしまうのか?の本質(笑)
投稿者:(ぱ)こと管理人
2008/06/22 13:12:16

こんにちは、sumimさん。(いろいろなところで)いつもお世話になってます。 >すみません(汗)。 いえそんな(大恐縮) >当時はまだリスコフの抽象データ型(カプセル化)について理解があさく、 >ユーザー定義型に手続きを含むか、含まないかで、それぞれを OOP(あるいは、 >手続きによる抽象化。PDA)とするか、ADT(クック独自定義の抽象データ型) >とするかという分類はとてもクールに思えて必要以上に持ち上げてしまいました。 リスコフというと「え、ええと置換原則の人?」程度の私はまだまだ勉強が 必要のようです。 新しいほうの3系統 http://d.hatena.ne.jp/sumim/20080415/p1 は大変腑に落ちます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1120] Re:なぜわからなくなってしまうのか?の本質(笑)
投稿者:(ぱ)こと管理人
2008/06/22 13:43:45

>新人はさしたる仕事もなく、昨日もオブジェクト指向のサイトを転々としておりました。 ああ、それはうらやましい。 戦力として配置されるとだんだん勉強の時間も削られてくるものですし、 さらに年を食うとろくにコードも書かせてもらえなくなるのがこの業界ですので。 > 継承:共通処理(親)をベースとして差分を子に付け加える。ライブラリを > includeするのと逆の発想。 うーん、これはまさに(最近評判があまりよろしくない)実装継承ですよね。 以前、この辺のスレッドで議論したことがあります。 http://kmaebashi.com/bbs/list.php?boardid=kmaebashibbs&thread=270 この中で出ているoo-squareのリンクは、現在切れていますがこっちです。 http://www.ogis-ri.co.jp/otc/hiroba/oosquare-ml/Archive/200501.month/thread.html よく使うメソッドをスーパークラスに置いて、なんてことをやっていると、 http://www.ogis-ri.co.jp/otc/hiroba/oosquare-ml/Archive/200501.month/4468.html | 継承は確たる「設計思想」が無い場合、スーパークラスが単なる「ごみ置き場」 | と化していることが多いようです。 なんてことになってしまう。それよりはむしろ、 http://kmaebashi.com/bbs/list.php?boardid=kmaebashibbs&from=276&range=1 | 「ほらほら、『使うほう』はその実体が具体的に何であるか気にしなくていいんだよ」 のほうが実際の使いどころに合っていると思いますが、こうなるとインタフェースと 一緒になっちゃうんですよね。実際、「継承なんかどうでもよくてインタフェースこそが 本質なのだ」と言う人もいますし。 じゃあ継承なんかなくていいのかというとそうでもなくて、実際私も使うというのが ややこしいところ。「継承とインタフェースのどっちを使えばいいんですか?」というのは FAQですが、私はこれはもう単純に ・データメンバがメインの構造体的なクラスにフィールドを追加するなら継承を、 ・それ以外はインタフェース でいいんじゃないかな、と思っています。 > 隠蔽:見せたくない処理はlocal変数、local関数にて実装する。 これは実態としてまさにそうだと思います。 よく「その『オブジェクト』だけが知っていればよいことはprivateにするんだ」と オブジェクトごとに丸を描いたりして「カプセル化」としている説明がありますが、 言いたいことはよくわかるものの、C++でもJavaでも実はprivateは 「別のクラスから見えない」だけで「別のオブジェクトから見えない」のでは ないんですよね。 これを、単にC++(およびその派生言語)が腐っているとか実用上の妥協だとか 言うことも可能ですが、私はこれを「privateというのは他の『プログラマ』に 対する隠蔽なのだ」と考えてしまってよいと思っています。 > 多態性:引数に基づき、サブルーチン側でif~elseで処理分岐する。 > またはincludeを変える。 「またはincludeを変える」のほうは良くわかりませんが、1行目は、用途としては そのとおりです。よくある図形(Shape)の描画ルーチンの例のように、 ポリモルフィズムを使うことで、プログラムからswitch caseを排除できます。 Cにはそれがないばかりに巨大なswitch caseを書いてる例: http://kmaebashi.com/programmer/devlang/diksam_src_0_2/S/7.html#693 ポリモルフィズムにおいて、一見単なる実装詳細に見えるけど実は結構重要なのは、 サブクラスを追加しても、呼び出し素(switch caseに相当する部分)再コンパイルの 必要がない、ということですね。だからAppletを継承したクラスを作れば すぐにブラウザで実行できるわけで。 > マルチプルインスタンス:サブルーチンをメインの実行状況によって任意に > (動的に)増やせる。 うーん、これはどうなんでしょう。オセロの例で言えば、Boardをいくつnewしても、 put()というルーチンは増えないと思うのですが… 「メソッドはインスタンスに付属している」というイメージからすると、 一緒に増えると考えることもできるのかもしれませんが。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1121] Re:なぜわからなくなってしまうのか?の本質(笑)
投稿者:sumim
2008/06/22 14:19:36

>リスコフというと「え、ええと置換原則の人?」程度の私はまだまだ勉強が >必要のようです。 リスコフは「抽象データ型」とか「カプセル化」を考えた(言い出した)人です。 >新しいほうの3系統 >http://d.hatena.ne.jp/sumim/20080415/p1 > >は大変腑に落ちます。 それはよかった。ご紹介痛み入ります。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1122] Re:なぜわからなくなってしまうのか?の本質(笑)
投稿者:774RR
2008/06/24 08:33:37

もいちど駄レスしておくと オブジェクト指向な設計、というものはあっても 非オブジェクト指向な設計の元にオブジェクト指向なプログラム、ってのはありえない わけで、「基礎設計したことがないプログラマ」ではOOがわからなくて当然。 メタ度が違うっちぅことで。 俺も、基礎設計が気に入らなくなったという理由で、50%くらい作ったプログラムを 全部捨てて最初から再設計したなんて経験が何度もある。 ただ「実装するだけ」のOOでは意味が無いと思うのココロ そーいう人に限って「スーパークラスがごみ置き場」になるわけだ。
[この投稿を含むスレッドを表示] [この投稿を削除]