難解と言われながら名著とされている「エリック・エヴァンスのドメイン駆動設計」を読みました。
備忘録として自分なりの解釈を入れたりしてメモを残しておきたいと思います。
間違いもあると思うのでご指摘ください。
この記事では3部まで記載しています。
第1部 ドメインモデルを機能させる
ドメインモデルとは何かですが、それぞれドメインとモデルを以下のように認識しています。
ドメイン
プログラム、システムが関心を持つ領域や対象
モデル
物や事象、概念などを現実にあるものや現実で行っていることをベースに必要な部分を厳選して抽象化すること
モデルの必要な部分というのがドメインによって変化するので、ドメインによって精錬されたモデルがドメインモデル。
ドメインモデルを機能させるために…
・知識をかみ砕く
大量の情報から重要な情報を抜き出す、重要な言葉を見つけ出す(1人で行うのはNG) 抜き出すためには何が重要な情報かを見極めるためにその分野の学習が必要になる
・コミュニケーションと言語の使い方
チームで誤解のないように共通の言葉(ユビキタス言語)を使いながらモデル化を行う。
もし名前がなければ付ける。
その名前の物が何をするのか、チーム全体で共有する。
それが共有できないとコードの共有をするのも難しくなる。
・モデルと実装を結びつける
モデル駆動設計を行う。手続き型ではない。
モデル駆動設計
ソフトウェア要素のサブセットがモデル要素と密接に対応している設計。
相互に一致した状態を保つ。
第2部 モデル駆動設計の構成要素
・ドメイン駆動設計がアーキテクチャに求めること
レイヤードアーキテクチャなどドメイン層が分離したもの
・ドメインモデルの構成要素
ドメインモデルはエンティティと値オブジェクトとドメインサービスから構成される。
エンティティ…同一性(IDなどの識別子を持つ)を持つオブジェクト
値オブジェクト…エンティティとは逆で同一性がないオブジェクト。
同じ色で同じマジックが2つあったらどちらを使うのか気にしない
※同じモノでも視点や誰が使うかによって、同一性をもつかどうかは変わるので注意
ドメインサービス…エンティティや値オブジェクトとして扱うと不自然なもの
エンティティと値オブジェクトもドメインサービスとして扱うこともできるので節度を持って扱う
優れたサービスは以下の3点
- 操作がドメインの概念に関係しており、その概念がエンティティや値オブジェクトの自然な一部ではない。
- ドメインモデルの他の要素の観点からインターフェースが定義されている
- 操作に状態がない
第3部 より深い洞察へ向かうリファクタリング
リファクタリングはソフトウェア開発者にとっては良く知られている言葉で、機能の変更をしないようにソフトウェアの再設計を行うこと。
マーチン・ファウラーの著書である「リファクタリング」のような、ざっくり言うとコードをきれいにするのも重要だが、ドメインモデルの場合は、いわゆるクックブックのやり方を当てはめるだけでは済まない。
クックブックを当てはめることは良いことではあるが、当てはめてドメインモデルが改悪されてしまうと意味がなくなる。
適切なドメインモデルを念頭に創造力を持つこと、試行錯誤を繰り返すことがまず第一で、それが外れない範囲でパターンを適用する。
・ブレイクスルー
ブレイクスルーは起こすものではなくて結果的に起こるもの 継続的なリファクタリングをすることによって、コードやモデルが整えられる。
改良するたびに、開発者の視界は明確になってくる
視界が明確になったことにより、洞察のブレイクスルーをもたらす可能性が作り出される
ブレイクスルーの舞台を整えるために必要なこと
- 知識を噛み砕き、強固なユビキタス言語を育成するのに集中すること
- 重要なドメインの概念を探求して、それをモデルで明示すること
- 設計をよりしなやかになるように改良すること
- モデルを蒸留すること
・概念を掘り出す
ドメインエキスパートの使う言葉に耳を傾ける 以下のモデルにとって有益になりうる概念を示す手掛かりを見逃さないようにする。
- 何か複雑なものを簡潔に述べている用語がないだろうか?
- ドメインエキスパートに言葉の選び方を(たぶん、角が立たないように)正されていないか?
- あなたが特定のフレーズを使った時に、ドメインエキスパートたちの困惑した表情が消えることはないか?
制約やプロセスなどをモデル概念とすると設計が鋭くなる場合がある。
・より深い洞察へ向かうリファクタリング 重点的に取り組むべきこと
- ドメインに馴染む
- 常に物事に対して違う見方をする
- ドメインエキスパートとの会話を途切れさせない
リファクタリングを行う際はコードが整然としていることで安心しない。 ドメインモデルが適切かを常に考える必要がある。
モデルが適切でなかった場合、良いモデルについて探求する必要がある。 探求するには、より長い時間がかかり、より多くの人の参加が必要となる。 ドメインエキスパートや元々の開発者など、より多くの人とミーティングを行う。
ソフトウェアはユーザーのためだけのものではなく開発者のためのもの。
より深い洞察へ向かうリファクタリングは継続的なプロセス。 暗黙的な概念が認識されて明示的になる。 設計の一部はよりしなやかになる。 そして深いモデルへと突き進みまたリファクタリングを繰り返していく。