自分でクラスを組み立てていく時、
なんでもかんでもインスタンスの生成後に書き換え可能にしていないだろうか。
クラスを
・不変オブジェクト
・可変オブジェクト
の2つに分類する考え方がある。
簡単に言えばNSMutableArrayとNSArrayのような関係だ。
たいした違いじゃないじゃないか?と一瞬思ってしまうが、
ここには非常に大きな差がある。
第一に不変オブジェクトはバグを生みにくい。これはオブジェクトが状態を変化させない、つまり「特定の状態でしか起きないバグ」をかなり減らせるからだ。
第二にデータの複製を考えなくていい。 変更されないんだから、ポインタだけわたせばいいのだ。これは非常に効率的である。クラスメンバに可変オブジェクトを持つ場合、そのオブジェクトのポインタを外に出すのは危険である。だから防御的にコピーしたりする場合もあるが、不変オブジェクトなら安心して外にポインタを預けられる。それは変更される余地などないのだから。
第三に不変オブジェクトはスレッド安全。これは一度生成したら、変更されないために、複数のスレッドで同時に書き換えがおこらないためである。二つのスレッドが同時にreadonlyならば矛盾などおきようがない。
例えばUIImageを書き換えることができなくて困った人はいないだろうか?
そう、UIImageは不変オブジェクトとして設計されているのだ。もちろん上記の理由からだ。
いろいろなNS系のクラスがなぜMutableを分けてあるのか、上記の理由からなのだ。
この2つの分類を理解することで、フレームワークがなぜそうなっているのか、
よりよく理解できる手助けになるのではないだろうか。
また、不変と可変とうまくつきあって、より良いソースコードを書いていきたいものである。