主にJavaを使用してソフトウェア開発をしている私にとって、これは実に古いテーマだ。しかし、実に重要なテーマでもある。
オブジェクト指向設計・実装(OOAD)を標榜して、過去に3つのプロジェクト(約2年半)に携わった。そこで、何を目指してOOADしたのか。
- 技術的な関心事項を業務ロジックから切り離したい。
- 複雑な業務ロジックを簡単に理解できるようにしたい。
1.については、アーキテクチャ設計やフレームワーク実装によって行い、主に「関心の分離」を目指した。2.については、ドメインモデリングを行い、抽象化によるデータの整理、データと処理のカプセル化によって、「関心の分離」や「段階的詳細化」を目指した。
「関心の分離」はオブジェクト指向でよく使われる言葉だが、本質的に求めていることは「高凝集性と疎結合性」という使い古された言葉を使うことも出来るだろう。「段階的詳細化」も使い古された言葉である。
要は、オブジェクト指向は「高凝集性と疎結合性」、「段階的詳細化」という古くからの価値観を実現するための、現時点で最良と考えられている方策・・・と結論付けることが出来る。
オブジェクト指向の特徴は、データと処理をオブジェクトとしてカプセル化することである。まず、データを軸にして、そのデータを取り扱う処理を集約する。ここでデータとそのデータに関する処理が凝集したことになる。少なくともデータと処理を分けて考える、旧来の手法よりは高い凝集性が実現したと言って良いかもしれない。上手く設計されたオブジェクトは真に高凝集性が実現される。
また、軸となるデータの整理が上手く設計されることは前提である。ここでオブジェクト指向のもう1つの特徴である抽象化は力を発揮する。
人間はあまりに多くのことは同時に理解できない。そこで小異を捨てて大同につくことで、同時に理解することを少なくする。そして大同を理解した上で、1つの大同を取り出して捨てた小異をもう一度取り出して検討を進めていく。正に段階的詳細化であるが、ここで「小異を捨てて大同につく」手法として抽象化が活用される。
ところで、気をつけておくべきは、OOAでの段階的詳細化は主にデータに対して、集約されるであろう処理を参考にしながら行われることだ。旧来手法のように処理だけを対象にして段階的詳細化を図るわけではない。
自分の現時点での理解は、以上のとおりである。
ところが、J2EEにおいて特にEJB(2.0以前)などは、処理を担当するSessionBeanとデータに相当するEntityBeanに分けてしまう暴挙に出る。少なくとも実装段階において、データと処理を別扱いすることが推奨されてしまう。私の理解を簡単に覆す。
最近、J2EE5.0やEJB3.0、さらにDI(Dependency Injection:依存性注入)の考え方に基づく軽量コンテナの登場により、Javaでの開発手法は変化しようとしている。EJB3.0を先取りしたセミナーでは「これまでのEJBは、そもそもアンチパターン」などという言葉も出てきて、ひょっとすると私の理解が覆されることはなくなるのではないかという期待を感じた。
その一方で、最近出てきた手法や、最新の技術を紹介するような書籍でも、データと処理は分離されている。データと処理のカプセル化というのは、結局理想でしかないのか。この理想は実現できないのか。それが、目下の悩みの種である。