私は自分のアプリで基本的な型のほとんどを不変にしています。しかし、コレクションも不変である必要がありますか? 私には、何かが欠けていない限り、これは大きなオーバーヘッドのように思えます。
Point3 の値などを保持するためのコレクションについて話しているので、さまざまなタイミングで追加することができます。コレクションに 1M の値があり、そのうちの 1 つを削除する必要がある場合、同じコレクションをもう一度作成する必要があります。
私は自分のアプリで基本的な型のほとんどを不変にしています。しかし、コレクションも不変である必要がありますか? 私には、何かが欠けていない限り、これは大きなオーバーヘッドのように思えます。
Point3 の値などを保持するためのコレクションについて話しているので、さまざまなタイミングで追加することができます。コレクションに 1M の値があり、そのうちの 1 つを削除する必要がある場合、同じコレクションをもう一度作成する必要があります。
Eric Lippertは、C#での不変性に関するシリーズを持っており、それを最後まで読んだ場合、彼はいくつかの異なる不変のコレクションを実装しています。
不変のコレクションは、特にアプリが不変のタイプまたはセマンティクスをすでに活用している場合に最適です。
.NETは、最初の不変のコレクションを出荷したばかりです。試してみることをお勧めします。
コレクションでの私のお気に入りのトリックは、単にそれらを決して渡さないことです。それらが単一のオブジェクト内にのみ存在する場合、それらを不変にすることはほとんど関係ありません(含まれているオブジェクトがそれらを変更しない限り、それらは変更されません)。
通常、あなたのコレクションは何かを表していますよね?それは犬のコレクションまたは請求書のコレクションです...
通常、犬のコレクション(Herd?neuter?)または請求書のコレクション(pay?)でできることがあります。オブジェクトのリスト全体に適用される操作が事実上常にあります。 invoice.pay()(たとえば、最も重要な請求書が最初に支払われるようにする)、コレクションの周りにクラスがないと、これらの操作をどこに置くかは実際にはありません。
また、通常、コレクションにいくつかの変数を関連付けることも理にかなっています。ラッパーがないと、これらの変数を奇妙な不自然な場所に配置することになります。
最初は奇妙に思えるかもしれませんが、判断する前に数回試してみてください。
最初または最後からのみ追加/削除する場合は、ごまかすことができるかもしれませんが、一般的には; はい: つまり、変更ごとに新しいコレクションを作成する必要があるということです。
では、コレクションを (効果的に) 変更する必要がありますか? もしそうなら、そしてそれらのサイズを考えると、私は(適切に不変にするのではなく)アクセスの同期を検討したくなるでしょう。lock
(別名)を見てくださいMonitor
。
問題に適したツールの選択に関する Eric のコメントに同意します。不変性は、明確な ID セマンティクスの提供や、並列コンピューティング環境での実装の作業を容易にすることが目標に含まれている場合に価値をもたらします。不変性は、キャッシングや透過プロキシなどの最適化を可能にすることで、パフォーマンスの向上にも役立ちます。
反対に、不変性によってパフォーマンス コストが発生する可能性もあります。特に、「コピー オン ライト」パターンを使用して「変更」をモデル化する場合はそうです。
エンティティ/コレクションを不変にする理由を決定する必要があります。これは、そうするかどうかの決定を促進するのに役立ちます。
それは、プログラムが作成/設計されているスタイルによって異なります。
不変コレクションは、関数型プログラミングの影響を受けたスタイルでプログラミングしている場合にのみ意味があります (命令型に設計されたプログラムでは使用しないでください)。
そして、関数型言語のように、要素ごとに O(1) ( ) で構築できるリンク付きリストを使用し、cons
それらを機能的に処理する必要があります (再帰、リストからの新しいリストの構築)。
プログラムで命令型コレクション (配列、ベクトル/リスト) が必要な場合は、それらを変更可能にしてください。
ルックアップ テーブルは、まともな不変コレクションになります。サイズを変更する必要はなく、静的にしたいので、トリッキーな計算をすばやく検索できます。後で何かを追加する必要がある場合、私は不変性を気にしません。それは目的を無効にします。
パブリック インターフェイスを IEnumerable として定義することもできますが、実装では変更可能なコレクションを引き続き使用します。
それはすべて、誰がコレクションを同時に使用しているかによって異なります。文字列は、最初の文字を同時に削除しようとする 2 つのスレッドのようなブーブーを防ぐために不変です。
構築後にアイテムを追加できるコレクションがある場合、それは不変ではありません