Open16
DDDを荒く理解する
このZennの記事を読んでDDDについて荒く理解をする
自分が作っているタスク管理ツールで実践してみる
イベントストリーミングをやってみた
ドメインモデル図を作ってみた
ドメインモデリング
- 特定の問題領域を理解して、それを図に起こしたりモデルを作成する行為のこと
ドメインモデリングの段取り
- コアドメイン、サブドメインの特定
- 境界づけられたコンテキストの定義
- エンティティの特定
- ビジネスルールの把握
ドメインモデリングの手法に決まった方法はない。
手法1:イベントストリーミング
- 複雑なビジネスプロセスやドメインの知識を共有、可視化、そして理解するための共同作業ベースのモデリング手法
- 「ドメインイベント」「ポリシー」「コマンド」「アクター」「ビュー・リードモデル」「集約(エンティティ)」「外部システム」の7つの主要な要素に分解する
手法2:リレーションシップ駆動要件分析(RDRA)
「網羅性」「整合性」「表現力」の3要素を高いレベルで次元するための要件分析フレームワーク
手法3:ユースケース駆動開発
システムの昨日を利用者から見た振る舞いを記述したもの(ユースケース)に分割し、それを元に要件分析から実装までの工程を進めていく手法
イベントストリーミングの要素の関係性
ドメインモデル図
特定のドメインの主要な概念、エンティティ、属性、これらの要素感の関係性を視覚的に表現した図
この記事では、オニオンアーキテクチャを採用している
オニオンアーキテクチャ
- アプリケーションを複数のレイヤーで構成し、それらを円形に配置することを特徴とする
- ドメイン中心の設計。ドメイン層が他の層に依存しないようにする
- レイヤー構造
- ドメイン層
- アプリケーション層
- インフラストラクチャ層
- プレゼンテーション層
値オブジェクト
- エンティティと並びドメインモデル(ドメインオブジェクト)の中心的な要素で、ドメイン内の様々な値の概念をモデル化するのに用いられる
エンティティ
- エンティティと並びドメインモデル(ドメインオブジェクト)の中心的な要素で、ドメイン無いの様々なビジネスの実態の概念をモデル化するのに用いる
集約
- 関連するオブジェクト郡を1つのユニットとして管理するための手法ビジネスルールとデータの整合性を維持するために設計される。集約の設計が適切であれば、データベースに保存されているデータは、ビジネスルールに従って常に一貫性を保つことができる
ドメインサービス
- ドメインモデルの中で、エンティティや値オブジェクトだけえは自然に表現できないビジネスロジックをカプセル化するためのもの
- ドメイン層の中に位置する
ドメインサービスを利用する基準
- 複数集約をまたいだ処理が必要な場合
- DB程度への問い合わせが必要な場合
ドメインサービズを乱用するアンチパターンとかもあるらしい
リポジトリ
- インフラストラクチャ層のオブジェクトで、集約の永続化を抽象化する役割を果たす。
リポジトリの責務
- 集約の永続化
- 集約の復元
ドメイン層がインフラストラクチャ層に依存することを防ぐ役割がある。
アプリケーションサービス
- ユースケースを実現するための操作を提供するサービス。ドメイン層の「エンティティ」「値オブジェクト」「ドメインサービス」などのドメインオブジェクトを利用してユースケースを実現する
TypeScriptで使えるDIコンテナライブラリ