シナリオで不変型の実装が許可されていないとします。その前提に沿って、消費された後は不変になるタイプを適切に設計する方法についての意見/例をお願いします。
public class ObjectAConfig {
private int _valueB;
private string _valueA;
internal bool Consumed { get; set; }
public int ValueB {
get { return _valueB; }
set
{
if (Consumed) throw new InvalidOperationException();
_valueB = value;
}
}
public string ValueA {
get { return _valueA; }
set
{
if (Consumed) throw new InvalidOperationException();
_valueA = value;
}
}
}
ObjectA
消費するときObjectAConfig
:
public ObjectA {
public ObjectA(ObjectAConfig config) {
_config = config;
_config.Consumed = true;
}
}
これが単純に機能することに満足していません。より良いパターンがあるかどうかを知りたいです(前述のように、ObjectAConfig
最初から設計によって不変にすることは除外されています)。
例えば:
Once<T>
ラップされた値を一度だけ初期化できるようなモナドを定義するのは理にかなっていますか?プライベートフィールドを変更するタイプ自体を返すタイプを定義するのは理にかなっていますか?