Entities
Une entity se définit par une identité qui reste stable dans le temps, et par des méthodes métier nommées dans le langage. Ces règles disent quand en créer une, comment l’identifier, comment elle porte un comportement au lieu d’exposer des données, et comment la construire et la valider.
Plusieurs d’entre elles complètent AGG-05 (l’identité de l’aggregate root). La section Voir aussi le signale à chaque fois.
En pratique
Un titulaire de wallet est une entity : il garde son identité pendant que son statut change.
ts
export class Holder extends AggregateRoot<HolderId> {
#status: HolderStatus;
private constructor(id: HolderId, status: HolderStatus) {
super(id);
this.#status = status;
}
static restore(id: HolderId, status: HolderStatus): Holder {
return new Holder(id, status);
}
isActive(): boolean {
return this.#status === 'active';
}
close(at: Date): Result<void, HolderIsClosed> {
if (this.#status === 'closed') {
return err(new HolderIsClosed(this.id));
}
this.#status = 'closed';
this.record<HolderClosed>({ ...eventMetadata(at), type: 'wallets.holder.HolderClosed', holderId: this.id });
return ok();
}
}- L’identité est un value object typé, et ne change jamais (ENT-03, ENT-06).
- Du comportement, pas des données :
closeetisActivesont nommés dans le langage, et il n’y a aucun setter (ENT-10, ENT-11). - Une intention, une méthode, un event : fermer enregistre
HolderClosed(ENT-12).
Règles
Nature d’une entity
| Code | Règle | Sévérité | Détection |
|---|---|---|---|
| ENT-01 | Une entity seulement quand l’identité et le changement comptent | mineure | |
| ENT-02 | Une entity ne porte que ce que ses use cases écrivent ou lisent | question |
Identité
| Code | Règle | Sévérité | Détection |
|---|---|---|---|
| ENT-03 | L’identité est un value object | mineure | |
| ENT-04 | Une identité saisie par l’utilisateur doit être stable | majeure | |
| ENT-05 | L’identité est générée tôt quand elle sert avant la persistance | majeure | |
| ENT-06 | L’identité ne change jamais | majeure | |
| ENT-07 | Deux entities sont égales si leurs identités le sont | mineure | |
| ENT-08 | L’id technique de persistance reste caché | mineure | |
| ENT-09 | En multi-tenant, chaque entity et chaque requête portent l’identité du tenant conditionnelle | bloquante |
Comportement
| Code | Règle | Sévérité | Détection |
|---|---|---|---|
| ENT-10 | Pas d’anemic model | majeure | |
| ENT-11 | Les méthodes du domaine sont nommées dans le langage du métier | mineure | |
| ENT-12 | Une intention, une méthode, un event | majeure | |
| ENT-13 | Les secrets ne sortent pas de l’entity | bloquante |
Construction et validation
| Code | Règle | Sévérité | Détection |
|---|---|---|---|
| ENT-14 | Une entity naît complète | majeure | |
| ENT-15 | Chaque attribut est protégé par une précondition | mineure | |
| ENT-16 | La validation de l’objet entier est à part et collecte toutes les erreurs | mineure |
Historique
| Code | Règle | Sévérité | Détection |
|---|---|---|---|
| ENT-17 | L’historique qui compte pour le métier passe par des domain events | question |