Builders Academy
Clean Architecture avec Node.js
2 of 5

Chapitre 1 · Leçon 2

Entity vs Value Object

Les deux briques fondamentales du domaine

Section 1

L'Entity — identité dans le temps

Une Entity est un objet dont l'identité persiste même si ses attributs changent.

Step 1

Définition

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

typescript
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

Anemic vs Rich

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.

Entity.ts

typescript
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}

Section 2

Le Value Object — égalité par valeur

Un Value Object n'a pas d'identité. Deux instances avec les mêmes valeurs sont identiques.

Step 3

Exemple : Email

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.

Entity.ts

typescript
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}

Topics and skills covered

  • DDD
  • Rich Models