ドメイン駆動設計入門
https://gyazo.com/8620183441eab0d5dcb9a1ebe542b2a6
ドメイン駆動設計はドメインの知識に焦点を当てた設計手法.
1
ドメインとは
プログラムの適用対象となる領域.
開発者はドメインと向き合い,知識に焦点を当てて表現する.
モデリングとは
概念を抽象化すること.
文具は「筆記機能を持つもの」かもしれないし,「一つの商品」として捉えられるかもしれない.
ドメイン駆動設計ではドメインモデルを作成する.
ドメインモデルをソフトウェアで動作するモジュールとして表現するものをドメインオブジェクトという.
ドメインモデルの取捨選択が重要.
知識を表現するためのパターン
値オブジェクト: 金銭や製造番号などを表現するパターン
エンティティ: 値オブジェクトと対をなすような性質.
ドメインサービス: 値オブジェクトやエンティティでうまく表現できない知識を扱うためのパターン
アプリケーションを実現するためのパターン
リポジトリ: データの永続化のためのオブジェクト.
RDBなどデータストアを抽象化する.
アプリケーションサービス
値オブジェクト,エンティティ,ドメインサービス,リポジトリでアプリケーションは実現する.
アプリケーションとして成立させる場をアプリケーションサービスと呼ぶ.
Factory
オブジェクトを作る知識に特化したオブジェクト.
複雑なオブジェクトの生成はある種の知識である.
生成を一箇所にまとめあげる.
発展的なパターン
集約
値オブジェクトやエンティティなどドメインオブジェクトを束ねて複雑なドメインを表現する.
仕様
オブジェクトの評価を行う.
2: 値オブジェクト
値オブジェクトにするべき概念を実装中に見つけたら,ドメインモデルとしてフィードバックする.
3: エンティティ,ドメインオブジェクト
4: ドメインサービス
5: Repository
6: アプリケーションサービス
7: 依存
ServiceLocator
IoCContainer
8: UI
ASP.NET Core MVC
9: Factory
採番などの処理をFactoryで行うことができる.
Repositoryに採番を実装するのもすっきりするが,Repositoryの「永続化,再構築」という基本の責務から外れるため筆者は非推奨の立場.
FactoryやRepositoryはドメインに由来するオブジェクトではないが,ドメインを表現するために必要なものであり,ドメインの設計を構成する要素である.
10: 整合性・トランザクション
トランザクションスコープ
筆者はこれを利用することが多いそう.
アスペクト指向プログラミングを用いた例.
ユニットオブワーク
トランザクションは1つのオブジェクトに限定し,そのオブジェクトを小さくすることでロックを小さくするべき.
11: アプリケーションを組み立てる.
ユースケースを確認する.
「サークルを作成する」
「サークルに参加する」
サークルのルールを確認する.
サークル名は3文字以上20文字以下
名前は重複しない
ユーザの最大数は30
サークルのエンティティを実装する.
識別子となるValueObjectを実装する.
サークル名などのValueObjectを実装する.
サークルのエンティティを実装する.
サークルの永続化に必要なRepositoryを用意する.
サークルを生成するFactoryを実装する.
サークルの重複確認を行うドメインサービスを実装する.
ユースケースを組み立てる.
ユースケースごとにCommandを実装する.
CircleCreateCommand
CircleJoinCommand
アプリケーションサービスを実装する.
Create
Join
まとめ: トップダウンで機能を洗い出し,ボトムアップで実装していく.
12: 集約
getterで変数を公開しない.
通知オブジェクトを利用する.
識別子はgetterにすると便利な上,識別子に対してロジックが書かれることも少ないので,公開するメリットも十分ある.
アクセス限定子
エンティティが他のエンティティへの参照を持つときは,識別子の参照を持てば良い.
エンティティ自体を持つと,意図しない操作が可能になってしまうため.
集約が大きいとトランザクションのロックの範囲も大きくなるため,小さく保つべきである.
言葉の齟齬を消すべき.
ownerとmembers合わせて30人以下であるべきなら,members.Count <= 29ではなく,CountMembers() <= 30とするべき.
int CountMembers() => members.Count + 1;
13: 仕様
オブジェクトの評価を行うオブジェクト.
14: アーキテクチャ
レイヤードアーキテクチャ
ヘキサゴナルアーキテクチャ
クリーンアーキテクチャ
15:
ユビキタス言語
コンテキストマップ
ドメイン駆動設計はドメインから設計していくボトムアップのアプローチである.
A: ソリューション構成
レイヤードアーキテクチャにしたがってパッケージを分ける.
プレゼンテーション: ASP.NET Core MVCなどのプロジェクト.
アプリケーション: ユースケースごとに分けるなど. -> クリーンアーキテクチャの考え方.
Circles
Create
Get
Users
Create
ドメイン
Domain
Models: エンティティや値オブジェクト,Factoryやリポジトリ,仕様が含まれる.
Factoryやリポジトリはドメインオブジェクトと同居した方が良い.
Circles
Users
Services: ドメインサービス
Shared: 他のプロジェクトでも利用できるようなもの.
インフラストラクチャ: 技術基盤ごとに分ける.
EntityFramework
Users
Circles
InMemory
Users
Circles
ソリューション構成
ドメインとアプリケーションを別プロジェクトにするかどうかが選択.
別にする
ドメインの再利用性が向上.
アプリケーションがドメインを見るためにドメインのpublicが増える.
同じプロジェクトでやっていく.
ドメインをinternalで公開できる.
#書籍