読者です 読者をやめる 読者になる 読者になる

カプセル化は生産性を下げる(?)(旧 blog からの移行)

設計

オブジェクト指向設計、クラス指向言語が浸透した今、こんなことを言うのは何ですが、カプセル化ってのは実は生産性を下げるんじゃないかと最近思うのです。

 まず断っておきたいことが一つ。粒度の細かいオブジェクトについては、カプセル化は有用だと思うんですよ。例えば複素数クラスとか日付クラスといったものですね。これらは適用範囲が広く、扱いやすいので、これのカプセル化をあえて破る理由はどこにも無いでしょう。

 カプセル化が有害なのは、粒度の粗いオブジェクトです。

 例えば、ダイアログそのものをラップしたクラスとか、何とかコマンドクラス、といったものです。これらは、先に挙げた粒度の細かいオブジェクトに対して設計が難しく、その苦労の割にカプセル化の恩恵を受けにくいからです。
 まず設計が難しい、と書きましたが、例えば抱えるリソースの管理だとか、順序依存、エラー対応など、考えなくちゃいけないことが山ほどあります。デザパタを駆使して依存を下げた美しい設計にしようと思うと、いたずらに低脳クラスを量産しがちで、振り返ってみると複雑怪奇なものが出来上がる危険があります。
 その一方で、それらのクラスが再利用できるかというとそんなに再利用できるケースは無いわけです。しかも、ひとたび仕様変更が入ると、入り組んだ設計を理解しないと、実装は進められないという現実があります。考え得る仕様変更に備えて余白を持った設計にすることは大切ですが、それに伴う実装とかテスト作業の量はさほど変わらないわけです。
 であれば、最初からカウボーイプログラミングしてしまった場合と比べても、短中期的に見ると時間も金も同じぐらいじゃないでしょうか。また、スキルの低いプログラマしかカードが切れない場合へのリスクを加味すると、必要以上のカプセル化には高いメリットを期待できません。どうせ手を入れるときはオブジェクトの内部構造にメスを入れるわけですから、カプセル化しようとするバイアスが結果的に無駄として計上されているような気がするのです。