Recentemente ho iniziato a leggere il libro di Evan sul DDD, e ho deciso di provare ad applicare alcuni dei principi di quel libro su un contesto limitato di un progetto su cui ho lavorato.
Il contesto di interesse riguarda la pianificazione degli appuntamenti e degli appuntamenti. Presenterò alcuni dei requisiti aziendali, oltre al modello attuale.
Abbiamo dipendenti, appuntamenti e stanze. Un appuntamento può avere al massimo 1 dipendente per ruolo, ad esempio 1 consulente, 1 medico. Questi dipendenti iniziano e finiscono la loro parte dell'appuntamento in un momento diverso. Ad esempio, un consulente può essere presente da x1 a y1, e un medico può essere presente da x2 a y2 (questi possono sovrapporsi o essere disgiunti). L'appuntamento è considerato per iniziare al più presto xe terminare al più tardi y. Un appuntamento può anche avere solo 1 paziente. Un appuntamento deve svolgersi in una stanza. I dipendenti non possono avere appuntamenti che si sovrappongono (per quanto riguarda i loro orari di inizio e fine). Un appuntamento non può aver luogo in una stanza se quella stanza è occupata per un altro appuntamento.
Questo è il modello che ho trovato:
Oltre alle invarianti precedenti, queste regole aziendali devono essere rispettate: un paziente può avere solo 1 appuntamento programmato in un dato momento (presuppone che ci sia un attributo di stato in Appuntamento).
Il modello dovrebbe supportare i seguenti casi d'uso:
- Pianificazione di un appuntamento.
- Aggiornamento dell'ora di inizio / fine programma di un appuntamento
- Assegnazione di un dipendente diverso a un appuntamento
- Aggiunta / rimozione di appuntamenti da un appuntamento
Ho difficoltà a definire gli aggregati, le loro radici e i loro limiti. Dalle limitazioni date, penso che sia abbastanza ovvio che l'aggregato DailySchedule deve comprendere gli oggetti valore Availability e AppointmentSchedule. Tuttavia, l'appuntamento deve comprendere anche AppointmentSchedule al fine di mantenere invariata la presenza di un solo ruolo di dipendente per ciascun appuntamento. Inoltre, Room e Patient devono entrambi includere Appointment per mantenere invarianti.
Supponendo che l'invariante del paziente possa essere modellato come regola di una politica aziendale / oggetto, ciò lascia comunque DailySchedule e Appointment che condividono un riferimento a un oggetto valore, senza passare per la sua radice aggregata.
Mi sembra che questo modello non consenta limiti di aggregazione chiaramente definiti. Stavo considerando di esporre i SERVIZI per ciascuno dei casi d'uso, che si estenderebbe tra i confini aggregati e manterrebbe gli invarianti da lì. Sono interessato a sapere se c'è qualche altra soluzione, forse più elegante / semplice a questo problema.