C#:クラスに【個性】を持たせよう

C#

この記事はプログラマー初心者から中級者に上がるために実践すべき内容です。

私自身、これを意識するようになってから
コーディングのレベルが上がったような気がします。(コーディングもプログラミングもとりあえず同じような意味合いでとらえていてください。)

意識することは、たったのこれだけです。

  • アクセス修飾子:publicとか private を意識する
  • プロパティ:getter と setter を意識する
  • コンストラクタ:タダじゃnewできないようにする

この三つです。
簡単に言えば、上二つはプロパティに関することになります。
あるメンバ変数を見たとき、クラス内で使うのか、外でも使うのか(public or private)がまず一つ。

そして、値を見るだけなのか、値も設定するのか(getter & setter)という二つ目。
また、二つを合わせて、
『外から値は見るけど、値のセットはクラスの中だけ』にするのか、という状態も作れます
(このケースは、{get ; private set ; }って感じになりますね。)

また、3つ目はコンストラクタに工夫を加えましょうという事です。
いつもデフォルトコンストラクタにしていませんか?
( var hoge = new Hoge(); ←こんなやつです。)

慣れてきたら引数ありのコンストラクタを使って、『簡単にはnewできない』ようにしましょう。

これは、チームで開発するときに特に有効で、他のメンバーが間違ってnewさせて利用するという事を防止できます。

クラスに個性を持たせよう

以上3点を意識して、意味のある設計をしたクラスを作っていきましょう。
ただ、実際にはかなり条件がルーズなクラスもありますので、そちらも紹介します。

たとえば、
どのプロパティも常にpublicでかつ、フルでgetter & setterもできる形態があります。
私が知っている限りでは、ビューモデルといわれる形態がこれに該当します。
また、コンストラクタもデフォルトコンストラクタのみが多く、どこでも作れるし、もう何でもありです。

それはビューモデルという形が、値を自由に設定できるのを良しとしているからです。
(MVCモデルのビュー、モデル、コントローラー、と分けられるうちの、ビューを表示するためのモデルをビューモデルという)

例えばasp.net core でいうと、
コントローラのアクションの引数としてビューモデルの形式は抜群に相性良いです。
下手に工夫を加えると、あるプロパティだけバインドされない、などの不具合が生まれます。

このように、条件がルーズなビューモデルの設計が悪い訳ではありません。
ビューモデルの設計の方が都合が良いから、その形をとっている場合もあるのです。

ただ、『ビューモデル』は例外として条件がルーズですが、それ以外のクラスであれば先ほど紹介したように、
『プロパティ一つとっても、getはできるがset はprivateのみ』であったり、
『コンストラクタする際には別のクラスが引数にないと作れない』などの制限を入れてあげると良いです。

なぜなら、それだけで使える場面が限定でき、かつ、色んな条件が保証されます(値が変わらない、外からの変更はない、など)。

このようなクラスは、ビューモデルのような裸のクラスと対比して、何か個性を持ったようなクラスと言えます。

このように、コンストラクタやプロパティを工夫して、個性のあるクラスを作っていくだけで脱初心者のコーディングができるのではないでしょうか。
ぜひ試してみてください。

最後に復習です!

  • アクセス修飾子:publicとか private を意識する
  • プロパティ:getter と setter を意識する
  • コンストラクタ:タダじゃnewできないようにする

これらを意識して、脱初心者を目指しましょう!