While modeling an Ubiquitous Language concept in code, you should always favor Value Objects over Entities. Value Objects are easier to create, test, use, and maintain.
Keeping this in mind, you can determine whether the concept in question can be modeled as a Value Object if:
- It measures, quantifies, or describes a thing in the Domain
- It can be kept immutable
- It models a conceptual whole by composing related attributes as an integral unit
- It can be compared with others through value equality
- It is completely replaceable when the measurement or description changes
- It supplies its collaborators with side-effect-free behavior
As discussed before, a Value Object should not be considered just a thing in your Domain. As a value, it measures, quantifies, or describes a concept in the Domain.
In our example, the Currency
object describes what type of Money it is. The Money
object measures or quantifies units of a given currency.