Panda Noir

JavaScript の限界を究めるブログでした。最近はいろんな分野を幅広めに書いてます。

Immutable.jsの便利な使い方

Immutable.jsにはまっています。なかなか奥が深くて面白いです。

Immutableとは

Immutableとはmutableでないつまり変えることができないということです。具体的には変数が変えられません。だからfor(var i=0;i<n;i++);のようなインクリメントといった破壊的な動作ができません。

ループが使えない!?と思うかもしれませんね。私も最初耳を疑いました。しかし、案外なんとかなるらしいです(まだ学習中なので断定できません)。

「不変である」ということは変数を監視するという従来の面倒なデバッグが不要になるということです。変わらないものを眺めていてもしょうがないですよね。

例えばvar list=;list.push(3);list.push(5);というコードを考えます。これは別にmutable、変更可能なのでconsole.log(list)すると[3,5]と表示されます。しかし、var list=Immutable.List();list.push(3);list.push(5);となると話は変わります。

Immutable.List();は空のImmutableなList(配列という解釈でおそらくあってます)を作ります。これに3と5をプッシュしたわけですが、console.log(list)するとどうなると思いますか?正解はと表示されます。つまり、pushしても変わらないということです。

つまり、「あれ?listが[3,5]になっていないぞ?どうしてだ?」と思い、console.log(list)を書きまくるということがなくなります。

使いドコロ

これでは困る、というひとが多いと思います。実際困ります。ノイマン型のアーキテクチャは副作用を前提としているため当然です。

ではいよいよImmutable.js使いドコロがない、と思わないでください。Immutable.jsの「不変」という特徴をいかせばいいのです。つまり、破壊的な動作を行い副作用バリバリなところをライブラリで隠蔽し、きれいなところだけImmutable.jsで触ればいいのです。

例えば前回取り上げた操車場アルゴリズム、あれなんて副作用まみれですよね。副作用を抜くということは新しいアルゴリズムを作るに等しいくらいバリバリです。

しかし、出来上がったコードでは内部に一切触れなくても計算させることができます。calc('1+1')と書くだけですから。この関数は何回実行しても2を返します。これは参照透過です。このように、副作用を内部に留め、外界にださないようにすればいいのです。

Immutableのさらなる利点

Immutableのさらなる利点はいくつかあります。特に特筆すべきはコピーが簡単にできるという点です。

Immutable、不変を確約されているので参照だけ渡せばコピーできたことになります。元もコピー先も変更ができないという性質を使っています。

終わりに

実は本来は面白い記事があったのでそれをわかりやすく書こうと思っていましたが、思ってたよりも理解できていなかったので途中で投げてしまいました、すいません。この記事(Why immutable collections?)のことです。undo、redoが低コストでできることや再描画が低コストで行えると書いてあります。興味があったら読んでみてください。