Chapitre 1 · Leçon 2
Les deux briques fondamentales du domaine
Section 1
Une Entity est un objet dont l'identité persiste même si ses attributs changent.
Step 1
Un utilisateur est une Entity : même s'il change de nom ou d'email, c'est le même utilisateur. Son identité est portée par un id unique, pas par ses attributs.
Entity.ts
1export abstract class Entity<T extends object> {
2 protected readonly _id: string;
3 protected props: T;
4
5 constructor(props: T, id?: string) {
6 this._id = id ?? randomUUID();
7 this.props = props;
8 }
9
10 equals(other?: Entity<T>): boolean {
11 return this._id === other?._id;
12 }
13}Step 2
Un Anemic Model est une Entity sans comportement — juste des getters/setters. Un Rich Model encapsule les règles métier : user.changeEmail() valide, émet un event, met à jour updatedAt. La logique vit dans le domaine, pas dans des services.
Section 2
Un Value Object n'a pas d'identité. Deux instances avec les mêmes valeurs sont identiques.
Step 3
Un Email est un Value Object : Email('a@b.com') et Email('a@b.com') sont identiques. Il embarque sa propre validation — impossible de créer un Email invalide.