From: Hideto ISHIBASHI Date: 2000-03-10T05:45:28+09:00 Subject: [ruby-list:21284] Re: 引数コピーとオブジェクト指向 (Re: メソッドの入り口 ) 石橋秀仁です。 # 一部は原文のままの引用ではなく、主観による編集です。 # その部分は、引用記号の「大なり」(>)を「全角」(>)にしています。 > oop未満の世界観の荻野です。 OOPしなくても楽しいのがRubyですよね(Ruby本もそう言ってます)。 >「インスタンス変数とインスタンス変数が指すオブジェクトのどちらを >カプセル化すべきか?」 これが重要な問題なのか、どうも疑問に思います。 >「効率の観点からは、どのような『カプセル化』が望ましいか?」 フツーは、C言語より効率的なOOPLはないです。だから、OOPLを使うだけで、 すでに効率は犠牲になっていると思ったほうがいいです。効率はなるべく プログラミングのテクニックではなく、上流の設計で稼ぐものだと思います。 >「Rubyではオブジェクトが他のオブジェクトを保持しないほうがOOらしい?」 いえ、保持することもある。それこそオブジェクト指向らしい、 というのを前のメール([ruby-list:21267]のクラス図)で示したつもりです。 ただし、保持するのは、「コピー」ではなく「参照」です。言い替えれば、 実体は一つながら、「窓」を持ちあう、というかたちです。 >「変数がオブジェクトへの参照であることは、OOと不可分か?」 >「変数にオブジェクトが入る言語では『真のOO』は不可能か?」 # Ruby並には幸せじゃないにしても :-) C++のような後者の言語でも「本当のオブジェクト指向」はできると思います。 そのような言語では「オブジェクトへのポインタを参照として使う」、 というのが根拠です。 手続き指向に慣れたプログラマの誤解や混乱に注目した本として、 『憂鬱なプログラマのためのオブジェクト指向開発講座』, Tucker!, 翔泳社 が多くの疑問に答えると思います。C++で書いてあるのですが、 言語を問わず応用できるアイデアを含んでいます。 # じつはコラムが一番おもしろい。「オブジェクト指向でもっとも重要な # 概念は、カプセル化、継承、多態性の3つである」という「伝説」を # 再検証しています。何と書いてあるかは御自身でお確かめ下さい。 > [1] メソッドに引数として値(ポインタを含む)を引き渡す方式 > [2] メソッドに引数としてオブジェクトへの参照を引き渡す方式 (Ruby?) > [3] メソッドに引数として他のオブジェクトからのメッセージを引き渡す方式 この点については、 『実践UML』, クレイグ・ラーマン, プレンティスホール の20章「可視性の判別」が参考になります。そこでは、 「属性可視性」「パラメータ可視性」 「ローカル宣言可視性」「グローバル可視性」 の4つの可視性(*)について説明しています。 (*)あるオブジェクトがほかのオブジェクトを「見る」能力。アクセスの手段。 そこでは、メソッドの実行期間を越えて(終了後も)、引数オブジェクト への参照が保持される場合について述べてあります。つまり、そういうことも 日常茶飯事だということです。 > こんなことを言い出す根底には、Ruby のような変数に参照がはいる言語では > オブジェクトには本名ともいうべき変数名がないわけで、抽象度が高い分、敷 > 居も高いように思います。このメーリングリストでも Ruby 入門者にどのよう > な説明がわかりやすいかという話題などがでることなどもこのことの裏付けに > なると思うのです。 > もうすこし「オブジェクト指向」が簡単だったら良いのになぁ、と思うわけで > すが、こればっかりは自分の技量の問題でもあるわけで別にオブジェクト指向 > の欠点というわけでもない。さしずめ Ruby は「現時点での最良」とでもいう > べきか。 Rubyやオブジェクト指向の入門者への説明に決定版がないのは、教える側の 「駒不足」だと思います。いまは、ようやく実用性が社会的に認められてきて、 これから教育に取り入れようとしている段階だと思います。言い換えれば、 教育法の研究/模索段階でしょうね。 > またメッセージ交換をオブジェクト同士でしたいと思っても、Ruby では受け > 取ったメッセージが誰からか知りようがない、だから引数に自分や関係者のオ > ブジェクトへの参照も含めてメッセージを渡さざるを得ない。もちろん、この > ときにオブジェクトのコピーを作るのはばかげていると思います。 これが、一見おなじに見える、「メソッド呼出し」と「メッセージ渡し」の 違いだと思います。本来は違うものなのに、見かけが同じになっています。 はじめは難解ですね。感覚でわかってくると便利ですが。 ですから、 > すくなくとも自分のなかの「カプセル化」とか「メッセージ駆動」とかとRuby > の構文とは直接の一致を見ていなくて、その構文の後ろに見えるようにイメー > ジトレーニングをしなければならないという感じです。a という変数があり、 > それが指しているオブジェクトがあるとすると、Ruby のスクリプトにはオブ > ジェクトが現れないので、一生懸命想像力を働かせて名前もない(クラスはあ > るけど)インスタンスを思い浮かべて a をそれへの窓(名札、ポインタ、etc.) > とイメージする... なかなか難しいです。名前が無いものは記憶できないし。 というのは、まさにその通りです。ぼくも同じ経験をしました。 # そしてRubyでオブジェクト指向の「こころ」を知ることができました。 # まあ少々の困難も大リーグ養成ギブスみたいなもんだということです :-) > とりとめがなくてすみません。 いいえ、とても多くの論点を提供して下さっています。ありがとうございます。 -- Hideto "rubyholic" ISHIBASHI