松尾です。

土岐 仁謙 wrote:

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

これが、

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

こちらでないのは、

> 実用上はほとんど変わらないのだろうけど、なんとなく
> 破壊的メソッドの方が速度やメモリ消費の点で有利そうに思えるので。

「なんとなく」ということですね? 僕がレビューするならもう一度考えてきて
もらいます。

1 変換後の「値」が必要だ。dataの中身を変えたいわけじゃない。
2 破壊的なメソッドを使いたい。
3 でもdataは自分の責任範囲でないからdupする。

というのは本末転倒の様に見えませんか?

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

でいいじゃないですか?

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

# もちろん、後でチューン等する時に必要であれば「dup、破壊的メソッド」
# に変更するのは有り得ます。

## (そうした場合僕はその部分にコメントを入れます。「分かってない」と誤
## 解を与えない様にね)

--

> 思い返してみると、文字列以外のオブジェクトはまったくdupしたことが
> ないです。思うに、文字列はかなり特殊なのではないかという気がします。

そうなんです。アプリケーションで必要だから作ったクラスの「インスタンス」
は、滅多にdupする必要がないんです。これは経験的に同意頂けますよね。

数は「値」だからdupしなくていいんです。

で、String。

Stringは、アプリケーション中では殆どの場合「値」として使われるのに、実
装は「インスタンス」なんですね。だから破壊/非破壊なメソッドがある訳な
んです。僕に言わせると、「なんとなく」ではなく「値」か「インスタンス」
かで、使い分けをすべきなんです。


TADA Tadashi wrote:

>  粒度の違うモンを並べて「全部dupするかしないか選べ」つーのは乱暴
> だと思うんですよ。けっきょく「時と場合による」が至言ということか。

粒度の違うものを並べて、全部一つの同じ理由で「コピーが必要ない」と言っ
ているのではないのです。そうだとしたらおっしゃる通り、確かに乱暴。

粒度の違うものそれぞれが、それぞれ*別の理由*で「コピーが必要ない」ので、
結局全部「コピーが必要ない」ということになるわけです。まとめると以下の
通り。

1. 「値」はコピーする必要がない
2. (殆どの)「インスタンス」は、殆どコピーする必要がない
3. 「String(等、一部のクラスのインスタンス)」は、
3-1. 「値」としてみている時は(非破壊的なメソッドを使い)、コピーする必要がない
3-2. 「インスタンス」としてみている時は、殆どコピーする必要がない

--

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

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

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

不安になりませんか?