変数や引数は、基本的に不変(イミュータブル)にする
■インスタンス変数、プロパティや、メソッドの引数は、一度値をセットしたら
変更すべきではない。(引数の場合は、呼び出し元から渡された値
を変えるべきではない。
副作用を防ぐ為。
■readonly
readonly修飾子をつけ定義した変数は、コストラクタでのみ
値セットが可能になる。=値の変更が不可となる。
■値を変えたい場合
変数の値を変えるのではなく、新たにそのクラスのインスタンスを生成し、
それに対して新たな値をセットし返す設計がよい。
public class Goods
{
private readonly string _goodsName;
private readonly int _goodsAmount;
public Goods(string goodsName,int goodsAmount)
{
this._goodsName = goodsName;
this._goodsAmount = goodsAmount;
}
public Goods AddAmount(Goods tmpGoods )
{
// これは悪い例
/// _goodsAmount += tmpGoods.goodsAmount
// 新たにインスタンスを生成し、それに更新後の値をセットし返す
// 引数の型も、プリミティブ型(intとかstringとかデフォルトである型)ではなく、できるだけスコープを絞った型を
// 渡すことで、変な値を渡してしまうということを防ぐことができる。
return new Goods(tmpGoods._goodsName, tmpGoods._goodsAmount);
}
}