パーシャルクラス

コンポジションを即実践しようとしてみました。

まずその前に、前回投稿後すぐに、当然触れるべきパーシャルクラスに触れ忘れたなと思い出しました。
パーシャルクラスはテーブルアダプタの機能拡張の文脈で出てくることが多いと思います。
例えば下記。
http://www.atmarkit.co.jp/fdotnet/bookpreview/vs2005webapp_07/vs2005webapp_07_04.html
自動生成されるソースを直接触ってしまうと、変更発生した場合に自動生成のやり直しができなくなってしまうので、別にしておこうと言うことですね。
で、これは自動生成だけでなく、自分で管理しきれないソース(他者から提供されるソースなど)についても同様に考えられるわけです。

話を戻して、コンポジションですが、一番の懸念点は転送メソッド記述の面倒さでした。
これもある程度自動化できるかなと思っていたのですが、それがいやだなと思うのが大量にプロパティばかりが存在するクラス。
例えば20行くらいの処理が書いてあるメソッドがあって、それを呼び出す転送メソッドを1行書くのは許せる気がするのですが、プロパティの場合は、ほとんど同じ量の記述を違う内容(プライベート変数の読み書きの代わりに元クラスのプロパティ呼び出し)で書かないといけないというのは、ストレスですし、単純に記載間違いのリスクも負いますし、やりたくない作業です。

で、パーシャルクラスを使う場合ですが、継承と同様カプセル化を壊すリスクがあります。
ただし、別のクラスではなく、プライベート変数にもアクセス可能なので、いざと言うときは逆に何でもできるという救いがあるような気もします。
また、コンポジションと違って、同シグニチャのままで拡張するということはできませんので、拡張時には呼び出し側も変える必要があるということになります。

まあ、単純ではないですが、まずはパーシャルを検討するという方向でやってみようと思います。