会社の推薦図書で「ドメイン駆動設計入門」を読んでみたので簡単にまとめたいと思います。
※Amzon.co.jpのアフィリエイトリンクになっています
ドメイン駆動設計とは
ドメインとは「領域」の意味持った言葉である。ソフトウェア開発におけるドメインとは「プログラムを適用する対象となる領域」を指す。例えば、会計システムがあったときに、金銭や帳票とった概念がドメインになる。ここで重要なのはドメインが何であるかではなく、ドメインに何が含まれているかである。ソフトウェア利用者が何を解決しようとしているのか、彼らを取り巻く環境を真に理解し、技術的なアプローチで解決しようとするのではなく、ドメインと向き合い、それらを知識に焦点を当てることによって問題解決のための最善手をを考える。ドメイン駆動設計はそういった洞察を繰り返しながら設計を行い、ソフトウェア利用者を取り巻く世界と実装を結びつけることを目的としている。
ドメインモデルとは
モデルとは現実の事象あるいは概念を抽象した概念である。現実をすべて忠実に再現するわけではなく、必要に応じて取捨選択を行う。何を取捨選択するかはそのドメインによる。事象や概念を抽象化する作業をモデリングといい、その結果として得られるものがモデルである。ドメイン駆動設計においてはドメインの概念をモデリングして得られたモデルをドメインモデルという。ドメイン知識のある人(ビジネスサイド)は開発についての知識はないことが多い、開発者はソフトウェアに関する知識はあってもドメインに関する知識はないことが多い、そのためドメインモデルを作成するには両者が協力する必要がある。
ドメインオブジェクト(値オブジェクト、エンティティ)
ドメインモデルはそれ単体では抽象化した知識にとどまる。問題解決のためには、ドメインモデルを何かしらの媒体で表現する必要がある。ドメインモデルをソフトウェアで動作するモジュールとして表現したものがドメインオブジェクトである。ドメインオブジェクトによって、コードのドキュメント性が高まったり、ドメインによる変更をコードに伝えやすくなるなどの恩恵が受けられる。
値オブジェクト
システム固有の値を表現するために定義されたオブジェクトを値オブジェクトで、属性によって識別される。値オブジェクトは「それ単体で扱いたいかどうか」が判断基準が重要視される。
値オブジェクトの性質
- 不変である
- 値の中身が途中で変更されないこと
- 交換が可能である
- 変数の代入処理
- 等価性によって比較される
- 値オブジェクトは値オブジェクト同士で比較される
エンティティ
エンティティは値オブジェクトと同様にドメインオブジェクトであるが、値オブジェクトとの違いは同一性によって識別されるか否かである。エンティティとは属性によって区別されない値オブジェクトとも言える。例えば、ユーザーという概念はその典型であり、ユーザー情報というものは大抵は任意で変更可能である。ユーザー情報を変更してもユーザー自体が変更されるわけではない。ユーザーは属性ではなく、同一性によって識別されているからである。
エンティティの性質
- 可変である
- 属性を変更させたい場合は交換によってではなく、ふるまいを通じて変更する。
- 同じ属性であっても区別される
- 同一性により区別される
- 同一性を判断するために識別子を利用する
ドメインサービス
値オブジェクトやエンティティなどのドメインオブジェクトに記述されたふるまいが不自然である時に定義する。ドメインサービスはドメインオブジェクトでは不自然なふるまいになる挙動を記述することで、ドメインオブジェクトの不自然性、一貫性を保つことができる一方で、ドメインサービスにすべのふるまいを記述してしまうと、開発者が本来のドメインオブジェクトにどのようなふるまい、ルールを持っているのかが分からなくなるので、可能な限りドメインサービスの濫用は避ける。
リポジトリ
ドメインオブジェクトの永続化や再構築を行う。データストアに対する詳細な操作をリポジトリに専念させることで、ソフトウェア開発に柔軟性を与える。オブジェクトのインスタンスを保存したい時は直接的にデータストアに書き込み処理を実行するのではなく、リポジトリにインスタンスの永続化を、再構築を依頼することで、ドメインオブジェクトはドメインの知識を表現することに集中することができる。
アプリケーションサービス
アプリケーションサービスは、ユースケースを実現するオブジェクトであるユーザーの利用用途に応じた調査役を実現する値オブジェクトやエンティティは自身のふるまいをもっているが、サービスは自身のためのふるまいはもっていない。アプリケーションサービスは「もの」や「こと」ではなく、活動や行動であることが多い。
ユーザーの登録や退会といったことはアプリケーションを成り立たせるための操作であり、このふるまいはドメインに存在する概念ではなく、アプリケーション固有のふるまいであり、これらが定義されるのがアプリケーションサービスである。ドメインサービスとアプリケーションサービスは対象となる領域が異なるだけで、向いている方向がドメインであるか、アプリケーションであるかの違いである。
この本はエンジニア歴の浅い自分からすると少し難しかった印象があります。
開発にはドメインの知識が不可欠。自分も今携わっている事業のドメイン知識を深く知っていきたいと思いました。