Immutable Object

久々にPerlを使ってみたところ、細かい文法を忘れてた。しかも脳みそがオブジェクト指向に染まっているのでPerlに馴染まなくなっている。ここらでオブジェクト指向スクリプトに移行すべくRubyのお勉強を開始したが、Stringクラスの扱いでちょいと混乱した。Rubyではconcatメソッドを使うと元のインスタンスの内容も変更されてしまうのだ。

a = "null"
b = a.concat("po")
print a  #nullpoと出力
print b  #nullpoと出力

Javaや.NETでは、concatメソッドを使うと新しいインスタンスが生成される。しかしメッセージを受けたStringインスタンス自体は変更されない。これらのStringは一度生成された後、内容を変更する事はできない仕様になっている。

JavaのStringのような状態を変更できないオブジェクトを不変オブジェクト(immutable object)と言う。一方、状態を変更できるオブジェクトは可変オブジェクト(mutable object)と呼ばれる。RubyのStringはmutableということになる。うーん、これってヤヴァくない?誰かが作ったクラスのメソッドに文字列渡したらいつの間にか内容が変わってるかもしれない、って恐ろしいよ。文字列のように1つのデータがそのオブジェクトの性質すべてを表現するモノは不変オブジェクトの方がいいんじゃないかな〜と思う。