こんにちは!
久しぶりの投稿となってしまいましたが、近ごろドメイン駆動設計というものが理解できなくて苦労しました。なので、いつも通りアウトプットしながら学ぼうということで記事にまとめていきます。
ドメイン駆動設計とは
ソフトウェア開発における設計手法の一つで、エリック・エヴァンス氏によって提唱されました。この手法は、ビジネスの本質である「ドメイン」(業務領域)とそのロジックをソフトウェアに直接反映させることを重視した設計技法です。
ドメイン駆動設計では、以下のようなアプローチを取ります
中核的な複雑性と機会に焦点を当てる
ドメイン(システム化する業務範囲)が抱える課題や問題を適切に理解し、ビジネス価値を最大限に引き出すアプリケーションを実現します。
ビジネス側と開発側の協力
ビジネスドメインの専門家と開発の専門家が協力して、共通の認識を持った上でドメインモデルを作成します。
ドメインモデルを明示的に表現するコードを書く
ソフトウェアのコードやアーキテクチャにドメインモデルを明確に反映させ、ビジネスドメインを正確にモデル化します。
境界づけられたコンテキスト内で共通の言語を使う
各ビジネスドメインの領域ごとに共通の用語を用い、認識の齟齬を避けます。
用は、システムには多くの分野の技術や知識が組み込まれてて、これらをそれぞれの分野を分けて考えて管理をしていく設計技法と考えていいのではないでしょうか。それぞれの分野の専門家と協力しながらシステムに必要な部分を話し合いながら設計をしていくことです。
ドメイン、サブドメイン、境界づけられたコンテキスト
ドメイン
【役割】
ドメインは、ビジネスの本質である業務領域を指します。具体的なビジネスプロセスや要件が含まれます。
【特徴】
ドメインはビジネスの要件を反映し、ソフトウェアの設計や実装に直接関連します。ドメインはユビキタス言語(ビジネスドメインの専門用語)を共有します。
サブドメイン
【役割】
システム全体の中で、特定のドメインをさらに細分化した領域を指します。サブドメインは、特定の業務範囲やチームの作業範囲に対応します。
【例】
ECサイトの「商品管理」や「配送」はそれぞれサブドメインに該当します。
サブドメインは、境界づけられたコンテキスト(後述)と一対一に対応します。
境界づけられたコンテキスト
【役割】
境界づけられたコンテキストは、特定のモデルを定義・適用する境界を示します。通常はサブシステムや特定のチームの作業範囲に対応します。
【特徴】
境界づけられたコンテキスト内では、ユビキタス言語の単語やフレーズが特別な意味を持ちます。
簡潔に言えば、ドメインはビジネスの大きな領域を指し、サブドメインはその中で特定の部分をさらに細分化したものです。境界づけられたコンテキストは、各サブドメインごとに異なるモデルと言語を持つための仕組みです。
それぞれの層
ドメイン層
【役割】
ドメインモデルを表現する層です。
ビジネスドメインの要件をコードに反映させるためにモデリングを行います。
【ドメインオブジェクト】
・エンティティ
→値オブジェクトを複数持つストラクト(例: 社員、記事、商品)。
・値オブジェクト
→ストラクトの中の要素(例: 名前、誕生日、体重)。
・ドメインイベント
→ストラクトの値が変更されるイベント(例: 年をとる、部署を移動する)。
【使用するもの】
・リポジトリ
→永続化層へのアクセスを提供するもの。
・ファクトリー
→ドメインサービスの一種で、生成に関する部分を提供する。
・ドメインサービス
→モデルをオブジェクトとして表現すると無理がある場合に使用する。
アプリケーション/ユースケース層
【役割】
ドメインオブジェクトが提供するメソッドを組み合わせて、一連のドメインオブジェクトに対する処理を実装します。
【アプリケーション層への値の渡し方】
専用のストラクトに入れて返す(専用のストラクトを「名前Dto」として設ける)。
ドメインオブジェクトが提供するメソッドから受け取った値をそのまま返す(推奨)。
プレゼンテーション層
【役割】
リクエストのバインディングとチェック、レスポンスを請け負います。
インフラストラクチャ層
【役割】
ストレージなど外部に依存する処理を請け負います。
まとめ
本記事では、ドメイン駆動設計についてまとめていきました。
正直、私自身まだ理解しきれていません。本当に難しい概念だと思います。
なので、まずはどんなものというのをわかればいいかなと思っています。
今後、実際に作って試していこうと思います。
ここまで読んでいただきありがとうございます!!