From: Matsuo Hisanori Date: 2000-03-10T12:48:26+09:00 Subject: [ruby-list:21286] Re: 引数コピーとオブジェクト指向 松尾です。 ogino@coop.nagoya-u.ac.jp wrote: > などすると、@name が指すものを「引っ掻き回す」ことができるわけですが、 > ここが「カプセル化」という言葉と違和感があるというだけです。「それでい 違和感は分からないではないです。しかしそれは、渡そうとしている引数の、 当該メソッドのreceiverにおける役割が明確になってないから生じるものだと 思います。その役割は、 1 「渡そうとしている引数」が、receiverに属するデータ 2 「渡そうとしている引数」が、receiverに属しないデータである場合 の二通りあります(この分類は色々言い換えることが出来ると思います。) で、利用方法はそれぞれ 1 callerはメソッドを呼んだ後に当該引数を(スコープ内では)使わない receiverは呼ばれた後はそのデータは自分だけのものだと信じて使う 2 callerはメソッドを呼んだ後でも当該引数を操作して良い receiverは当該データは自分以外の所で操作され得ると思って使う ことになります。 class Perosn def initialize(name) @name = name end end こういうコードの場合、多くは 1 を意図しているのだと思います。ならば、 name = 'John' john = Person.new (name) name.sub! (/.*/, 'Paul') というコードはそもそも書くべきではないのです。Personは渡されたデータを 渡してもらった瞬間から自分のものだと信じて使うからです。 多分荻野さんは「こういうコードも許すようにPersonを実装」すべきではない のか? と思っておられるのでしょう。でも違うんです。ちゃんと分析が出来て いて、スキルの高い開発者間で意思統一が出来ていれば、そういうことは全く 必要がなくなってくるのです。 逆に言うと、「安全側に倒して、渡す前にコピー、渡された後でコピーする」 といったやり方をするプロジェクトは、何処かがおかしいと言えると思います。