は非常に単純な例を許すが、私はあなたがimmutablejsまたは他の同様のlibrairesを使用してそれを深くネストされたプロパティを変更することなく、OBJの値を使用する必要がある場合は、次の2つのアプローチの違いはあると思いまして:部分的な不変性は良い方法ですか?
//case1
var imm_a = {'names':['Joe', 'Jack'], 'owns':{'car': ['Toyota','Ferrari']}};
var a = Immutable.fromJS(imm_a);
a = a.setIn(['owns','car', 0], 'Ford');
//...a bunch of other modifications using immutable.js methods
console.log(a.toJS()); // using the changed value
console.log(imm_a); // imm_a has not changed
//case2
var imm_b = {'names':['Joe', 'Jack'], 'owns':{'car': ['Toyota','Ferrari']}};
var b = Immutable.fromJS(imm_b);
b = b.toJS();
b.owns.car[0] = 'Ford';
//...a bunch of other modifications using native javascript methods
console.log(b); // using the changed value
console.log(imm_b); // imm_b has not changed
上記の両方のケースでは、深くネストされた小道具を持つオブジェクト(imm_aとimm_b)がありますが、それは変更したくないものですが、変更された値を使用する必要があります。ケース1では、不変オブジェクトを作成し、不変オブジェクトを作成した後の2番目のケースでは、直接的割り当てや他のネイティブを使用してより簡単に作業できるように、不変オブジェクトを作成した後でそれを直接変更しますjavascriptメソッド。両方のアプローチで私たちはimm_aとimm_bを変更せずに保つことを目標に達しましたが、私は変更の簡単さのために第2のアプローチをはるかに簡単に見つけることができます。しかし、違いはありますか?よりよい方法としてどちらが推奨されていますか?
PS:私はb
またはa
の不変性を気にし、それらの例もないでは、私は変わらないしimm_a
とimm_b
を必要としています。一般的な使用例は、新しい状態が古い状態に依存するReduxアプリケーションであり、新しい状態として戻す前に古い状態値を変更する必要があります。 a
およびb
は、ローカルの一時変数です。質問は、永続的な値を持つものに依存しない限り、直接変更することはできますか?あるいは、私が不変の習慣を使用する場合、私はすべてを不変として扱う必要がありますか?
「b」はここで変更されていることを理解していますが、「a」は私が気にしていることです。いくつかのオブジェクトがアプリケーションの実行中に変更されずに残る必要があるシナリオを想像してください。しかし、他のいくつかのオブジェクトは変更可能です。一例は、深く入れ子になった新しい州が古いものに依存しているReact/Reduxアプリケーションの状態です。この場合、古い状態変数を変更せずに新しい状態を返すために必要な値を保持するために、変更可能なローカル値 'b'を作成できません。なぜ私はimmutablejsメソッドを使用していますか? –
また、不変のコードを書いていないのであれば、おそらくimmutablejsは必要ありません。一貫性、スタイル、そしてすべてを不変に保つことの理解は、なぜあなたが最初のものを選択するのかということです。 –