イミュータブル 単語

イミュータブル

1.8千文字の記事
  • twitter
  • facebook
  • はてな
  • LINE

イミュータブル(immutable)とは、変更できないという意味。ここではプログラミングについて解説する。

概要

オブジェクト指向プログラミング言語におけるイミュータブルとは、オブジェクトの持っているメンバ属性を書き換えられない事をす。対義として、ミューブルmutable: 変更可という意味)がある。

関数型プログラミングでは、値はイミュータブルなのが原則である。そのため、個々の値についてミューブルかイミュータブルかを論じるよりも、言プログラム全体について参照透過性(referential transparency)という用を用いることが多い。途中で変更されないので、どこで参照しても初期設定値が透けて見えるという意味である。

利点

並列処理

並列処理において、複数のスレッドから一つのオブジェクトアクセスできることはしくない。しかし、2つのスレッドから一つのオブジェクトを同時に変更しようとすると(同じメモリに同時に書き込むことになるので)予期しない動作を引き起こす原因となる。

な解決方法は3つある。

1つは、同時に変更しないような仕組みにする方法。欠点としては、あるスレッドアクセス中は他のスレッドが待たされてパフォーマンスが損なわれることが挙げられる。

2つは、変更されても良いようにオブジェクトコピーしてその参照を渡す方法。オブジェクトコピーに時間がかかることと、あるスレッドによって起こされた変更を他のスレッドが知ることができないという点が欠点となる。

3つの解決方法は、オブジェクトをどのスレッドからも変更しないようにする方法である。

コメントドキュメントに「変更不可」と書いて皆がそれを守ってくれるのなら良いが、現実にはそうもいかないし、書いた当人が書いたことを忘れて変更をやらかすことすらある。

そこでイミュータブルオブジェクトの出番となる。イミュータブルオブジェクトは参照を渡しても状態を変更されないので、そのような問題が発生しないことが保されるのである。

状態依存からの脱却

オブジェクトが変更可であるということは、オブジェクトが複数の状態をとりうるということである。オブジェクトが複数の状態をとりうるということは、そのオブジェクトを扱うときは複数の状態を想定して扱う必要があるということである。さらには、予想の斜め上の状態のオブジェクトが飛んでくることだってあるかもしれない。

もちろん、プログラマが注意すれば起きないということかもしれないが、上記の「変更不可」よりも複雑な制約を守れるはずもなく、実際に開発現場ではオブジェクトの状態に起因する問題が多発していた。

そこでオブジェクトをイミュータブルにしてしまえば、オブジェクトの状態に依存した動作がなくなり、人為ミスの原因が根絶できるのではないかと考えるようになったのである。

特に関数型プログラミングでは、この考え方が流を占める。

欠点

変更できないため、ごく一部の値のみが違うオブジェクトが必要になっただけで、オブジェクト全体をまるごと生成しなおす必要がある。特に大きなオブジェクトを頻回に更新する場合では大量のデータ量のコピーが発生して顕著にパフォーマンスが低下する。

これを避けるためにはオブジェクトの変更が必要にならないようにプログラムアルゴリズム自体を工夫する必要がある。

問題点

仕様サポートしていない限りオブジェクトをイミュータブルにするのはなかなか難しい。オブジェクトのメンバ属性に別のミューブルオブジェクトへの参照が含まれていた場合、参照先のオブジェクトに変更を加えることで、実質的にオブジェクトの内容を変更できてしまうからである。

オブジェクトミューブルオブジェクトの変更手段を実装しなくても、コンストラクタに変更可オブジェクトを渡して、イミュータブルオブジェクト(笑)が生成されたあとで、渡したオブジェクトに変更を加えればイミュータブルオブジェクト(笑)の不変性は容易に損なわれてしまう。

これを回避するには受け取った後にオブジェクトコピーしてから使用するなどの工夫が必要になる。

関連項目

この記事を編集する

掲示板

おすすめトレンド

ニコニ広告で宣伝された記事

記事と一緒に動画もおすすめ!
もっと見る

急上昇ワード改

最終更新:2024/04/25(木) 20:00

ほめられた記事

最終更新:2024/04/25(木) 20:00

ウォッチリストに追加しました!

すでにウォッチリストに
入っています。

OK

追加に失敗しました。

OK

追加にはログインが必要です。

           

ほめた!

すでにほめています。

すでにほめています。

ほめるを取消しました。

OK

ほめるに失敗しました。

OK

ほめるの取消しに失敗しました。

OK

ほめるにはログインが必要です。

タグ編集にはログインが必要です。

タグ編集には利用規約の同意が必要です。

TOP