イミュータブル(immutable)とは、変更できないという意味。ここではプログラミング用語について解説する。
オブジェクト指向プログラミング言語におけるイミュータブルとは、オブジェクトの持っているメンバ属性を書き換えられない事を指す。対義語として、ミュータブル(mutable: 変更可能という意味)がある。
関数型プログラミングでは、値はイミュータブルなのが原則である。そのため、個々の値についてミュータブルかイミュータブルかを論じるよりも、言語やプログラム全体について参照透過性(referential transparency)という用語を用いることが多い。途中で変更されないので、どこで参照しても初期設定値が透けて見えるという意味である。
並列処理において、複数のスレッドから一つのオブジェクトアクセスできることは珍しくない。しかし、2つのスレッドから一つのオブジェクトを同時に変更しようとすると(同じメモリに同時に書き込むことになるので)予期しない動作を引き起こす原因となる。
主な解決方法は3つある。
1つ目は、同時に変更しないような仕組みにする方法。欠点としては、あるスレッドのアクセス中は他のスレッドが待たされてパフォーマンスが損なわれることが挙げられる。
2つ目は、変更されても良いようにオブジェクトをコピーしてその参照を渡す方法。オブジェクトのコピーに時間がかかることと、あるスレッドによって起こされた変更を他のスレッドが知ることができないという点が欠点となる。
3つ目の解決方法は、オブジェクトをどのスレッドからも変更しないようにする方法である。
コメントやドキュメントに「変更不可」と書いて皆がそれを守ってくれるのなら良いが、現実にはそうもいかないし、書いた当人が書いたことを忘れて変更をやらかすことすらある。
そこでイミュータブルオブジェクトの出番となる。イミュータブルオブジェクトは参照を渡しても状態を変更されないので、そのような問題が発生しないことが保証されるのである。
オブジェクトが変更可能であるということは、オブジェクトが複数の状態をとりうるということである。オブジェクトが複数の状態をとりうるということは、そのオブジェクトを扱うときは複数の状態を想定して扱う必要があるということである。さらには、予想の斜め上の状態のオブジェクトが飛んでくることだってあるかもしれない。
もちろん、プログラマが注意すれば起きないということかもしれないが、上記の「変更不可」よりも複雑な制約を守れるはずもなく、実際に開発現場ではオブジェクトの状態に起因する問題が多発していた。
そこでオブジェクトをイミュータブルにしてしまえば、オブジェクトの状態に依存した動作がなくなり、人為ミスの原因が根絶できるのではないかと考えるようになったのである。
特に関数型プログラミングでは、この考え方が主流を占める。
変更できないため、ごく一部の値のみが違うオブジェクトが必要になっただけで、オブジェクト全体をまるごと生成しなおす必要がある。特に大きなオブジェクトを頻回に更新する場合では大量のデータ量のコピーが発生して顕著にパフォーマンスが低下する。
これを避けるためにはオブジェクトの変更が必要にならないようにプログラムのアルゴリズム自体を工夫する必要がある。
言語仕様がサポートしていない限りオブジェクトをイミュータブルにするのはなかなか難しい。オブジェクトのメンバ属性に別のミュータブルなオブジェクトへの参照が含まれていた場合、参照先のオブジェクトに変更を加えることで、実質的にオブジェクトの内容を変更できてしまうからである。
オブジェクトにミュータブルなオブジェクトの変更手段を実装しなくても、コンストラクタに変更可能なオブジェクトを渡して、イミュータブルオブジェクト(笑)が生成されたあとで、渡したオブジェクトに変更を加えればイミュータブルオブジェクト(笑)の不変性は容易に損なわれてしまう。
これを回避するには受け取った後にオブジェクトをコピーしてから使用するなどの工夫が必要になる。
掲示板
1 ななしのよっしん
2015/12/19(土) 16:59:18 ID: EjwcLOgPAB
>渡した先でオブジェクトの状態を書き換えられる可能性があり、
>これを避けようとすると、オブジェクトをコピーしてその参照を渡すなどの工夫がいる。
説明がナニカオカシイ
書き換えられると何がマズいのかをハッキリさせるべきじゃないの
処理中に書き換わる→順序依存になる→処理を並列化できない
これがマズいのであって避けるためにあえて積極的にコピーをつくる印象
SSAでどんどん内部定数を生成して「これがイミュータブルだ(キリッ」
とやるのを見た時は感動した
2 ななしのよっしん
2016/04/07(木) 00:29:44 ID: EWylt6qRLj
mutableなメンバを持てるオブジェクトがimmutableだとは到底言えないのでは…
それは単にポインタがimmutableなだけとかで,オブジェクトはimmutableではない
急上昇ワード改
最終更新:2024/04/25(木) 20:00
最終更新:2024/04/25(木) 20:00
ウォッチリストに追加しました!
すでにウォッチリストに
入っています。
追加に失敗しました。
ほめた!
ほめるを取消しました。
ほめるに失敗しました。
ほめるの取消しに失敗しました。