なんだか最近、皆さんオブジェクト指向設計について語っているので、私も語りたくなってしまい筆を執りました。How はあえて語っていません。また、我流の理解なのでご了承ください。
オブジェクトとは?
哲学の用語である Subject (主体) と Object (客体) に由来します。
- Subject (主体) … 見るもの。知るもの。
- Object (客体) … 見られるもの。知られるもの。
ある存在 A について考えるとき、別の存在 B を定義し、B が A を観測したとします。この際、B が Subject (主体) であり、「B が A をどのように理解したか?」が Object (客体) となります。
具体例を挙げてみましょう。
「自動車」について考えてみます。
Subject (主体) として「一般的な人」を定義したとすると「一般的な人が自動車をどのようなものだと考えているか?」が Object (客体) になります。つまり、「便利な乗り物である。ハンドル・アクセル・ブレーキ等を操作することで高速で移動することができる」のような感じでしょうか。別の Subject (主体) として「自動車整備工 (エンジニア)」を定義したとすると、また別の Object (客体) が得られます。それはエンジンや車体の深い知識が反映された Object (客体) になるでしょう。
このように、同じ存在について考えたとしても、どんな Subject (主体) を定義するかによって Object (客体) はまったく違うものになります。
オブジェクト指向設計とは?
Object (客体) をもとに現実をモデル化 (=単純化) し、得られたモデルを元にソフトウェアを設計することです。
Object (客体) をもとに現実をモデル化 (=単純化) する。
これが胆になります。
現実とはとてもとても複雑なもので、複雑なものを複雑なままソフトウェアにするのは難しいです。そのため、何らかの方法でモデル化 (単純化) する必要があります。例えば、物理が絡むときは数理モデルを作成して現実をシミュレートしたりします。例えば、人間をそのままソフトウェアに設計することは現実的ではないので、ユーザーアカウント等として、名前などの一部の情報だけを設計に組み込むでしょう。このようなモデル化 (単純化) の指針として、Subject (主体) / Object (客体) の考え方を利用するのがオブジェクト指向設計というわけです。
UML で最初にユースケース図があってアクターを定義するのも、まず Subject (主体) を定義しなければ分析が始まらないからですね。
システムの利害関係者を Subject (主体) として定義して Object (客体) を分析することによって、利害関係者のメンタルモデルが設計に反映され、彼らにマッチしたシステムになることが期待できます。また、利害関係者のメンタルモデルを反映した設計であるため、彼らの要求変更についてスムーズに対応できることも期待できます。
畢竟、「ユーザーの視点に立って設計しましょう」ということを難しく言っているだけであると言えます。
ドメイン駆動設計とは?
オブジェクト指向によるシステム開発の際には、そのシステムに関わるさまざまな利害関係者を Subject (主体) に置き、それぞれの視点からシステムを分析してモデル化 (=単純化) し、設計に反映することになります。
ここで問題になるのは、各々の Subject (主体) の視点に立つことが難しいということです。
専門知識を持つ Subject (主体) の視点に立つためには、彼らの専門知識 (ドメイン) が必要になります。例えば、医療システムについて分析するときに医者の Subject (主体) を定義したとすると、医学その他の専門知識が無ければ Object (客体) を導出できません。魔法のめがねで専門家の頭の中を覗くことができればどんなに素晴らしいでしょうか? しかし、それは不可能です。専門家とコミュニケーションを取りながら、彼らの視点を引き出していく必要があります。
どのようにして、開発者が Subject (主体) の頭の中を理解するか?
どのようにして、開発者が Subject (主体) の視点を理解するか?
これを語った方法論がドメイン駆動設計であると、私は考えています。
クラスとは?
オブジェクト指向の文脈でよく聞く言葉に「クラス」がありますが、これはあまりオブジェクト指向と関係がありません。
クラスとは数学の集合論に由来する言葉で、ある集合 A を定義したとき、A に属するすべての要素が持つ共通の特徴のことです。ソフトウェアは代数論や集合論の影響を強く受けていて、これらの考えに沿って設計を行うことで効率よく物事を処理できます。
Object (客体) を分析する際も、集合論の考え方を用いて分析を行うと、効率よくソフトウェアに反映させることができるでしょう。