アクセサ以外のプロパティは必要か
引用
C#でプログラミングする場合、最近ではフィールドをカプセル化するためのアクセサにしかプロパティを使おうとしない自分がいる。
私も同じ。9 割以上のプロパティは、フィールドの単なるラッパーにしかなっていない。これを半ば常識としているので、稀にある「途轍もなく複雑な計算をしているプロパティ」や「データベースやファイルのような外部リソースにアクセスしているプロパティ」が極端なパフォーマンス劣化をもたらす場合がある。
Clazz d = new Clazz();
double sum = 0;
for(int i = 0; i < 10000; i++){
sum += d.Value;
}
上記コードで、Clazz クラスには、Value プロパティが定義されている事が分かる(慣例に従い、フィールドは公開されているはずがないとする)。Value がフィールドの単なるラッパーだったら全く問題ないのだが、getter の実装がデータベースからデータを取得しているものだとしたら、一万回のデータベースへの接続が行われるため、パフォーマンス劣化は避けられない。当然、以下のように書けばいいじゃんって話になる。
Clazz d = new Clazz();
double sum = 0;
double value = d.Value;
for(int i = 0; i < 10000; i++){
sum += value;
}
このように書くのは、Value プロパティの実装を「知っている」から出てくる発想かもしれないが、プロパティの実装を知り得ない以上、ループ内でのプロパティへのアクセスは避けるべきだろう。
「そのようなプロパティはプロパティではなくメソッドにすべきだ」という意見もあるだろう。至極もっともだ。そうした方がよい。コーディングルールに「複雑な処理はプロパティではなくメソッドにする」なんてのもありかもしれない。しかし、曖昧かつ無意味に強すぎるルールを全員が守っているかどうかは疑問だし、そもそも既存のライブラリにはその期待を持てない。従って、使う側が「このプロパティは凄く重い処理をしているかもしれない」という事は常に気に留めておくべきだろう。