Per il tuo primo caso, devi semplicemente riformulare "cancella tutti i passi a nord del confine canadese" per "eliminare tutti i passi dove y > latitude of border
" o qualcosa di leggermente più sofisticato. In che modo un ID per ogni Footstep
può anche aiutare con il processo sopra riportato? Sei ancora lasciato a capire quali ID corrispondono a un passo a nord del confine.
Per il tuo secondo caso, un Issue
non si chiude da solo. Milestone
funge da aggregato per un gruppo di Issue
. Come tale ogni Milestone
chiude (e apre) i propri problemi. Questo ha senso in termini di flusso comunque? Milestone.OpenIssue
sembra essere il modo più indicativo per creare un nuovo Issue
. In termini di spazio di archiviazione, anziché la tua tabella "Issue"
con una sorta di campo [status]
(che indica "OPEN", "CLOSED", "PENDING", ecc.), Dovresti invece memorizzare [status]
su una tabella di join tra "Milestone"
e "Issue"
.
Affettare i dati verticalmente come questo è una tattica estremamente potente e importante quando si modella un dominio. È importante identificare il tuo sistema in termini di comportamento , non solo di dati. In questo caso abbiamo scoperto, attraverso una conoscenza minima del crunch, che un Issue
non ha una proprietà status
!
Gli eventi di dominio sono i più utilizzati per gestire il processo, non per sincronizzare lo stato (ad esempio% evento diUserCreated
è gestito dal tuo EmailService
per inviare un messaggio di benvenuto). Una volta che inizierai a cercare di gestire / sincronizzare lo stato con gli eventi, il tuo sistema diventerà inevitabilmente piuttosto complesso e difficile da comprendere. Lo scopo di DDD è creare sistemi facili da modificare e un sistema che non può essere compreso non può essere modificato.
Quanto sopra non è una regola . Naturalmente ci possono essere situazioni in cui si desidera mantenere lo stato sincronizzato (ad esempio mantenendo aggiornati i modelli di lettura denormalizzati), ma provare il meglio in assoluto per evitare questo tipo di ginnastica nel modello di scrittura e cercare sempre strategie alternative.