はじめに
この記事は正しくは「DDDで採用されることの多いアーキテクチャが持つ層について」です。
対象読者
DDDについて軽く勉強した人
DDDを採用していて、アーキテクチャについて調べ直したくなる時がある人
記事で論じないこと
そもそもDDDとは何か
DI、DIPといったアーキテクチャの話
記事で論じること
DDDで採用されるアーキテクチャの各層について
概要
DDD(ドメイン駆動設計)で採用されることが多い、レイヤードアーキテクチャ、クリーンアーキテクチャ、オニオンアーキテクチャ、etc..が持つ層について理解を深める
層とは
本記事で指す層とは、プレゼンテーション層、アプリケーション/ユースケース層、ドメイン層、インフラストラクチャ層である
備考
本記事では主にアプリケーション/ユースケース層、ドメイン層について記載
内容の不備/間違いはご指摘ください
Go的な観点で書いています
ドメイン層
役割
ドメインモデルを表現すること
※DDDにおけるドメインとは、ソフトウェアによって解決したい対象領域(課題)のこと/ソフトウェアで解決したい対象領域(課題)をコードに落とし込むためにモデリングを行い、それを表現する
ドメイン層に書かれるもの
- ドメインオブジェクト(ドメインモデルを表現するもの)
- エンティティ
- 値オブジェクト
- ドメインイベント
- ドメインオブジェクトを使用するもの
- リポジトリ
- ファクトリー
- ドメインサービス
ドメインモデルを表現するもの
ドメインオブジェクト:ドメインモデルをコードに落とし込むことで作成したもの全てをまとめた際の呼び名
ドメインオブジェクト
エンティティ :値オブジェクトを複数もつストラクト(社員、記事、商品など)
値オブジェクト :ストラクトの中の要素(名前、誕生日、体重など)
ドメインイベント:ストラクトの値が変更されるイベント(年をとる、部署を移動するなど)
エンティティと値オブジェクトの違い
エンティティ :同一判定を識別子で行う
値オブジェクト:同一判定を保持している値で行う
ドメインオブジェクトを使用するもの
リポジトリ :永続化層へのアクセスを提供するもの
ドメインサービス:モデルをオブジェクトとして表現すると無理があるもの
ファクトリー :ドメインサービスの一種
リポジトリ
実装する場合はインターフェースをドメイン層に実装し、処理本体はインフラ層に書く
永続化層とは?
永続性 :プログラムの終了/PCの電源断後もデータが存続する性質
永続化 :データに永続性を持たせること
永続化層:データを永続化する処理がある層(DB処理など)
ドメインサービス
モデルをオブジェクトとして表現すると無理があるものの中で、主に集合に対する操作を提供する場合に使用する
極力ドメインサービスを設けないことが推奨されているっぽい
ファクトリー
ドメインサービスの一種で、モデルをオブジェクトとして表現すると無理があるものの中で生成に関する部分を提供する
例:生成するドメインオブジェクトに生成する状況によって変化がある場合の生成ロジック(対象のファイルのタイプによってオブジェクトが異なるなど)
アプリケーション/ユースケース層
役割
ドメインオブジェクトが提供するメソッドを組み合わせて、一連のドメインオブジェクトに対する処理を実装する
アプリケーション層への値の渡し方
- 専用のストラクトに入れて返す(専用のストラクトを_____Dtoとして設ける)
- ドメインオブジェクトが提供するメソッドから受け取った値をそのまま返す
1が推奨
理由:2の場合、アプリケーション層からドメイン層への参照が発生する可能性、不必要な値までアプリケーション層に届ける可能性がある
プレゼンテーション層
役割
リクエストのバインディングとチェック、レスポンスを請け負う
インフラストラクチャ層
役割
ストレージなど外部に依存する処理を請け負う
終わりに
プレゼンテーション層、インフラストラクチャ層について内容が薄くなってしまいましたが、この記事を通してみなさんのお役にたてれば幸いです。
また、内容に不備がありましたらご指摘お願いします。