質問

不変性の概念は好きですが、アプリケーションが並列であることが意図されていない場合、不変にすることを避けるべきですか?

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

または、不変性はOOPのような概念であり、すべての方法で使用しますか?使用/パフォーマンスなどに基づいて、何かを不変にすべきでないケースを除外します。

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

役に立ちましたか?

解決

不変性が大好きなのは、他の人のコードを信頼する必要がないため、同じままでいると予想されるオブジェクトに干渉しないからです。

List<T>などの別のコンポーネントにオブジェクトを渡すとき、そのコンポーネントが何をするのかはあなたに任せられます。これは、コレクションをプロパティとして返す場合に特に重要です。

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

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

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

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

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

他のヒント

不変の利点は、オブジェクトの作成時に1回だけ検証する必要があることです。それは実際には大きなボーナスです。

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top