2016-10-05 5 views
-1

は非常に単純な例を許すが、私はあなたが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_aimm_bを必要としています。一般的な使用例は、新しい状態が古い状態に依存するReduxアプリケーションであり、新しい状態として戻す前に古い状態値を変更する必要があります。 aおよびbは、ローカルの一時変数です。質問は、永続的な値を持つものに依存しない限り、直接変更することはできますか?あるいは、私が不変の習慣を使用する場合、私はすべてを不変として扱う必要がありますか?

答えて

1

2番目の例は、b Javascriptオブジェクトの内容を変更しているため、ImmutableJSの使用目的を完全に無効にしています。 ImmutableJSの主なポイントの1つは、オブジェクトを変更すると、まったく新しいオブジェクトが返されるということです。

この単純な例では、何の効果もありませんが、変更可能なコードを書く利点は、aへの参照を持つ他の誰もそれが決して変更されないことを知っており、 。 2番目の例では、bを変更したため、bへの参照を持つ他のコードでは、ローカルの更新がオブジェクトへの参照でも発生するため、「ラグを下から抜き取って」表示されます。

実際の不変性を保証するためにImmutableJSを使用しない場合は、今のところ使用しないほうがよいでしょう。これは、プログラムに重大なオーバーヘッドを追加します。

+0

「b」はここで変更されていることを理解していますが、「a」は私が気にしていることです。いくつかのオブジェクトがアプリケーションの実行中に変更されずに残る必要があるシナリオを想像してください。しかし、他のいくつかのオブジェクトは変更可能です。一例は、深く入れ子になった新しい州が古いものに依存しているReact/Reduxアプリケーションの状態です。この場合、古い状態変数を変更せずに新しい状態を返すために必要な値を保持するために、変更可能なローカル値 'b'を作成できません。なぜ私はimmutablejsメソッドを使用していますか? –

+0

また、不変のコードを書いていないのであれば、おそらくimmutablejsは必要ありません。一貫性、スタイル、そしてすべてを不変に保つことの理解は、なぜあなたが最初のものを選択するのかということです。 –

関連する問題