Hello,
Actuellement dans une application Symfony j'ai une entité assez mastoc, qu'on va appeler "Dossier".
Cette entité a plusieurs dizaines d'attributs, et des relations avec une dizaine d'autres entités en oneToMany ou manyToMany.
Ces "Dossiers" peuvent être de 5 types différents, de "A" à "E".
Certains attributs seront différents en fonction du type (immuable) auquel appartient ce Dossier. Par exemple :
- Quand j'affiche le numéro du Dossier avec $dossier->getNumero(), on doit accoler le type de Dossier devant le numéro. Le numéro stocké en BDD, par exemple 18231, doit donc apparaître sous la forme "A18231".
- Quand je demande le service responsable d'un Dossier avec la méthode $dossier->getService(), le résultat doit varier en fonction du type de Dossier, (Service compta pour les Dossiers A, service RH pour les Dossiers B....)
De nombreux comportements sont ainsi basés sur le type du Dossier.
J'ai un dilemme sur la façon de procéder, car plusieurs solutions s'offrent à moi :
1 - Créer une entité "Type" et rajouter ainsi une table dans la BDD pour 5 lignes qui ne bougeront jamais. Ce qui rajoutera en prime une liaison sur ma table principale que je trouve déjà bien chargée. L'avantage que j'y trouve, c'est la facilité de faire des choses comme $dossier->getType()->getService() par exemple.
2 - Stocker ce Type sous forme d'int dans un attribut "typeID", et hardcoder les différents comportements des méthodes avec des switch de partout. Ce qui ne me semble pas terrible niveau lisibilité du code de la classe Dossier.
J'aurais presque pu utiliser des enums (et encore, l'objet Type serait trop dodu pour ça...) mais on est sur une vieille version de PHP.
Si vous avez déjà été confronté à un choix de design de ce genre, je suis preneur de vos retours :)