Principes de conception
Procédural, orienté objet ou fonctionnel
Que dire du paradigme de notre test ?
const booking = book(accommodation, tenant, stay);
expect(booking.status).toBe("confirmed");C'est plutôt fonctionnel.
En programmation orientée objet, on aurait peut-être écrit :
const booking = accommodation.book(tenant, stay);
expect(booking.status).toBe("confirmed");Il n'y a pas de réponse définitive. Chacun code avec le paradigme qu'il maîtrise le mieux.
En revanche, c'est quand même préférable de conserver de la cohérence sur la façon de faire. Mais ne décidons pas maintenant.
Laissons les tests nous guider.
Entités et valeurs
Pour avancer je propose un exercice simple : Séparons ce qui existe déjà dans le système (l'état) et ce qui est éphémère (les paramètres).
L'hébergement accommodation existe déjà.
Il faut qu'il soit créé au départ, pour recevoir de multiples demandes de réservations. Et il a une identité propre, indépendante de ses caractéristiques : si le propriétaire repeint les murs ou ajoute un couchage, c'est toujours le même hébergement. (Par quoi l'identifier ? Son adresse ? Deux appartements d'un même immeuble la partagent. Nous reviendrons sur ce sujet de l'identité.) C'est donc une entité.
Même chose pour l'utilisateur tenant qui effectue une réservation.
C'est une personne qui peut faire plusieurs réservations. Elle a aussi une identité unique (laquelle ? Son numéro de sécurité sociale ? Son email ? Un numéro unique alloué par la plateforme ? Nous reviendrons à ce sujet de l'identité). C'est donc aussi une entité.
Mais quid du détail stay du séjour : dates de début/fin, nombre de personnes ?
C'est une donnée temporaire. Elle ne fait que passer le temps de la demande de réservation. En cas de nouvelle réservation, ce sera avec d'autres paramètres.
Cette donnée n'a pas d'identité.
C'est donc une valeur.
Qu'est-ce que ça change ?
Une entité persiste.
Lorsqu'on se déconnecte de notre plateforme et que l'on revient le lendemain, l'hébergement que l'on avait repéré existe encore (mais peut-être plus disponible aux dates qui nous arrangent).
Une entité est mutable (= modifiable). On la crée, on la modifie, puis on la conserve pour être utilisée et modifiée plus tard.
En revanche, une valeur est éphémère.
Elle n'existe que dans le contexte de la réservation que l'utilisateur est en train de réaliser. Cela ne signifie pas qu'elle ne sera pas enregistrée en base de données. Mais seulement que c'est un paramètre, utilisé à un moment donné, qui n'a pas vocation à être modifié.
Une valeur est immutable. On la crée, on l'utilise, puis on la jette.