コンテンツにスキップ

エンティティ

starlightBlog.tags.count

DDD の値オブジェクト・エンティティ記事を追加しました

DDD の基本要素である 値オブジェクトエンティティ について、概念と Kotlin での実装例を整理したドキュメントを追加しました。

DDD を学ぶうえで、値オブジェクトとエンティティの違いは最初につまずきやすいポイントだと感じています。
どちらもドメインオブジェクトですが、同一性の考え方や状態変化の扱い方が異なるため、具体例を交えながら整理しました。

DDD の説明では「エンティティは ID で識別する」「値オブジェクトは値で比較する」といった説明がよく出てきます。
ただ、自分が学び始めたときは、その説明だけでは実際のコードにどう落とし込めばよいのかが少し分かりにくく感じていました。

たとえば、ユーザー名や住所のような情報をただの String として扱うのか、それとも専用の型として扱うのか。
注文やユーザーのように状態が変わるものを data class で表現してよいのか。
こうした判断は、概念を知っているだけでは迷いやすい部分だと思います。

今回追加した記事では、まず値オブジェクトとエンティティの考え方を整理し、そのうえで Kotlin のコード例までつなげる構成にしました。
DDD の用語を覚えるだけでなく、「では実装ではどう書くのか」まで確認できるようにしています。

値オブジェクトの記事では、住所・金額・ユーザー ID のような例を使いながら、値そのものに意味があるデータ をどう表現するかを整理しています。

単に StringInt を使うと、どの値が何を表しているのかがコードから読み取りにくくなります。
値オブジェクトとして専用の型を作ることで、意味を型に閉じ込めたり、不正な値を生成時に防いだりできます。

Kotlin の実装例では、単一プロパティの値オブジェクトと複数プロパティの値オブジェクトを分けて扱っています。
また、@JvmInline value classdata class の違いについても別記事にして、どちらを選ぶべきか判断しやすいようにしました。

エンティティの記事では、ユーザーや注文のように、属性が変わっても同じものとして扱うべきオブジェクト を整理しています。

エンティティで重要なのは、同一性を属性の一致ではなく ID で判断することです。
たとえば住所や名前が変わっても、同じユーザー ID を持っていれば同じユーザーとして扱います。

Kotlin の実装例では、data class の自動生成される equals / hashCode をそのまま使うと、エンティティの同一性とずれてしまう点にも触れています。
状態変更を外部から直接書き換えるのではなく、ドメインメソッドとして表現する書き方もまとめました。

まずは エンティティ値オブジェクト の概念記事を読むのがおすすめです。
この 2 つで「ID で区別するもの」と「値で判断するもの」の違いをつかんでから、Kotlin の実装例に進むと理解しやすいと思います。

その後、値オブジェクトを Kotlin で書くときに @JvmInline value classdata class のどちらを使うか迷ったら、value class と data class の違い を読む流れを想定しています。

今回の記事で、DDD の基本的なドメインオブジェクトである値オブジェクトとエンティティを一通り整理できました。

今後は、集約・リポジトリ・ドメインサービスなど、値オブジェクトやエンティティを組み合わせて設計する部分も少しずつまとめていきたいと考えています。
特に、実装時に「これはエンティティに書くべきか」「ドメインサービスに切り出すべきか」と迷いやすい部分は、自分の理解の整理も兼ねて記事にしていく予定です。

DDD 関連の記事は、引き続き実務で使う知識を自分の言葉で整理しながら充実させていきます。