La façon dont vous posez la question (et proposez deux alternatives), c'est comme si la seule préoccupation était que le driverId soit toujours valide au moment de la création de la voiture.
Cependant, vous devez également vous inquiéter du fait que le pilote associé à driverId ne soit pas supprimé avant que la voiture soit supprimée ou donnée à un autre pilote (et peut-être aussi que le pilote ne soit pas affecté à une autre voiture (ceci si le domaine restreint un pilote à seulement être associé à une voiture)).
Je suggère qu'au lieu de la validation, vous allouez (ce qui inclurait la validation de la présence). Vous interdirez alors les suppressions pendant qu'elles sont encore allouées, vous protégeant ainsi de la condition de concurrence des données périmées pendant la construction, ainsi que de l'autre problème à plus long terme. (Notez que l'allocation valide et marque à la fois l'allocation et fonctionne atomiquement.)
Btw, je suis d'accord avec @PriceJones que l'association entre la voiture et le conducteur est probablement une responsabilité distincte de la voiture ou du conducteur. Ce type d'association ne fera que croître en complexité au fil du temps, car cela ressemble à un problème de programmation (pilotes, voitures, créneaux horaires / fenêtres, substituts, etc.). Même s'il s'agit plutôt d'un problème d'enregistrement, on peut vouloir l'historique les enregistrements ainsi que les enregistrements en cours. Ainsi, il pourrait très bien mériter sa propre Colombie-Britannique.
Vous pouvez fournir un schéma d'allocation (tel qu'un nombre booléen ou de référence) au sein de la BC des entités agrégées allouées, ou au sein d'une BC distincte, disons, celle responsable de l'association entre voiture et conducteur. Si vous faites le premier, vous pouvez autoriser les opérations de suppression (valides) émises pour la voiture ou le conducteur BC; si vous faites ce dernier, vous devrez empêcher les suppressions des BC voiture et conducteur et les envoyer à la place via le planificateur d'association voiture et conducteur.
Vous pouvez également répartir certaines des responsabilités d'allocation entre les BC comme suit. La voiture et le conducteur BC fournissent chacun un schéma "d'allocation" qui valide et définit le booléen alloué avec ce BC; lorsque leur attribution booléenne est définie, le BC empêche la suppression des entités correspondantes. (Et le système est configuré de sorte que la voiture et le conducteur BC autorisent uniquement l'allocation et la désallocation à partir de la programmation de l'association voiture / conducteur BC.)
Le BC de planification des voitures et des chauffeurs tient ensuite à jour un calendrier des conducteurs associés à la voiture pour certaines périodes / durées, actuelles et futures, et notifie les autres BC de la désallocation uniquement lors de la dernière utilisation d'une voiture ou d'un conducteur programmé.
En tant que solution plus radicale, vous pouvez traiter les BC de voiture et de chauffeur comme des usines d'enregistrement historique uniquement en annexe, laissant la propriété au planificateur d'association de voiture et de conducteur. La voiture BC peut générer une nouvelle voiture, avec tous les détails de la voiture, ainsi que son VIN. La propriété de la voiture est gérée par le planificateur d'association voiture / conducteur. Même si une association voiture / conducteur est supprimée et que la voiture elle-même est détruite, les enregistrements de la voiture existent toujours dans la voiture BC par définition, et nous pouvons utiliser la voiture BC pour rechercher des données historiques; tandis que les associations / propriétaires de voitures / conducteurs (passées, présentes et potentiellement futures prévues) sont gérées par un autre pays bénéficiaire.
Driver.delete
ne devrait pas exister. Je n'ai jamais vraiment vu un domaine où les agrégats sont détruits. En gardant les RA autour de vous, vous ne pouvez jamais vous retrouver avec des orphelins.Il pourrait être utile de demander: Êtes-vous sûr que les voitures sont construites avec des chauffeurs? Je n'ai jamais entendu parler d'une voiture composée d'un conducteur dans le monde réel. La raison pour laquelle cette question est importante est qu'elle peut vous orienter vers la création indépendante de voitures et de conducteurs, puis la création d'un mécanisme externe qui attribue un conducteur à une voiture. Une voiture peut exister sans référence de conducteur et être toujours une voiture valide.
Si une voiture doit absolument avoir un conducteur dans votre contexte, vous voudrez peut-être considérer le modèle de constructeur. Ce modèle sera chargé de s'assurer que les voitures sont construites avec des pilotes existants. Les usines serviront des voitures et des conducteurs validés indépendamment, mais le constructeur s'assurera que la voiture a la référence dont elle a besoin avant de servir la voiture.
la source
Je le pense. La récupération d'un DriverId donné à partir de la base de données renvoie un ensemble vide s'il n'existe pas. Donc, vérifier le résultat du retour rend inutile de demander s'il existe (et de le récupérer).
DriverId
et est défini dans le constructeur.Car
besoin que deDriverId
,Driver.Id
prenez un getter. Pas de passeur.Car
soucie s'il a unDriver
(ou son ID au moins). A seDriver
soucie s'il en aDriverId
. LesRepository
soucis de l'intégrité des données et se moquent des voitures sans conducteur.DriverId
soit un domaine métier est traité dans les classes appropriées.... arrive quand
Repository.DriverIdExists()
pose la question.Créez un objet de domaine. Sinon,
Driver
alors peut-être un objetDriverInfo
(juste unDriverId
etName
, disons). LeDriverId
est validé à la construction. Il doit exister et être du bon type, et quoi que ce soit d'autre. Ensuite, c'est un problème de conception de classe client comment traiter un pilote / driverId inexistant.Peut-être
Car
que ça va sans chauffeur jusqu'à ce que vous appeliezCar.Drive()
. Dans ce cas, l'Car
objet assure bien sûr son propre état. On ne peut pas conduire sansDriver
- enfin pas tout à fait.Bien sûr, ayez un
Car.DriverId
si vous le souhaitez. Mais cela devrait ressembler à ceci:Pas ça:
Maintenant, le
Car
doit traiter de toutes lesDriverId
questions de validité - une violation du principe de responsabilité unique; et le code redondant probablement.la source