ドメイン駆動設計関連
同じような概念に別の用語が使われていることがあり混乱するのでまとめたい。
よく出てくる単語系
- service
- repository
- use-case
- domain
- domain-model
- domain-service
- application-service
- entity
- infrastructure
- ui
- presentation
- controller
- module
- value-object
- aggregate
参考記事等
エンティティ (Entity)
エンティティとは、コンピュータシステムの内部にあるオブジェクトであり、最重要ビジネスデータを操作する最重要ビジネスルールをいくつか含んだものである。
『Clean Architecture 達人に学ぶソフトウェアの構造と設計』より
ここではビジネスルールを含んでいる(メソッドを持つクラスのようなイメージ)が、データ単体を指してエンティティと呼ぶこともある気がする。
エンティティは、データベース、ユーザーインターフェイス、サードパーティ製のフレームワークについて、何も気にする必要はない。
しばしばDBに格納するデータ構造と一致させてしまう例もあるが、本来的にはこれらは関係ない。
「ビジネスオブジェクト」「ドメインオブジェクト」とも呼べるっぽい。
値オブジェクト (Value object)
エンティティと似て非なる概念。
自身の内容(値)によってのみ識別されるオブジェクト。
jestのマッチャーでいえば、 .toBe
ではなく .toEqual
で識別されるということ。
idプロパティを持たない。
不変性を持って実装される。
DTO
ドメイン
オニオンアーキテクチャのドメイン層、クリーンアーキテクチャのEntities部分。
ビジネスロジック、ビジネスルールなどと呼ばれるコア部分。
フレームワークやデータベースといった周囲の技術選定によって変わらない部分。
ユースケース
ユースケースとは、自動化されたシステムを使用する方法を記述したものである。
ユースケースはエンティティのダンスを制御しているのである。
『Clean Architecture 達人に学ぶソフトウェアの構造と設計』より
エンティティ、およびエンティティの持つロジックを組み合わせたものがユースケース。
ユースケースは、ユーザーインターフェイスについては記述していない。インターフェイスからやってくるデータとそこから出ていくデータを略式で規定しているだけである。ユースケースを見ただけでは、そのアプリケーションがウェブなのか、シッククライアントなのか、コンソールなのか、純粋なサービスなのかを判断することは不可能である。
『Clean Architecture 達人に学ぶソフトウェアの構造と設計』より
Reactアプリケーションでいえば、React固有の機能がユースケース内に登場すべきでない。
「アプリケーションサービス」とも呼ばれる(オニオンアーキテクチャではアプリケーションサービスと呼ばれている)