- 2014/6/1 21:04
フィールドがpublicになっていて外部から直接アクセスできてしまう場合は、「フィールドのカプセル化」を検討します。
たとえば単価というフィールドがpublicに設定されていたとします。
// 単価
public int UnitPrice;
現在進行中のプロジェクトでは「単価には10円未満の値を設定できない」ルールがあったとすると、上記フィールドだと困ってしまいますよね?
単価がpublicなフィールドになっているため、本来設定されてはいけない9円や、あまつさえ-10円という数値まで代入できてしまいます。
これでは使用する個所全てで「単価が10円未満の場合」のチェックが必要になります。
// 単価の下限
private const int UNIT_PRICE_MINIMUM = 10;
// 売価を設定します
private void SetSellingPrice()
{
if (UnitPrice < UNIT_PRICE_MINIMUM)
{
throw new Exception(string.Format(“単価が{0}円未満です。”,
UNIT_PRICE_MINIMUM));
}
・・・
}
これはいくらなんでも非効率です。「単価には10円未満の値を設定できない」ルールを守ればよいのですから、代入時点で例外をスローしたいところですね。
そこで有用なのがフィールドのカプセル化です。幸いC#にはプロパティの概念がありますので、プロパティを用いて書き換えてみましょう。
// 単価
private int _unitPrice = 10;
// 単価
public int UnitPrice
{
get
{
return this._unitPrice;
}
set
{
if (value < UNIT_PRICE_MINIMUM)
{
throw new Exception(string.Format(“単価が{0}円未満です。”,
UNIT_PRICE_MINIMUM));
}
this._unitPrice = value;
}
}
こうしておけば単価に10円未満の値が代入されることはありませんので、プログラマーは業務ロジックに専念できます。