From: ogino@... Date: 2000-03-12T18:48:26+09:00 Subject: [ruby-list:21347] Re: 引数コピーとオブジェクト指向 荻野です。ちょっと例えが面白いので... 新しいことは書いていません。 At Fri, 10 Mar 2000 22:35:12 +0900, IWAOKA Masahiro wrote: > こう思って良いのです。外で name.sub! としても、そのオブジェクトが > 変化してるだけで、Person の持っている name が「別のオブジェクト」 > に変わってるわけではないのです。 文法としてはそのとおりですが実社会ではそうはいかないでしょう、という話 です。別のオブジェクトに変わってなければ良いというわけではないでしょう。 逆に dup すれば良い(するしかない)というのは、オブジェクトが知らないと ころで変化して欲しくないので泣く泣くコピーを取っておくという意味です。 > 現実世界の例を出すと、まつもとさんからちょっと違うと言われるかもし > せませんが、僕に娘がいて、「いわおか A子」としましょう。この子が結 > 婚して「おぎの A子」になろうとも、外乱によってヤンキーになろうと、 > 尼さんになろうと、「僕の娘」が指し示す実体は同一人物です。 「いわおか A子」さん自身がが承知で名前が変わるのならいいのです。本人の 知らないところで名前が変わってしまうとなると、人間としては同一だから何 と呼んでもいいだろう、という論法は通じません。(と、思うんだけど) class Perosn def initialize(name) @name = name end end name = 'John' john = Person.new (name) この場合、外のコードは名づけ親であり、Person クラスの john インスタン スが名づけられた本人です。どのように名づけるかは john インスタンスの自 由になることではありませんが、名づけられた後に名付け親の気が変わったか らといって自分の知らないところで名前を付け替えられてはたまったものでは ありません。 # 「いわおか A子」さんがすごくかわいいのに目がくらんだ荻野が勝手に婚姻 # 届をだして戸籍を書き換えてもいいですか? やっぱり本人にお願いして、 # 両人の同意を戸籍係にメッセージとして出さなくてはだめですよね。(民法 # 742 条?) 似たような意見を端的に述べられている投稿では、 At Sat, 11 Mar 2000 14:03:57 +0900, sho@spc.gr.jp (TADA Tadashi) wrote: > ただただしです。 (略) > >これも別に問題は無いですよね。結婚した場合など、当然のように名前がかわっ > >たりしますし。 > > たぶん例が悪いんだと思うけど、この例に限ればすごく問題があると思うので > すが。これを問題ないという人がけっこう多くて驚きというか。この場合の最 > 大の問題は、nameの(中身)の変更をjohn自身が知り得ないということです。 ということです。問題は、このような事態が発生しないようにするための手法 です。 1. ドキュメントに明記して、使う側が問題のある(私のあげた例のような)コー ドを書かないようにする。 → 問題点:使う側がそうしてくれるという保 証がない。「カプセル化」という言葉に対する概念が人によって異なるか ら、インスタンス変数はオブジェクトが保護するべきと利用者が思っても 無理は無いかも。(この辺、議論百出ということ自体を「本当のオブジェク ト指向の啓蒙をしていくべき」ととらえるかどうかもまた議論の対象です が) 2. クラス側で dup して、外部から与えられたオブジェクトは雛型として使用 するにとどめる。 → 問題点:dup したものは元のオブジェクトではなく、 それが問題となる場合や、dup が無意味である場合がある。効率が悪い。 「本当のオブジェクト指向」ではない。 3. 広い意味での「破壊的な」メソッドを呼べる「資格」を、メソッドを呼ぶ (メッセージを送る)オブジェクト単位または窓口になる変数単位に設定す る → 問題点:それは Ruby ではない! そんな機能が言語として必要? というところでしょうか。 -- 荻野 充 (おぎの みつる) ... 「萩(はぎ)」にあらず 名古屋大学消費生活協同組合