プロパティが好き

C#のお気に入りなところはプロパティ。小さいけれど偉大な機能かも。Javaには今さら入れれないかなぁ。入れてくれるとうれしいけど、既存コードがまずいだろうなぁ。
だんだん慣れてきたので、こんな使い方をしてみた。

private int position;

private int Position
{
  get { return position; }
  set
  {
    position = value;
    if ( position < 0 ) position = 0;
    if ( result.Count < position ) position = result.Count;
  }
}

フィールドもプロパティもprivateな点に注意。
こういうプロパティを用意しておいて、クラスの中なのにフィールドの position を直接触れず、プロパティの Position 経由で変更。このようにした場合のメリットとデメリットを考えてみた。

  • メリット
    • positionを変更する処理を書くたびに、範囲チェックの処理を書く必要がない。
  • デメリット
    • 1.毎回上限と下限のチェックが発生するので無駄。例えば、足し算した後には下限のチェックは本来不要。
    • 2.フィールドの position には自由に触れるので、触れないようにするのはプログラマの責任になる。

デメリット2の解決策は、範囲制限したintを持つstructを作ってしまえばいいわけだけど、そこまでしたくないなぁと思って、これで妥協。と思ったけど、こうやってメリットデメリットを文章にしてみると、やっぱりstructにするべきじゃない?って思いがむくむく湧いてきた。

structにすると上限と下限を持たないといけない。汎用的にしないで下限は0固定にして上限だけ渡せば、最適化で「< 0」の部分が早くなりそう。それでも上限を渡す必要と、上限を参照する分のメモリが増える。でもここまで書いといてstructにしないのはやはり中途半端。
遅くて大きくなるけどコードを書く際により安全になるか、それとも早くて小さいけどコードを書く際に注意が必要かというトレードオフになってしまった。
こういうトレードオフっていつも悩む。どの解決策を取るかはケースバイケースなのは当然だけど。
さて、どうしよう。