C#のプロパティって便利ですよね。
VisualStudioでpropまで打ってTab,Tabってやれば
public int MyProperty { get; set; }
まで自動で作ってくれるので楽なんですけど、このプロパティのsetアクセサを(Binding目的以外で)使うのをやめて、必要な場合はSetHoge(int value)みたいなメソッドにしませんかという提案。
以下理由です。
IDEで追いづらい
VisualStudioで「すべての参照の検索」から、setしてる箇所だけを抽出することができない。(実は方法ある?)
setアクセサを別メソッドにしておけば、そのメソッドに対する参照だけ抽出できるので
そのほうが管理しやすいと思う。
Bindingで更新されるものと区別がつかない
xaml系アプリに限った話になるけど、プロパティはBinding用のI/Fとしても使われるので、setアクセサがpublicになっていたときに、それがViewからバインド経由で更新するためなのか、コードで更新するためなのかがわからない。
setアクセサがメソッドになっていれば、それがBindingから更新されるものではないことが一目でわかる。
そもそもオブジェクトが不変でない
プロパティに外から値をsetするような設計は、そもそもあまり望ましくない。
理想的には、コンストラクタで値を渡した後はもう不変の状態にしておきたい。
不変なプロパティを↓のようにprivateなsetアクセサで表現することもあると思うが、
public string Name { get; private set; }
public Person(string name)
{
this.Name = name;
}
不変だということを保証するなら、本当は↓のように書くほうが良いと思う(ちょっと冗長になるけど)。
private readonly string _name;
public string Name
{
get
{
return _name;
}
}
public Person(string name)
{
this._name = name;
}
まとめ
- プロパティはBindingで使用する場合のみsetアクセサを設ける
- クラス外から値を更新したい場合はSetメソッドで表現する
- 不変な値はreadonlyフィールドに保持し、getアクセサのみを設ける
というのはいかがでしょうか(弱気)