8

私は不変性の概念が好きですが、アプリケーションが並列であることを意図していない場合、物事を不変にすることを避けるべきではないかと思うことがあります。

アプリケーションがマルチスレッド化されていない場合、共有状態の問題に悩まされることはありませんよね?

それとも、不変性は OOP のような概念で、常に使用するか使用しないかのどちらかですか? 使用/パフォーマンスなどに基づいて何かが不変であってはならない場合を除外します。

自分でアプリケーションを作成するときに、この質問に直面します。これは適度に大きいものです (おそらく 1 ~ 2k 行)。

4

3 に答える 3

9

オブジェクトの作成時に一度だけ検証する必要があるという不変性の利点が気に入っています。それは実際には大きなボーナスです。

于 2009-06-22T21:59:54.110 に答える
8

私は不変性が大好きです。なぜなら、他の人のコードを信頼して、同じままであると期待しているオブジェクトをいじらないようにする必要がないからです。

オブジェクトを などの別のコンポーネントに渡すと、List<T>そのコンポーネントの動作に翻弄されます。これは、コレクションをプロパティとして返す場合に特に重要です。

public class Foo { 
  private List<Bar> _barList;
  public ICollection<Bar> BarList { get return _barList; } 
}

このクラスの消費者がコレクションを私の下から消去するのを止めるものは何もありません。戻り値の型を に切り替えても、IEnumerable<Bar>完全に安全というわけではありません。不適切に記述されたコードの一部がこれをキャストしてList<T>.Clear() を呼び出すことを止めるものは何もありません。

ただし、コレクションの一貫性を維持したい場合は、次のように書き直すことができます

public class Foo {
  private ImmutableCollection<Bar> _barList;
  public ImmutableCollection<Bar> BarList { get { return _barList; } }
}

これで、他のコードが自分のクラスを間違って使用することを信頼する必要がなくなりました。彼らはそれを台無しにすることはできません。

于 2009-06-22T22:12:26.533 に答える
2

不変の主な利点は、不変オブジェクトの所有権を追跡する必要がないことです。それらは誰かが必要とする限り存在し、必要がなくなると消滅します。多くの場合、ガベージ コレクターを使用することは、変更可能なオブジェクトの所有権を扱う明示的なコードを記述する必要がないことを意味します (最大の例外は を実装するものですIDisposable)。州には、明確に定義された「所有者」が 1 人もいません。誰が可変オブジェクトの状態を所有しているかについての混乱は、非常に頻繁にバグの原因となる可能性があります。不変オブジェクトを使用する場合 ( を実装するいくつかを除いてIDisposable)、通常は所有権の問題を無視できます。

考慮すべきもう1つのポイントは、可変オブジェクトへの可変参照について推論するよりも、意味的に不変なオブジェクトへの可変参照、または可変オブジェクトへの不変参照について推論する方がはるかに簡単だということです。変更可能なオブジェクトへの変更可能な参照がある場合、状態を更新するための正しいアプローチが単にオブジェクトを直接変更することなのか、それともその状態を新しいオブジェクトにコピーして変更し、参照を更新することなのかが不明な場合がよくあります。場合によっては、各タイプの操作が必要になる状況があります (List<T>、配列をより大きな配列に置き換えることもありますが、通常はその場で更新します)、そのようなアプローチは、型が問題の可変オブジェクトに対する排他的制御を維持している場合にのみ機能します。多くの場合、可変型への不変参照 (この場合、コードは、おそらく読み取り専用ラッパーを介して、その状態の「ライブビュー」を必要とする他のオブジェクトへの参照を公開する可能性があります) を持つか、そうでなければ、不変であるか、少なくとも参照の存続期間中に変更されることのないオブジェクトへの変更可能な参照。

于 2012-09-29T20:59:18.813 に答える