プロパティが好き
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にしないのはやはり中途半端。
遅くて大きくなるけどコードを書く際により安全になるか、それとも早くて小さいけどコードを書く際に注意が必要かというトレードオフになってしまった。
こういうトレードオフっていつも悩む。どの解決策を取るかはケースバイケースなのは当然だけど。
さて、どうしよう。