mongolyyのブログ

開発(Javascript, Typescript, React, Next.js)や開発手法(スクラム, アジャイル)、勉強したことについて色々書ければと。

ドメイン駆動設計における「エンティティ」と「値オブジェクト」の違いについて

はじめに

同僚と「ドメインオブジェクトが~~」みたいな話をしていて、「ドメイン駆動におけるドメインオブジェクトの扱いってなんだったっけ?」と思ったことをきっかけに、調べたり、考えたりしました。
また忘れるので書き留めておこうと思います。

本題

ざっくりですが、次のような違いがあると思っています。

  • エンティティ
    • 同一性の概念がある
  • 値オブジェクト
    • 同一性の概念がない

それによって、次のような特徴が生まれてきます

  • エンティティ
    • 同一性を判別するためのキーが存在する
    • キー以外の項目は変更される可能性がある
  • 値オブジェクト
    • 全てのフィールドが同一であれば、振る舞いは同一になるので同一とみなせる
    • 逆にどれかのフィールドが変更されると同一とは見なせないので、不変であるべき
    • String, Intのようなプリミティブな型の代替として、表現力を増すために使われることが多そう

ここからは私見です。
書籍でエンティティも可変となっていますが、"不変であっても良く、むしろそのほうが、バグは発生しにくいのではないか" とも思っています。

参考書籍

終わりに

よく忘れてしまうので、書き留めておきました。
他の特徴があればまた追記しようと思います。