土岐です。

{Date} Mon, 13 Mar 2000 15:59:11 +0900
{Subject} [ruby-list:21380] Re: 引数コピーとオブジェクト指向
{Message ID} <38CC91B3.E990A69F / sitc.toshiba.co.jp>
Matsuo Hisanori <hisanori / sitc.toshiba.co.jp> wrote...

Matsuo> 1 変換後の「値」が必要だ。dataの中身を変えたいわけじゃない。
Matsuo> 2 非破壊的なメソッドを使う。

うーん、ここで思考が止まってくれればいいんですが、つい

3 テンポラリなオブジェクトが生成されて、余分にリソースを消費する。

と考えてしまうので、

Matsuo>  def html_quote(data)
Matsuo>    data.gsub(/&/, "&amp;").gsub(/</, "&lt;").gsub(/>/, "&gt;")
Matsuo>  end

これが

def html_quote(data)
  data = data.dup
  data.gsub!(/&/, "&amp;")
  data = data.dup
  data.gsub!(/</, "&ltp;")
  data = data.dup
  data.gsub!(/>/, "&gt;")
  data
end

に見えてしまい、

4 破壊的メソッドを使えばテンポラリなオブジェクトは抑制可能。
5 それなら、結果は同じだから破壊的な方を使おう。

という結論になってしまうのです。

無論、この差が実用上問題になることはまず無い、と頭では
分かっているんですが、同じ結果を出す異なる二つの方法があって、
例え理論上だけの話でも片方が性能が良いとういことが見えてしまうと、
性能の良い方を選択しないのは心理的にかなり抵抗があります。

これが、実装が完全に隠蔽されていたり、あるいは他人の書いた
コードだったら、特に気にならないのですが、
自分でコードを書くときはたいした手間でもないだけに
やはり気になって仕方が無いです。

でも結局これは

Matsuo> 僕から見ると、「値」と「インスタンス」の区別、「インスタンス」の操作責
Matsuo> 任の明確化が不完全になっている印象を受けます。

ということなのかなあ。
松尾さんの立場では、
実用上問題にならないような最適化を追及するよりも
「値」と「インスタンス」を区別するポリシーの方が重要である、
ということですよね。

わたしは多分、「値」と「インスタンス」を明確に
意識しようとはしていないです。
どちらかと言うと、値的な「数」なども単に破壊的なメソッドを持たない
オブジェクトだと見なしています。
# Fixnumも実装は値だということは分かっているけど、
# でも気分はやっぱりオブジェクト。
なのでオブジェクトの生成・消滅をどうしても意識してしまい、
気になってしまうみたいです。

Matsuo> こういう視点で見ていると、

Matsuo> 「渡す前にコピー、貰った後でコピー、使う前にコピー」

Matsuo> というのは、プロジェクトの何処かに「値」と「インスタンス」の区別、「イ
Matsuo> ンスタンス」の操作責任の明確化ということに対して、余りセンシティブでな
Matsuo> い開発者がいるということになります。

Matsuo> 不安になりませんか?

うーん、わたしは複数人のプロジェクトには参加したことが
無いので、なかなかそういう不安は具体的には分かりにくいのですが、
「局所的な変更の影響範囲は局所的に留める」というポリシーは不許可、
というより不完全なのでしょうか? 
このポリシーから自然と「壊す前にコピー」という方針が
出て来たと自分では考えているんですが。

--------------------------------------------------
土岐 仁謙    神戸大学物理高エネ研 M2
http://www.freedom.ne.jp/toki/