オブジェクト指向設計とは?
---
オブジェクトとは?
哲学の用語である Subject (主体) と Object (客体) に由来します。
Subject (主体) … 見るもの。知るもの。
Object (客体) … 見られるもの。知られるもの。
同じ存在について考えたとしても、どんな Subject (主体) を定義するかによって Object (客体) はまったく違うものになります。
---
オブジェクト指向設計とは?
Object (客体) をもとに現実をモデル化 (=単純化) し、得られたモデルを元にソフトウェアを設計することです。
Object (客体) をもとに現実をモデル化 (=単純化) する。
これが胆になります。
モデル化 (単純化) の指針として、Subject (主体) / Object (客体) の考え方を利用するのがオブジェクト指向設計というわけです。
UML で最初にユースケース図があってアクターを定義するのも、まず Subject (主体) を定義しなければ分析が始まらないからですね。
また、利害関係者のメンタルモデルを反映した設計であるため、彼らの要求変更についてスムーズに対応できることも期待できます。 畢竟、「ユーザーの視点に立って設計しましょう」ということを難しく言っているだけであると言えます。
---
ドメイン駆動設計とは?
オブジェクト指向によるシステム開発の際には、そのシステムに関わるさまざまな利害関係者を Subject (主体) に置き、それぞれの視点からシステムを分析してモデル化 (=単純化) し、設計に反映することになります。
ここで問題になるのは、各々の Subject (主体) の視点に立つことが難しいということです。
どのようにして、開発者が Subject (主体) の頭の中を理解するか?
どのようにして、開発者が Subject (主体) の視点を理解するか?
これを語った方法論がドメイン駆動設計であると、私は考えています。
---
クラスとは?
オブジェクト指向の文脈でよく聞く言葉に「クラス」がありますが、これはあまりオブジェクト指向と関係がありません。
クラスとは数学の集合論に由来する言葉で、ある集合 A を定義したとき、A に属するすべての要素が持つ共通の特徴のことです。ソフトウェアは代数論や集合論の影響を強く受けていて、これらの考えに沿って設計を行うことで効率よく物事を処理できます。
Object (客体) を分析する際も、集合論の考え方を用いて分析を行うと、効率よくソフトウェアに反映させることができるでしょう。